2 libcore: library for basic data structures and algorithms.
3 Copyright (C) 2005 IPD Goos, Universit"at Karlsruhe, Germany
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 #include "lc_defines.h"
26 #include "lc_printf.h"
28 /* Default appendable implementations */
30 int lc_appendable_snwadd(lc_appendable_t *app, const char *str, size_t len,
31 unsigned int width, int left_just, char pad)
35 size_t to_pad = width > len ? width - len : 0;
37 /* If not left justified, pad left */
38 for (i = 0; !left_just && i < to_pad; ++i)
39 res += lc_appendable_chadd(app, pad);
41 /* Send the visible portion of the string to the output. */
42 res += lc_appendable_snadd(app, str, len);
44 /* If left justified, pad right. */
45 for (i = 0; left_just && i < to_pad; ++i)
46 res += lc_appendable_chadd(app, pad);
52 void lc_appendable_init(lc_appendable_t *env, const lc_appendable_funcs_t *app,
53 void *obj, size_t limit)
63 static void default_init(lc_appendable_t *env)
68 static void default_finish(lc_appendable_t *env)
77 static int file_snadd(lc_appendable_t *obj, const char *str, size_t n)
80 fwrite(str, sizeof(char), n, (FILE*)obj->obj);
84 static int file_chadd(lc_appendable_t *obj, int ch)
86 fputc(ch, (FILE*)obj->obj);
91 static lc_appendable_funcs_t app_file = {
98 const lc_appendable_funcs_t *lc_appendable_file = &app_file;
105 static void str_init(lc_appendable_t *obj)
107 strncpy((char*)obj->obj, "", obj->limit);
110 static int str_snadd(lc_appendable_t *obj, const char *str, size_t n)
112 size_t to_write = LC_MIN(obj->limit - obj->written - 1, n);
113 char *tgt = (char*)obj->obj;
114 strncpy(tgt + obj->written, str, to_write);
115 obj->written += to_write;
119 static int str_chadd(lc_appendable_t *obj, int ch)
121 if (obj->limit - obj->written > 1) {
122 char *tgt = (char*)obj->obj;
123 tgt[obj->written++] = (char) ch;
130 static void str_finish(lc_appendable_t *obj)
132 char *str = (char*)obj->obj;
133 str[obj->written] = '\0';
136 static lc_appendable_funcs_t app_string = {
143 const lc_appendable_funcs_t *lc_appendable_string = &app_string;
149 static int obst_snadd(lc_appendable_t *obj, const char *str, size_t n)
151 struct obstack *obst = (struct obstack*)obj->obj;
153 obstack_grow(obst, str, n);
157 static int obst_chadd(lc_appendable_t *obj, int ch)
159 struct obstack *obst = (struct obstack*)obj->obj;
160 obstack_1grow(obst, (char) ch);
165 static lc_appendable_funcs_t app_obstack = {
172 const lc_appendable_funcs_t *lc_appendable_obstack = &app_obstack;