#ifdef HAVE_STRING_H
#include <string.h>
#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
+#include "firm_config.h"
#include "ident.h"
#include "irmode_t.h"
#include "irnode_t.h"
#include "entity_t.h"
+#include "type_t.h"
#include "tv.h"
#include "irprintf.h"
+#include "obst.h"
#include "pset.h"
#include "iterator.h"
+#include "bitset.h"
+#define STRNIL "(nil)"
/**
- * append a char to a string buffer
+ * Init the string.
+ */
+static void str_init(void *object, size_t n)
+{
+ strcpy(object, "");
+}
+
+/**
+ * append a char to a string buffer.
*/
static void str_append_char(void *object, size_t n, char ch)
{
}
/**
- * append a string to a string buffer
+ * append a string to a string buffer.
*/
static void str_append_str(void *object, size_t n, const char *str)
{
strncat(object, str, n);
}
+
+/**
+ * Init the file. i.e. do nothing.
+ */
+static void file_init(void *object, size_t n)
+{
+}
+
/**
- * append a char to a file
+ * append a char to a file.
*/
static void file_append_char(void *object, size_t n, char ch)
{
}
/**
- * append a string to a file
+ * append a string to a file.
*/
static void file_append_str(void *object, size_t n, const char *str)
{
fputs(str, object);
}
+/**
+ * Init the obstack. i.e. do nothing.
+ */
+static void obst_init(void *object, size_t n)
+{
+}
+
+/**
+ * append a char to a obstack.
+ */
+static void obst_append_char(void *object, size_t n, char ch)
+{
+ struct obstack *obst = object;
+ obstack_1grow(obst, ch);
+}
+
+/**
+ * append a string to a obstack.
+ */
+static void obst_append_str(void *object, size_t n, const char *str)
+{
+ struct obstack *obst = object;
+ obstack_grow(obst, str, strlen(str));
+}
+
+
/**
* the file appender
*/
static const appender_t file_appender = {
+ file_init,
file_append_char,
file_append_str
};
* the string buffer appender
*/
static const appender_t str_appender = {
+ str_init,
str_append_char,
str_append_str
};
+/**
+ * the obstack appender.
+ */
+static const appender_t obst_appender = {
+ obst_init,
+ obst_append_char,
+ obst_append_str
+};
+
+#ifndef WITH_LIBCORE
+
static void ir_common_vprintf(const appender_t *app, void *object,
size_t limit, const char *fmt, va_list args);
int alternate;
};
+/* Length specifiers. */
+enum {
+ len_char,
+ len_short,
+ len_int,
+ len_long,
+ len_long_long
+};
+
+
#define MIN(x,y) ((x) < (y) ? (x) : (y))
#define MAX(x,y) ((x) > (y) ? (x) : (y))
-
static void dump_with_settings(const appender_t *app, void *object, size_t limit,
const struct settings *settings, const char *str)
{
if(settings->width >= 0) {
int i;
size_t n = strlen(str);
- int lim = MIN(settings->width, limit);
- int to_print = MIN(lim, n);
+ int lim = MIN(settings->width, (int)limit);
+ int to_print = MIN(lim, (int)n);
int to_pad = to_print - lim;
if(!settings->left_just)
}
-
-/* Length specifiers. */
-enum {
- len_char,
- len_short,
- len_int,
- len_long,
- len_long_long
-};
-
-
/**
* A small printf helper routine for ir nodes.
* @param app An appender (this determines where the stuff is dumped
#define DUMP_STR(s) app->append_str(object, limit, s)
#define DUMP_CH(ch) app->append_char(object, limit, ch)
+ app->init(object, limit);
+
for(i = 0, n = strlen(fmt); i < n; ++i) {
char ch = fmt[i];
buf[1] = '\0';
break;
+ /* Indent */
+ case '>':
+ {
+ int i, n = va_arg(args, int);
+ for(i = 0; i < n && i < sizeof(buf) - 1; ++i)
+ buf[i] = ' ';
+
+ buf[i] = '\0';
+ }
+ break;
+
case 'c':
buf[0] = va_arg(args, int);
buf[1] = '\0';
{
char fmt_str[16];
snprintf(fmt_str, sizeof(fmt_str), "%%%s%c", len_str, ch);
- vsnprintf(buf, sizeof(buf), fmt_str, args);
+
+ switch(len) {
+ case len_char:
+ case len_short:
+ case len_int:
+ {
+ int arg = va_arg(args, int);
+ snprintf(buf, sizeof(buf), fmt_str, arg);
+ }
+ break;
+
+ case len_long:
+ {
+ long arg = va_arg(args, long);
+ snprintf(buf, sizeof(buf), fmt_str, arg);
+ }
+ break;
+
+ case len_long_long:
+ {
+ int64_t arg = va_arg(args, int64_t);
+ snprintf(buf, sizeof(buf), fmt_str, arg);
+ }
+ break;
+ }
}
break;
str = get_id_str(va_arg(args, ident *));
break;
+ case 't':
+ str = get_type_name(va_arg(args, type *));
+ break;
+
case 'e':
str = get_entity_name(va_arg(args, entity *));
break;
str = get_entity_ld_name(va_arg(args, entity *));
break;
- case 't':
+ case 'T':
tarval_snprintf(buf, sizeof(buf), va_arg(args, tarval *));
break;
case 'n':
{
ir_node *irn = va_arg(args, ir_node *);
- snprintf(buf, sizeof(buf), "%s%s:%ld",
- get_irn_opname(irn), get_mode_name(get_irn_mode(irn)), get_irn_node_nr(irn));
+ if(irn)
+ snprintf(buf, sizeof(buf), "%s%s:%ld",
+ get_irn_opname(irn), get_mode_name(get_irn_mode(irn)), get_irn_node_nr(irn));
+ else
+ strncpy(buf, STRNIL, sizeof(buf));
}
break;
str = get_mode_name(va_arg(args, ir_mode *));
break;
- case 'b':
+ case 'B':
snprintf(buf, sizeof(buf), "%ld",
get_irn_node_nr(get_nodes_block(va_arg(args, ir_node *))));
break;
+ case 'b':
+ {
+ const bitset_t *bs = va_arg(args, const bitset_t *);
+ const char *prefix = "";
+ unsigned long i;
+
+ DUMP_CH('[');
+ for(i = bitset_next_set(bs, 0); i != -1; i = bitset_next_set(bs, i + 1)) {
+ snprintf(buf, sizeof(buf), "%ld", i);
+ DUMP_STR(prefix);
+ DUMP_STR(buf);
+ prefix = ", ";
+ }
+ DUMP_CH(']');
+ buf[0] = '\0';
+ }
+ break;
+
case '*':
{
iterator_t *it = va_arg(args, iterator_t *);
ir_common_vprintf(&str_appender, buf, len, fmt, args);
va_end(args);
}
+
+/**
+ * Convencience for string dumping.
+ */
+void ir_obst_printf(struct obstack *obst, const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ ir_common_vprintf(&obst_appender, obst, 0, fmt, args);
+ va_end(args);
+}
+
+void ir_vprintf(const char *fmt, va_list args)
+{
+ ir_common_vprintf(&file_appender, stdout, 0, fmt, args);
+}
+
+void ir_vfprintf(FILE *f, const char *fmt, va_list args)
+{
+ ir_common_vprintf(&file_appender, f, 0, fmt, args);
+}
+
+void ir_vsnprintf(char *buf, size_t len, const char *fmt, va_list args)
+{
+ ir_common_vprintf(&str_appender, buf, len, fmt, args);
+}
+
+void ir_obst_vprintf(struct obstack *obst, const char *fmt, va_list args)
+{
+ ir_common_vprintf(&obst_appender, obst, 0, fmt, args);
+}
+
+#else
+
+#include "irargs_t.h"
+
+void ir_printf(const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ lc_evprintf(firm_get_arg_env(), fmt, args);
+ va_end(args);
+}
+
+void ir_fprintf(FILE *f, const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ lc_evfprintf(firm_get_arg_env(), f, fmt, args);
+ va_end(args);
+}
+
+void ir_snprintf(char *buf, size_t n, const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ lc_evsnprintf(firm_get_arg_env(), buf, n, fmt, args);
+ va_end(args);
+}
+
+void ir_vprintf(const char *fmt, va_list args)
+{
+ lc_evprintf(firm_get_arg_env(), fmt, args);
+}
+
+void ir_vfprintf(FILE *f, const char *fmt, va_list args)
+{
+ lc_evfprintf(firm_get_arg_env(), f, fmt, args);
+}
+
+void ir_vsnprintf(char *buf, size_t len, const char *fmt, va_list args)
+{
+ lc_evsnprintf(firm_get_arg_env(), buf, len, fmt, args);
+}
+
+void ir_obst_vprintf(struct obstack *obst, const char *fmt, va_list args)
+{
+ lc_evoprintf(firm_get_arg_env(), obst, fmt, args);
+}
+
+#endif