X-Git-Url: https://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/489e97ede850a8de01ca3bd653dce9c25dcd54a1..7f1f40bee65a4a3d3947ad8c50b535ea0754f629:/src/util.c diff --git a/src/util.c b/src/util.c index 78eaaaa..ddf9485 100644 --- a/src/util.c +++ b/src/util.c @@ -1,6 +1,7 @@ /* GOB C Preprocessor * Copyright (C) 1999-2000 the Free Software Foundation. * Copyright (C) 2000 Eazel, Inc. + * Copyright (C) 2022 Nick Bowler * * Author: George Lebl * @@ -20,7 +21,7 @@ * USA. */ -#include "config.h" +#include #include #include #include @@ -34,11 +35,14 @@ void error_print(int type, int line, const char *error) { - char *w = NULL; + const char *w = NULL; + const char *fname = NULL; switch(type) { case GOB_WARN: w = "Warning:"; + if (exit_on_warn) + got_error = TRUE; break; case GOB_ERROR: w = "Error:"; @@ -47,13 +51,14 @@ error_print(int type, int line, const char *error) default: g_assert_not_reached(); } - if(line > 0) - fprintf(stderr, "%s:%d: %s %s\n", filename, line, w, error); + fname = filename; + if (fname == NULL) + fname = "gob2"; + if (line > 0) + fprintf(stderr, "%s:%d: %s %s\n", fname, line, w, error); else - fprintf(stderr, "%s: %s %s\n", filename, w, error); - if(exit_on_error && - (type == GOB_ERROR || - (type == GOB_WARN && exit_on_warn))) + fprintf(stderr, "%s: %s %s\n", fname, w, error); + if (exit_on_error && got_error) exit(1); } @@ -77,8 +82,17 @@ remove_sep(const char *base) { char *p; char *s = g_strdup(base); - while((p = strchr(s, ':'))) - strcpy(p, p+1); + char *q=s; + + /* don't eat C++ :: thingies */ + if (for_cpp && strstr (s, "::") != NULL) + return s; + + for(p=(char *)base;*p;p++){ + if (*p!=':') + *q++=*p; + } + *q='\0'; return s; } @@ -87,8 +101,23 @@ replace_sep(const char *base, char r) { char *p; char *s = g_strdup(base); - while((p=strchr(s,':'))) - *p = r; + + /* don't eat C++ :: thingies */ + if (for_cpp && strstr (s, "::") != NULL) + return s; + + if (r == '\0') { + while ((p=strchr(s,':')) != NULL) { + char *t = p; + while (*t != '\0') { + *t = *(t+1); + t++; + } + } + } else { + while ((p=strchr(s,':')) != NULL) + *p = r; + } if(*s == r) { p = g_strdup(s+1); g_free(s); @@ -104,7 +133,15 @@ separns_replace_sep(const char *base, char **ns, char **name, char r) { char *p; char *s = g_strdup(base); + *ns = NULL; + + /* don't eat C++ :: thingies */ + if (for_cpp && strstr (s, "::") != NULL) { + *name = s; + return; + } + if((p=strchr(s,':')) && p!=s) { *p = '\0'; *ns = g_strdup(s); @@ -147,7 +184,7 @@ make_pre_macro(const char *base, const char *pre) else s = g_strconcat(pre, "_", name, NULL); - g_strup(s); + gob_strup (s); g_free(ns); g_free(name); @@ -173,11 +210,14 @@ const OurGtkType our_gtk_type_table[] = { { TRUE, "NONE", "void ", "void", NULL, -1 }, { TRUE, "CHAR", "gchar ", "gchar", NULL, -1 }, { TRUE, "UCHAR", "guchar ", "guchar", NULL, -1 }, + { TRUE, "UNICHAR", "gunichar ", "gunichar", 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, "INT64", "gint64 ", "gint64", NULL, -1 }, + { TRUE, "UINT64", "guint64 ", "guint64", NULL, -1 }, { TRUE, "ENUM", /*"enum"*/"gint ", "gint", NULL, -1 }, { TRUE, "FLAGS", /*"flags"*/"guint ", "guint", NULL, -1 }, { TRUE, "FLOAT", "gfloat ", "gfloat", NULL, -1 }, @@ -188,7 +228,7 @@ const OurGtkType our_gtk_type_table[] = { { TRUE, "OBJECT", "GObject *", "GObject", "*", -1 }, { TRUE, "PARAM", "GParamSpec *", "GParamSpec", "*", -1 }, - /* FIXME: VALUE_ARRAY, CLOSURE, UNICHAR */ + /* FIXME: VALUE_ARRAY, CLOSURE */ /* Note that those have some issues with g_value_ calls etc... so * we can't just add them */ @@ -233,7 +273,10 @@ get_cast (const char *type, gboolean simple_only) init_type_hash (); - gtype = g_hash_table_lookup (type_hash, type); + if(strncmp(type, "BOXED_", 6) == 0) + gtype = g_hash_table_lookup (type_hash, "BOXED"); + else + gtype = g_hash_table_lookup (type_hash, type); if (gtype == NULL || (simple_only && @@ -267,7 +310,7 @@ get_tree_type (const char *type, gboolean simple_only) } static void -mask_special_array(char *type, gboolean *special_array, gboolean *any_special) +mask_special_array (const char *type, gboolean *special_array, gboolean *any_special) { OurGtkType *gtype; @@ -314,7 +357,7 @@ setup_special_array(Class *c, gboolean *special_array) char * get_type (const Type *t, gboolean postfix_to_stars) { - char *s; + char *ret, *s; int i; int extra; GString *gs; @@ -341,7 +384,63 @@ get_type (const Type *t, gboolean postfix_to_stars) g_string_append_c (gs, '*'); g_string_append_c (gs, ' '); } - - return g_string_free (gs, FALSE); + ret = gs->str; + g_string_free(gs, FALSE); + return ret; } +#if HAVE_G_ASCII_STRCASECMP +char *gob_strup(char *str) +{ + char *s; + + for (s = str; *s; s++) + *s = g_ascii_toupper(*s); + + return str; +} + +char *gob_strdown(char *str) +{ + char *s; + + for (s = str; *s; s++) + *s = g_ascii_tolower(*s); + + return str; +} +#endif + +char * +gob_str_delete_quotes(char *str) +{ + char *p, *i; + p=i=str; + while(*p!='\0') + { + if(*p=='\"') + { + p++; + continue; + } + *i=*p; + p++; i++; + } + *i=*p; + return str; +} + +char * +make_me_type (const char *type, const char *alt) +{ + if (type == NULL) + return g_strdup (alt); + /* HACK! just in case someone made this + * work with 2.0.0 by using the TYPE + * macro directly */ + if ((strstr (type, "_TYPE_") != NULL || + strstr (type, "TYPE_") == type) && + strchr (type, ':') == NULL) + return g_strdup (type); + return make_pre_macro (type, "TYPE"); +}