3 * File name: ir/ir/irprintf.c
4 * Purpose: A little printf helper unterstanding firm types
5 * Author: Sebastian Hack
8 * Copyright: (c) 1998-2004 Universität Karlsruhe
9 * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
15 * A little printf helper unterstanding firm types.
16 * @author Sebastian Hack
42 * append a char to a string buffer
44 static void str_append_char(void *object, size_t n, char ch)
51 strncat(object, buf, n);
55 * append a string to a string buffer
57 static void str_append_str(void *object, size_t n, const char *str)
59 strncat(object, str, n);
63 * append a char to a file
65 static void file_append_char(void *object, size_t n, char ch)
71 * append a string to a file
73 static void file_append_str(void *object, size_t n, const char *str)
81 static const appender_t file_appender = {
87 * the string buffer appender
89 static const appender_t str_appender = {
94 static void ir_common_vprintf(const appender_t *app, void *object,
95 size_t limit, const char *fmt, va_list args);
97 static INLINE void ir_common_printf(const appender_t *app, void *object,
98 size_t limit, const char *fmt, ...)
103 ir_common_vprintf(app, object, limit, fmt, args);
108 * A small printf helper routine for ir nodes.
109 * @param app An appender (this determines where the stuff is dumped
111 * @param object A target passed to the appender.
112 * @param limit The maximum number of characters to dump.
113 * @param fmt The format string.
114 * @param args A va_list.
116 static void ir_common_vprintf(const appender_t *app, void *object,
117 size_t limit, const char *fmt, va_list args)
122 #define DUMP_STR(s) app->append_str(object, limit, s)
123 #define DUMP_CH(ch) app->append_char(object, limit, ch)
125 for(i = 0, n = strlen(fmt); i < n; ++i) {
129 char next_ch = fmt[++i];
131 /* Clear the temporary buffer */
139 DUMP_STR(va_arg(args, const char *));
143 DUMP_STR(get_id_str(va_arg(args, ident *)));
147 DUMP_STR(get_entity_name(va_arg(args, entity *)));
151 DUMP_STR(get_entity_ld_name(va_arg(args, entity *)));
155 snprintf(buf, sizeof(buf), "%p", va_arg(args, void *));
159 tarval_snprintf(buf, sizeof(buf), va_arg(args, tarval *));
164 ir_node *irn = va_arg(args, ir_node *);
165 snprintf(buf, sizeof(buf), "%s%s:%ld",
166 get_irn_opname(irn), get_mode_name(get_irn_mode(irn)), get_irn_node_nr(irn));
171 DUMP_STR(get_irn_opname(va_arg(args, ir_node *)));
175 snprintf(buf, sizeof(buf), "%ld", get_irn_node_nr(va_arg(args, ir_node *)));
179 DUMP_STR(get_mode_name(va_arg(args, ir_mode *)));
183 snprintf(buf, sizeof(buf), "%ld",
184 get_irn_node_nr(get_nodes_block(va_arg(args, ir_node *))));
189 iterator_t *it = va_arg(args, iterator_t *);
190 void *collection = va_arg(args, void *);
192 const char *prefix = "";
193 char format = fmt[++i];
194 ir_printf_cb_t *cb = format == 'C' ? va_arg(args, ir_printf_cb_t *) : NULL;
196 assert(is_iterator(it) && "Pass an iterator interface and the collection");
198 snprintf(buf, sizeof(buf), "%%%c", format);
201 for(curr = it->start(collection); curr; curr = it->next(collection, curr)) {
205 cb(app, object, limit, curr);
207 ir_common_printf(app, object, limit, buf, curr);
211 it->finish(collection, curr);
216 /* clean the buffer again */
221 /* Dump the temporary buffer, if something is in it. */
235 * Convencience for stdout dumping.
237 void ir_printf(const char *fmt, ...)
241 ir_common_vprintf(&file_appender, stdout, 0, fmt, args);
246 * Convencience for file dumping.
248 void ir_fprintf(FILE *f, const char *fmt, ...)
252 ir_common_vprintf(&file_appender, f, 0, fmt, args);
257 * Convencience for string dumping.
259 void ir_snprintf(char *buf, size_t len, const char *fmt, ...)
263 ir_common_vprintf(&str_appender, buf, len, fmt, args);