X-Git-Url: https://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/486240dc4c5d57b0afaddba60d87fe375112bed5..7231d76fbf4ae0b501af648e1216b88714aa7353:/src/util.c diff --git a/src/util.c b/src/util.c index ae16914..cc523ed 100644 --- a/src/util.c +++ b/src/util.c @@ -21,6 +21,7 @@ */ #include "config.h" +#include #include #include #include @@ -31,30 +32,53 @@ #include "util.h" void -print_error(gboolean is_warn, char *error, int line) +error_print(int type, int line, const char *error) { - char *w; - if(is_warn) + char *w = NULL; + + switch(type) { + case GOB_WARN: w = "Warning:"; - else { + break; + case GOB_ERROR: w = "Error:"; got_error = TRUE; + break; + default: + g_assert_not_reached(); } - if(line>0) + if(line > 0) fprintf(stderr, "%s:%d: %s %s\n", filename, line, w, error); else fprintf(stderr, "%s: %s %s\n", filename, w, error); - if((!is_warn || exit_on_warn) && exit_on_error) + if(exit_on_error && + (type == GOB_ERROR || + (type == GOB_WARN && exit_on_warn))) exit(1); } +void +error_printf(int type, int line, const char *error, ...) +{ + va_list ap; + char *s; + + va_start(ap, error); + s = g_strdup_vprintf(error, ap); + va_end(ap); + + error_print(type, line, s); + + g_free(s); +} + char * -remove_sep(char *base) +remove_sep(const char *base) { char *p; char *s = g_strdup(base); while((p = strchr(s, ':'))) - strcpy(p,p+1); + strcpy(p, p+1); return s; } @@ -140,26 +164,36 @@ typedef struct _OurGtkType OurGtkType; struct _OurGtkType { gboolean simple; char *gtkname; - char *typename; + char *cast; + char *type_name; + char *type_pointer; int special; }; const OurGtkType our_gtk_type_table[] = { - { TRUE, "NONE", "void ", -1 }, - { TRUE, "CHAR", "gchar ", -1 }, - { TRUE, "UCHAR", "guchar ", -1 }, - { TRUE, "BOOL", "gboolean ", -1 }, - { TRUE, "INT", "gint ", -1 }, - { TRUE, "UINT", "guint ", -1 }, - { TRUE, "LONG", "glong ", -1 }, - { TRUE, "ULONG", "gulong ", -1 }, - { TRUE, "FLOAT", "gfloat ", -1 }, - { TRUE, "DOUBLE", "gdouble ", -1 }, - { TRUE, "STRING", /*"GtkString"*/"gchar *", -1 }, - { TRUE, "ENUM", /*"GtkEnum"*/"gint ", -1 }, - { TRUE, "FLAGS", /*"GtkFlags"*/"guint ", -1 }, - { TRUE, "BOXED", /*"GtkBoxed"*/"gpointer ", -1 }, - { TRUE, "POINTER", "gpointer ", -1 }, - { TRUE, "OBJECT", "GtkObject *", -1 }, + { TRUE, "NONE", "void ", "void", NULL, -1 }, + { TRUE, "CHAR", "gchar ", "gchar", NULL, -1 }, + { TRUE, "UCHAR", "guchar ", "guchar", NULL, -1 }, + { TRUE, "BOOLEAN", "gboolean ", "gboolean", NULL, -1 }, + { TRUE, "INT", "gint ", "gint", NULL, -1 }, + { TRUE, "UINT", "guint ", "guint", NULL, -1 }, + { TRUE, "LONG", "glong ", "glong", NULL, -1 }, + { TRUE, "ULONG", "gulong ", "gulong", NULL, -1 }, + { TRUE, "ENUM", /*"enum"*/"gint ", "gint", NULL, -1 }, + { TRUE, "FLAGS", /*"flags"*/"guint ", "guint", NULL, -1 }, + { TRUE, "FLOAT", "gfloat ", "gfloat", NULL, -1 }, + { TRUE, "DOUBLE", "gdouble ", "gdouble", NULL, -1 }, + { TRUE, "STRING", /*"string"*/"gchar *", "gchar", "*", -1 }, + { TRUE, "POINTER", "gpointer ", "gpointer", NULL, -1 }, + { TRUE, "BOXED", /*"boxed"*/"gpointer ", "gpointer", NULL, -1 }, + { TRUE, "OBJECT", "GObject *", "GObject", "*", -1 }, + { TRUE, "PARAM", "GParamSpec *", "GParamSpec", "*", -1 }, + + /* FIXME: VALUE_ARRAY, CLOSURE, UNICHAR */ + /* Note that those have some issues with g_value_ calls etc... so + * we can't just add them */ + + /* Do we need this??? */ +#if 0 { FALSE, "SIGNAL", /*"GtkSignal"*/"___twopointertype ", SPECIAL_2POINTER }, { FALSE, "ARGS", /*"GtkArgs"*/"___intpointertype ", @@ -170,6 +204,7 @@ const OurGtkType our_gtk_type_table[] = { SPECIAL_2POINTER }, { FALSE, "FOREIGN", /*"GtkForeign"*/"___twopointertype ", SPECIAL_2POINTER }, +#endif { FALSE, NULL, NULL } }; @@ -192,20 +227,43 @@ init_type_hash(void) } const char * -get_cast(char *type, gboolean simple_only) +get_cast (const char *type, gboolean simple_only) { OurGtkType *gtype; - init_type_hash(); + init_type_hash (); - gtype = g_hash_table_lookup(type_hash, type); + gtype = g_hash_table_lookup (type_hash, type); + + if (gtype == NULL || + (simple_only && + ! gtype->simple)) + return NULL; - if(!gtype || - (simple_only && - !gtype->simple)) + return gtype->cast; +} + +Type * +get_tree_type (const char *type, gboolean simple_only) +{ + OurGtkType *gtype; + Node *node; + + init_type_hash (); + + gtype = g_hash_table_lookup (type_hash, type); + + if (gtype == NULL || + (simple_only && + ! gtype->simple)) return NULL; - return gtype->typename; + node = node_new (TYPE_NODE, + "name", gtype->type_name, + "pointer", gtype->type_pointer, + NULL); + + return (Type *)node; } static void @@ -252,15 +310,3 @@ setup_special_array(Class *c, gboolean *special_array) return any_special; } - -/* get the id without the first underscore, but only if we're removing them */ -char * -get_real_id(char *id) -{ - if(!no_kill_underscores && - id[0] == '_' && - id[1] != '\0') - return &id[1]; - else - return id; -}