2 * A little printf helper funterstanding firm types.
3 * @author Sebastian Hack
17 * Something that can append strings and chars to somewhere.
19 typedef struct _appender_t {
20 void (*append_char)(void *subject, size_t n, char ch);
21 void (*append_str)(void *subject, size_t n, const char *str);
24 static void str_append_char(void *subject, size_t n, char ch)
31 strncat(subject, buf, n);
34 static void str_append_str(void *subject, size_t n, const char *str)
36 strncat(subject, str, n);
39 static void file_append_char(void *subject, size_t n, char ch)
44 static void file_append_str(void *subject, size_t n, const char *str)
49 static const appender_t file_appender = {
54 static const appender_t str_appender = {
61 * A small printf helper routine for ir nodes.
62 * @param app An appender (this determines where the stuff is dumped
64 * @param subject A target passed to the appender.
65 * @param limit The maximum number of characters to dump.
66 * @param fmt The format string.
67 * @param args A va_list.
69 static void ir_common_vprintf(const appender_t *app, void *subject,
70 size_t limit, const char *fmt, va_list args)
75 #define DUMP_STR(s) app->append_str(subject, limit, s)
76 #define DUMP_CH(ch) app->append_char(subject, limit, ch)
78 for(i = 0, n = strlen(fmt); i < n; ++i) {
82 char next_ch = fmt[++i];
84 /* Clear the temporary buffer */
92 DUMP_STR(va_arg(args, const char *));
96 snprintf(buf, sizeof(buf), "%p", va_arg(args, void *));
100 tarval_snprintf(buf, sizeof(buf), va_arg(args, tarval *));
105 ir_node *irn = va_arg(args, ir_node *);
106 snprintf(buf, sizeof(buf), "%s%s:%ld",
107 get_irn_opname(irn), get_mode_name(get_irn_mode(irn)), get_irn_node_nr(irn));
112 DUMP_STR(get_irn_opname(va_arg(args, ir_node *)));
116 snprintf(buf, sizeof(buf), "%ld", get_irn_node_nr(va_arg(args, ir_node *)));
120 DUMP_STR(get_mode_name(va_arg(args, ir_mode *)));
124 snprintf(buf, sizeof(buf), "%ld",
125 get_irn_node_nr(get_nodes_block(va_arg(args, ir_node *))));
129 /* Dump the temporary buffer, if something is in it. */
143 * Convencience for stdout dumping.
145 void ir_printf(const char *fmt, ...)
149 ir_common_vprintf(&file_appender, stdout, 0, fmt, args);
154 * Convencience for file dumping.
156 void ir_fprintf(FILE *f, const char *fmt, ...)
160 ir_common_vprintf(&file_appender, f, 0, fmt, args);
165 * Convencience for string dumping.
167 void ir_snprintf(char *buf, size_t len, const char *fmt, ...)
171 ir_common_vprintf(&str_appender, buf, len, fmt, args);