X-Git-Url: https://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/c3ec2de25a739b8afec1d19a950ba5bc399c1dcb..1aa75d411dd68f6e015a747a39b5179cb5573bb8:/src/main.c diff --git a/src/main.c b/src/main.c index 783e46e..295199c 100644 --- a/src/main.c +++ b/src/main.c @@ -1228,6 +1228,23 @@ define_dynamic_add_interfaces(Class *c) out_printf(out, "}\n\n"); } +static void define_add_privates(Class *c) +{ + const char *addprivate = c->dynamic + ? "G_ADD_PRIVATE_DYNAMIC" + : "G_ADD_PRIVATE"; + + if (!privates) + return; + + out_printf(out, "#ifdef %s\n" + "#define ___add_privates() %s(%s)\n" + "#else\n" + "#define ___add_privates()\n" + "#endif\n\n", + addprivate, addprivate, typebase); +} + static void add_type_info(void) { out_printf(out, "\tstatic const GTypeInfo info = {\n" @@ -1251,6 +1268,7 @@ add_get_type(void) Class *c = (Class *)class; define_add_interfaces(c); + define_add_privates(c); out_printf(out, "#ifdef G_DEFINE_TYPE_EXTENDED\n\n" "G_DEFINE_TYPE_EXTENDED(%s, %s, %s,\n" @@ -1258,6 +1276,9 @@ add_get_type(void) typebase, funcbase, pmacrotype, c->abstract ? "G_TYPE_FLAG_ABSTRACT" : "0"); + if (privates) + out_printf(out, "\t___add_privates();\n"); + if (c->interfaces) out_printf(out, "\t___add_interfaces(g_define_type_id);\n"); @@ -1296,6 +1317,7 @@ add_dynamic_get_type(void) Class *c = (Class *)class; define_dynamic_add_interfaces(c); + define_add_privates(c); /* * G_DEFINE_DYNAMIC_TYPE_EXTENDED is usable if available, except for @@ -1312,6 +1334,9 @@ add_dynamic_get_type(void) typebase, funcbase, pmacrotype, c->abstract ? "G_TYPE_FLAG_ABSTRACT" : "0"); + if (privates) + out_printf(out, "\t___add_privates();\n"); + if (c->interfaces) { out_printf(out, "\t___add_interfaces" "(type_module, %s_type_id);\n", funcbase); @@ -2544,6 +2569,51 @@ make_bonobo_object_epv (Class *c, const char *classname) out_addline_outfile(out); } +static void add_class_private(Class *c, Method *m) +{ + const char *dynamic = c->dynamic ? "_DYNAMIC" : ""; + + if (!privates) + return; + + out_printf(out, "\n#if !defined(G_DEFINE%s_TYPE_EXTENDED)" + " || !defined(G_ADD_PRIVATE%s)\n" + "\tg_type_class_add_private(%s, sizeof(%sPrivate));\n" + "#endif\n", + dynamic, dynamic, + ((FuncArg *)m->args->data)->name, typebase); +} + +static void get_instance_private(Class *c, Method *m) +{ + const char *self = ((FuncArg *)m->args->data)->name; + const char *dynamic = c->dynamic ? "_DYNAMIC" : ""; + + if (!privates) { + if (always_private_struct) { + out_printf(out, "\t%s->_priv = NULL;\n", self); + } + + return; + } + + out_printf(out, "\t%s->_priv = (%sPrivate *)\n" + "#if defined(G_DEFINE%s_TYPE_EXTENDED)" + " && defined(G_ADD_PRIVATE%s)\n" + "\t\t%s_get_instance_private(%s);\n" + "#else\n" + "\t\tG_TYPE_INSTANCE_GET_PRIVATE\n" + "\t\t\t( %s\n" + "\t\t\t, %s\n" + "\t\t\t, %sPrivate\n" + "\t\t\t);\n" + "#endif\n", + self, typebase, + dynamic, dynamic, + funcbase, self, + self, macrotype, typebase); +} + static void add_inits(Class *c) { @@ -2572,17 +2642,9 @@ add_inits(Class *c) out_printf(out, "#define __GOB_FUNCTION__ \"%s::init\"\n", c->otype); - if (privates > 0) { - out_printf(out, "\t%s->_priv = " - "G_TYPE_INSTANCE_GET_PRIVATE(%s,%s,%sPrivate);\n", - ((FuncArg *)m->args->data)->name, - ((FuncArg *)m->args->data)->name, - macrotype, - typebase); - } else if(always_private_struct) { - out_printf(out, "\t%s->_priv = NULL;\n", - ((FuncArg *)m->args->data)->name); - } + + get_instance_private(c, m); + if(initializers > 0) { GList *li; for(li = ((Class *)class)->nodes; @@ -2643,11 +2705,7 @@ add_inits(Class *c) ((FuncArg *)m->args->data)->name, did_base_obj); - if (privates > 0) - out_printf (out, - "\n\tg_type_class_add_private(%s,sizeof(%sPrivate));\n", - ((FuncArg *)m->args->data)->name, - typebase); + add_class_private(c, m); if (initializers > 0) { GList *li; @@ -3434,13 +3492,13 @@ open_files(void) if (file_sep != 0) sep[0] = file_sep; outfilephbase = g_strconcat (fullfilebase, sep, "private.h", NULL); - outfileph = g_strconcat (outfilephbase, no_touch ? "#gob#" : "", NULL); + outfileph = g_strconcat (outfilephbase, no_touch_headers ? "#gob#" : "", NULL); } else { outfilephbase = NULL; outfileph = NULL; } - + if ( ! no_write) { out = fopen (outfile, "w"); if (out == NULL) { @@ -3849,7 +3907,7 @@ print_class_block(Class *c) " * Public methods\n" " */\n"); - if (!overrode_get_type) { + if (!overrode_get_type && !no_gnu) { /* * For ordinary "static" types it should be safe to mark the * get_type implementation as const, since the get_type @@ -4257,7 +4315,8 @@ print_enum (EnumDef *enode) g_free (str); out_printf (outh, "%s_get_type()\n", funcprefix); - out_printf (outh, "GType %s_get_type (void) G_GNUC_CONST;\n\n", funcprefix); + out_printf (outh, "GType %s_get_type (void)%s;\n\n", + funcprefix, no_gnu ? "": " G_GNUC_CONST"); out_printf (out, "GType\n%s_get_type (void)\n" @@ -4322,7 +4381,8 @@ print_flags (Flags *fnode) g_free (str); out_printf (outh, "%s_get_type()\n", funcprefix); - out_printf (outh, "GType %s_get_type (void) G_GNUC_CONST;\n\n", funcprefix); + out_printf (outh, "GType %s_get_type (void)%s;\n\n", + funcprefix, no_gnu ? "" : " G_GNUC_CONST"); out_printf (out, "GType\n%s_get_type (void)\n" @@ -4385,7 +4445,8 @@ print_error (Error *enode) g_free (str); out_printf (outh, "%s_get_type ()\n", funcprefix); - out_printf (outh, "GType %s_get_type (void) G_GNUC_CONST;\n\n", funcprefix); + out_printf (outh, "GType %s_get_type (void)%s;\n\n", + funcprefix, no_gnu ? "" : " G_GNUC_CONST"); out_printf (out, "GType\n%s_get_type (void)\n" @@ -4462,57 +4523,84 @@ generate_outfiles(void) print_header_postfixes(); } +static void print_version(void) +{ + printf("%s (%s) %s\n", PACKAGE_NAME, PACKAGE_TARNAME, PACKAGE_VERSION); + putchar('\n'); + puts("Copyright (C) 2013 George (Jiri) Lebl et al."); + puts("Copyright (C) 2020 Nick Bowler"); + puts("License GPLv2+: GNU GPL version 2 or later ."); + puts("This is free software: you are free to change and redistribute it."); + puts("There is NO WARRANTY, to the extent permitted by law."); + +} + +static void print_usage(FILE *f) +{ + fprintf(f, "Usage: %s [options] file.gob\n", g_get_prgname()); + if (f == stderr) { + fprintf(f, "Try '%s --help' for more information.\n", + g_get_prgname()); + } +} + static void print_help(void) { - fprintf(stderr, "Gob version %s\n\n", VERSION); - fprintf(stderr, "gob [options] file.gob\n\n"); - fprintf(stderr, "Options:\n" - "\t--help,-h,-? Display this help\n" - "\t--version Display version\n" - "\t--exit-on-warn,-w Exit with an error on warnings\n" - "\t--no-exit-on-warn Don't exit on warnings [default]\n" - "\t--for-cpp Create C++ files\n" - "\t--no-extern-c Never print extern \"C\" into the " - "header\n" - "\t--no-gnu Never use GNU extentions\n" - "\t--no-touch Don't touch output files unless they " - "really\n" - "\t changed (implies --no-touch-headers)\n" - "\t--no-touch-headers Don't touch headers unless they " - "really changed\n" - "\t--always-private-header Always create a private header " - "file,\n" - "\t even if it would be empty\n" - "\t--ondemand-private-header Create private header only when " - "needed\n" - "\t [default]\n" - "\t--no-private-header Don't create a private header, " - "put private\n" - "\t structure and protected " - "prototypes inside c file\n" - "\t--always-private-struct Always create a private pointer " - "in\n" - "\t the object structure\n" - "\t--m4 Preprocess source with m4. " - "Following args will\n" - "\t be passed to m4\n" - "\t--m4-dir Print directory that will be " - "searched for m4\n" - "\t files\n" - "\t--no-write,-n Don't write output files, just " - "check syntax\n" - "\t--no-lines Don't print '#line' to output\n" - "\t--no-self-alias Don't create self type and macro " - "aliases\n" - "\t--no-kill-underscores Ignored for compatibility\n" - "\t-o,--output-dir The directory where output " - "should be placed\n" - "\t--file-sep[=c] replace default \'-\' file " - "name separator\n\n" - "\t--gtk3 Use gtk+3\n" - ); - fprintf(stderr, "End world hunger, donate to the World Food Programme, http://www.wfp.org\n"); + print_usage(stdout); + + puts( +"This is \"GObject Builder\": a simple preprocessor to help with\n" +"implementing GObject types in C.\n" + ); + + puts("Options:"); + puts(" --help,-h,-? Display this help\n" + " --version Display version\n" + " --exit-on-warn,-w Exit with an error on warnings\n" + " --no-exit-on-warn Don't exit on warnings [default]\n" + " --for-cpp Create C++ files\n" + " --no-extern-c Never print extern \"C\" into the " + "header\n" + " --no-gnu Never use GNU extentions\n" + " --no-touch Don't touch output files unless they " + "really\n" + " changed (implies --no-touch-headers)\n" + " --no-touch-headers Don't touch headers unless they " + "really changed\n" + " --always-private-header Always create a private header " + "file,\n" + " even if it would be empty\n" + " --ondemand-private-header Create private header only when " + "needed\n" + " [default]\n" + " --no-private-header Don't create a private header, " + "put private\n" + " structure and protected " + "prototypes inside c file\n" + " --always-private-struct Always create a private pointer " + "in\n" + " the object structure\n" + " --m4 Preprocess source with m4. " + "Following args will\n" + " be passed to m4\n" + " --m4-dir Print directory that will be " + "searched for m4\n" + " files\n" + " --no-write,-n Don't write output files, just " + "check syntax\n" + " --no-lines Don't print '#line' to output\n" + " --no-self-alias Don't create self type and macro " + "aliases\n" + " --no-kill-underscores Ignored for compatibility\n" + " -o,--output-dir The directory where output " + "should be placed\n" + " --file-sep[=c] replace default \'-\' file " + "name separator\n\n" + " --gtk3 Use gtk+3\n" + ); + + puts("End world hunger, donate to the World Food Programme: https://www.wfp.org/"); } static void @@ -4562,7 +4650,7 @@ parse_options(int argc, char *argv[]) /*must be a file*/ if(got_file) { fprintf(stderr, "Specify only one file!\n"); - print_help(); + print_usage(stderr); exit(1); } filename = argv[i]; @@ -4571,7 +4659,7 @@ parse_options(int argc, char *argv[]) print_help(); exit(0); } else if(strcmp(argv[i], "--version")==0) { - fprintf(stderr, "Gob version %s\n", VERSION); + print_version(); exit(0); } else if(strcmp(argv[i], "--exit-on-warn")==0) { exit_on_warn = TRUE; @@ -4653,7 +4741,7 @@ parse_options(int argc, char *argv[]) } else if(strncmp(argv[i], "--", 2)==0) { /*unknown long option*/ fprintf(stderr, "Unknown option '%s'!\n", argv[i]); - print_help(); + print_usage(stderr); exit(1); } else { /*by now we know we have a string starting with @@ -4674,7 +4762,7 @@ parse_options(int argc, char *argv[]) default: fprintf(stderr, "Unknown option '%c'!\n", *p); - print_help(); + print_usage(stderr); exit(1); } } @@ -4773,6 +4861,8 @@ compare_and_move (const char *old_filename) int main(int argc, char *argv[]) { + g_set_prgname(argc > 0 ? argv[0] : "gob2"); + parse_options(argc, argv); if(use_m4) { @@ -4877,15 +4967,16 @@ main(int argc, char *argv[]) if (outph) fclose (outph); - if (! no_write) { + if (!no_write) { if (no_touch) { - compare_and_move (outfilebase); + compare_and_move(outfilebase); + } + if (no_touch_headers) { + compare_and_move(outfilehbase); if (outfilephbase) - compare_and_move (outfilephbase); + compare_and_move(outfilephbase); } - if (no_touch_headers) - compare_and_move (outfilehbase); } - + return 0; }