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
39 * append a char to a string buffer
41 static void str_append_char(void *object, size_t n, char ch)
48 strncat(object, buf, n);
52 * append a string to a string buffer
54 static void str_append_str(void *object, size_t n, const char *str)
56 strncat(object, str, n);
60 * append a char to a file
62 static void file_append_char(void *object, size_t n, char ch)
68 * append a string to a file
70 static void file_append_str(void *object, size_t n, const char *str)
78 static const appender_t file_appender = {
84 * the string buffer appender
86 static const appender_t str_appender = {
91 static void ir_common_vprintf(const appender_t *app, void *object,
92 size_t limit, const char *fmt, va_list args);
94 static INLINE void ir_common_printf(const appender_t *app, void *object,
95 size_t limit, const char *fmt, ...)
100 ir_common_vprintf(app, object, limit, fmt, args);
105 * A small printf helper routine for ir nodes.
106 * @param app An appender (this determines where the stuff is dumped
108 * @param object A target passed to the appender.
109 * @param limit The maximum number of characters to dump.
110 * @param fmt The format string.
111 * @param args A va_list.
113 static void ir_common_vprintf(const appender_t *app, void *object,
114 size_t limit, const char *fmt, va_list args)
119 #define DUMP_STR(s) app->append_str(object, limit, s)
120 #define DUMP_CH(ch) app->append_char(object, limit, ch)
122 for(i = 0, n = strlen(fmt); i < n; ++i) {
126 char next_ch = fmt[++i];
128 /* Clear the temporary buffer */
136 DUMP_STR(va_arg(args, const char *));
140 DUMP_STR(get_id_str(va_arg(args, ident *)));
144 DUMP_STR(get_entity_name(va_arg(args, entity *)));
148 DUMP_STR(get_entity_ld_name(va_arg(args, entity *)));
152 snprintf(buf, sizeof(buf), "%p", va_arg(args, void *));
156 tarval_snprintf(buf, sizeof(buf), va_arg(args, tarval *));
161 ir_node *irn = va_arg(args, ir_node *);
162 snprintf(buf, sizeof(buf), "%s%s:%ld",
163 get_irn_opname(irn), get_mode_name(get_irn_mode(irn)), get_irn_node_nr(irn));
168 DUMP_STR(get_irn_opname(va_arg(args, ir_node *)));
172 snprintf(buf, sizeof(buf), "%ld", get_irn_node_nr(va_arg(args, ir_node *)));
176 DUMP_STR(get_mode_name(va_arg(args, ir_mode *)));
180 snprintf(buf, sizeof(buf), "%ld",
181 get_irn_node_nr(get_nodes_block(va_arg(args, ir_node *))));
186 iterator_t *it = va_arg(args, iterator_t *);
187 void *collection = va_arg(args, void *);
189 const char *prefix = "";
190 char format = fmt[++i];
191 ir_printf_cb_t *cb = format == 'C' ? va_arg(args, ir_printf_cb_t *) : NULL;
193 assert(is_iterator(it) && "Pass an iterator interface and the collection");
195 snprintf(buf, sizeof(buf), "%%%c", format);
198 for(curr = it->start(collection); curr; curr = it->next(collection, curr)) {
202 cb(app, object, limit, curr);
204 ir_common_printf(app, object, limit, buf, curr);
208 it->finish(collection, curr);
213 /* clean the buffer again */
218 /* Dump the temporary buffer, if something is in it. */
232 * Convencience for stdout dumping.
234 void ir_printf(const char *fmt, ...)
238 ir_common_vprintf(&file_appender, stdout, 0, fmt, args);
243 * Convencience for file dumping.
245 void ir_fprintf(FILE *f, const char *fmt, ...)
249 ir_common_vprintf(&file_appender, f, 0, fmt, args);
254 * Convencience for string dumping.
256 void ir_snprintf(char *buf, size_t len, const char *fmt, ...)
260 ir_common_vprintf(&str_appender, buf, len, fmt, args);