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
24 * @author Sebastian Hack
28 #ifndef _LIBCORE_XPRINTF_H
29 #define _LIBCORE_XPRINTF_H
41 #include <libcore/lc_config.h>
42 #include <libcore/lc_appendable.h>
44 typedef struct _lc_arg_occ_t {
45 int width; /**< The width, or 0 if not given. */
46 int precision; /**< The precision, or 0 if not given */
48 const char *modifier; /**< A string of of modifiers preceding the
49 conversion specifier. Attention: This string is not
50 zero terminated. Use @c modifier_length to get the
51 number of valid chars in it. */
52 size_t modifier_length; /**< The number of valid chars in @c modifier. */
53 char conversion; /**< The conversion specifier. */
54 int lc_arg_type; /**< The type of the argument as determined by the
55 @c get_lc_arg_type member function of the handler. */
57 unsigned flag_hash : 1; /**< @c # flag was seen. */
58 unsigned flag_zero : 1; /**< @c 0 flag was seen. */
59 unsigned flag_minus : 1; /**< @c - flag was seen. */
60 unsigned flag_plus : 1; /**< @c + flag was seen. */
61 unsigned flag_space : 1; /**< A space flag was seen. */
65 * A value from the ... arguments of the printf function.
66 * Look at the file 'xprintf_lc_arg_types.def'. The second argument of the
67 * @c ARG_TYPE macro is the name of the union member preceded by $c v_
70 #define LC_ARG_TYPE(type,name) type v_ ## name;
71 #include "lc_printf_arg_types.def"
76 #define LC_ARG_TYPE(type,name) lc_arg_type_ ## name,
77 #include "lc_printf_arg_types.def"
82 typedef struct _lc_arg_handler {
83 int (*get_lc_arg_type)(const lc_arg_occ_t *occ);
84 int (*emit)(lc_appendable_t *app, const lc_arg_occ_t *occ, const lc_arg_value_t *arg);
87 typedef struct _lc_arg_env_t lc_arg_env_t;
89 lc_arg_env_t *lc_arg_new_env(void);
90 void lc_arg_free_env(lc_arg_env_t *env);
91 lc_arg_env_t *lc_arg_get_default_env(void);
93 int lc_arg_register(lc_arg_env_t *env, const char *name, char letter, const lc_arg_handler_t *handler);
94 void lc_arg_unregister(lc_arg_env_t *env, const char *name);
96 lc_arg_env_t *lc_arg_add_std(lc_arg_env_t *env);
98 int lc_arg_append(lc_appendable_t *app, const lc_arg_occ_t *occ, const char *str, size_t len);
100 int lc_epprintf(const lc_arg_env_t *env, lc_appendable_t *app, const char *fmt, ...);
101 int lc_evpprintf(const lc_arg_env_t *env, lc_appendable_t *app, const char *fmt, va_list args);
102 int lc_pprintf(lc_appendable_t *app, const char *fmt, ...);
103 int lc_vpprintf(lc_appendable_t *app, const char *fmt, va_list args);
105 int lc_eprintf(const lc_arg_env_t *env, const char *fmt, ...);
106 int lc_esnprintf(const lc_arg_env_t *env, char *buf, size_t len, const char *fmt, ...);
107 int lc_efprintf(const lc_arg_env_t *env, FILE *file, const char *fmt, ...);
108 int lc_eoprintf(const lc_arg_env_t *env, struct obstack *obst, const char *fmt, ...);
110 int lc_evprintf(const lc_arg_env_t *env, const char *fmt, va_list args);
111 int lc_evsnprintf(const lc_arg_env_t *env, char *buf, size_t len, const char *fmt, va_list args);
112 int lc_evfprintf(const lc_arg_env_t *env, FILE *f, const char *fmt, va_list args);
113 int lc_evoprintf(const lc_arg_env_t *env, struct obstack *obst, const char *fmt, va_list args);
115 int lc_printf(const char *fmt, ...);
116 int lc_snprintf(char *buf, size_t len, const char *fmt, ...);
117 int lc_fprintf(FILE *f, const char *fmt, ...);
118 int lc_oprintf(struct obstack *obst, const char *fmt, ...);
120 int lc_vprintf(const char *fmt, va_list args);
121 int lc_vsnprintf(char *buf, size_t len, const char *fmt, va_list args);
122 int lc_vfprintf(FILE *f, const char *fmt, va_list args);
123 int lc_voprintf(struct obstack *obst, const char *fmt, va_list args);
130 #endif /* _LIBCORE_XPRINTF_H */