2 * A little printf helper funterstanding firm types.
3 * @author Sebastian Hack
20 static void str_append_char(void *object, size_t n, char ch)
27 strncat(object, buf, n);
30 static void str_append_str(void *object, size_t n, const char *str)
32 strncat(object, str, n);
35 static void file_append_char(void *object, size_t n, char ch)
40 static void file_append_str(void *object, size_t n, const char *str)
45 static const appender_t file_appender = {
50 static const appender_t str_appender = {
55 static void ir_common_vprintf(const appender_t *app, void *object,
56 size_t limit, const char *fmt, va_list args);
58 static INLINE void ir_common_printf(const appender_t *app, void *object,
59 size_t limit, const char *fmt, ...)
64 ir_common_vprintf(app, object, limit, fmt, args);
69 * A small printf helper routine for ir nodes.
70 * @param app An appender (this determines where the stuff is dumped
72 * @param object A target passed to the appender.
73 * @param limit The maximum number of characters to dump.
74 * @param fmt The format string.
75 * @param args A va_list.
77 static void ir_common_vprintf(const appender_t *app, void *object,
78 size_t limit, const char *fmt, va_list args)
83 #define DUMP_STR(s) app->append_str(object, limit, s)
84 #define DUMP_CH(ch) app->append_char(object, limit, ch)
86 for(i = 0, n = strlen(fmt); i < n; ++i) {
90 char next_ch = fmt[++i];
92 /* Clear the temporary buffer */
100 DUMP_STR(va_arg(args, const char *));
104 snprintf(buf, sizeof(buf), "%p", va_arg(args, void *));
108 tarval_snprintf(buf, sizeof(buf), va_arg(args, tarval *));
113 ir_node *irn = va_arg(args, ir_node *);
114 snprintf(buf, sizeof(buf), "%s%s:%ld",
115 get_irn_opname(irn), get_mode_name(get_irn_mode(irn)), get_irn_node_nr(irn));
120 DUMP_STR(get_irn_opname(va_arg(args, ir_node *)));
124 snprintf(buf, sizeof(buf), "%ld", get_irn_node_nr(va_arg(args, ir_node *)));
128 DUMP_STR(get_mode_name(va_arg(args, ir_mode *)));
132 snprintf(buf, sizeof(buf), "%ld",
133 get_irn_node_nr(get_nodes_block(va_arg(args, ir_node *))));
138 iterator_t *it = va_arg(args, iterator_t *);
139 void *collection = va_arg(args, void *);
141 const char *prefix = "";
142 char format = fmt[++i];
143 ir_printf_cb_t *cb = format == 'C' ? va_arg(args, ir_printf_cb_t *) : NULL;
145 assert(is_iterator(it) && "Pass an iterator interface and the collection");
147 snprintf(buf, sizeof(buf), "%%%c", format);
150 for(curr = it->start(collection); curr; curr = it->next(collection, curr)) {
154 cb(app, object, limit, curr);
156 ir_common_printf(app, object, limit, buf, curr);
160 it->finish(collection, curr);
165 /* clean the buffer again */
170 /* Dump the temporary buffer, if something is in it. */
184 * Convencience for stdout dumping.
186 void ir_printf(const char *fmt, ...)
190 ir_common_vprintf(&file_appender, stdout, 0, fmt, args);
195 * Convencience for file dumping.
197 void ir_fprintf(FILE *f, const char *fmt, ...)
201 ir_common_vprintf(&file_appender, f, 0, fmt, args);
206 * Convencience for string dumping.
208 void ir_snprintf(char *buf, size_t len, const char *fmt, ...)
212 ir_common_vprintf(&str_appender, buf, len, fmt, args);