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
35 * append a char to a string buffer
37 static void str_append_char(void *object, size_t n, char ch)
44 strncat(object, buf, n);
48 * append a string to a string buffer
50 static void str_append_str(void *object, size_t n, const char *str)
52 strncat(object, str, n);
56 * append a char to a file
58 static void file_append_char(void *object, size_t n, char ch)
64 * append a string to a file
66 static void file_append_str(void *object, size_t n, const char *str)
74 static const appender_t file_appender = {
80 * the string buffer appender
82 static const appender_t str_appender = {
87 static void ir_common_vprintf(const appender_t *app, void *object,
88 size_t limit, const char *fmt, va_list args);
90 static INLINE void ir_common_printf(const appender_t *app, void *object,
91 size_t limit, const char *fmt, ...)
96 ir_common_vprintf(app, object, limit, fmt, args);
101 * A small printf helper routine for ir nodes.
102 * @param app An appender (this determines where the stuff is dumped
104 * @param object A target passed to the appender.
105 * @param limit The maximum number of characters to dump.
106 * @param fmt The format string.
107 * @param args A va_list.
109 static void ir_common_vprintf(const appender_t *app, void *object,
110 size_t limit, const char *fmt, va_list args)
115 #define DUMP_STR(s) app->append_str(object, limit, s)
116 #define DUMP_CH(ch) app->append_char(object, limit, ch)
118 for(i = 0, n = strlen(fmt); i < n; ++i) {
122 char next_ch = fmt[++i];
124 /* Clear the temporary buffer */
132 DUMP_STR(va_arg(args, const char *));
136 DUMP_STR(get_id_str(va_arg(args, ident *)));
140 DUMP_STR(get_entity_name(va_arg(args, entity *)));
144 DUMP_STR(get_entity_ldname(va_arg(args, entity *)));
148 snprintf(buf, sizeof(buf), "%p", va_arg(args, void *));
152 tarval_snprintf(buf, sizeof(buf), va_arg(args, tarval *));
157 ir_node *irn = va_arg(args, ir_node *);
158 snprintf(buf, sizeof(buf), "%s%s:%ld",
159 get_irn_opname(irn), get_mode_name(get_irn_mode(irn)), get_irn_node_nr(irn));
164 DUMP_STR(get_irn_opname(va_arg(args, ir_node *)));
168 snprintf(buf, sizeof(buf), "%ld", get_irn_node_nr(va_arg(args, ir_node *)));
172 DUMP_STR(get_mode_name(va_arg(args, ir_mode *)));
176 snprintf(buf, sizeof(buf), "%ld",
177 get_irn_node_nr(get_nodes_block(va_arg(args, ir_node *))));
182 iterator_t *it = va_arg(args, iterator_t *);
183 void *collection = va_arg(args, void *);
185 const char *prefix = "";
186 char format = fmt[++i];
187 ir_printf_cb_t *cb = format == 'C' ? va_arg(args, ir_printf_cb_t *) : NULL;
189 assert(is_iterator(it) && "Pass an iterator interface and the collection");
191 snprintf(buf, sizeof(buf), "%%%c", format);
194 for(curr = it->start(collection); curr; curr = it->next(collection, curr)) {
198 cb(app, object, limit, curr);
200 ir_common_printf(app, object, limit, buf, curr);
204 it->finish(collection, curr);
209 /* clean the buffer again */
214 /* Dump the temporary buffer, if something is in it. */
228 * Convencience for stdout dumping.
230 void ir_printf(const char *fmt, ...)
234 ir_common_vprintf(&file_appender, stdout, 0, fmt, args);
239 * Convencience for file dumping.
241 void ir_fprintf(FILE *f, const char *fmt, ...)
245 ir_common_vprintf(&file_appender, f, 0, fmt, args);
250 * Convencience for string dumping.
252 void ir_snprintf(char *buf, size_t len, const char *fmt, ...)
256 ir_common_vprintf(&str_appender, buf, len, fmt, args);