]> granicus.if.org Git - graphviz/commitdiff
Remove use of exit() from libcommon. Mainly, the involves gvParseArgs return 0
authorEmden Gansner <erg@research.att.com>
Wed, 4 Jan 2012 19:02:41 +0000 (14:02 -0500)
committerEmden Gansner <erg@research.att.com>
Wed, 4 Jan 2012 19:02:41 +0000 (14:02 -0500)
on success and v if the calling function should call exit(v-1).
Added global ExitOnUsage which, if set, causes dotneato_usage to exit as usual.

cmd/dot/dot.c
lib/common/args.c
lib/common/globals.h
lib/common/input.c
lib/common/render.h
lib/common/utils.c

index d65d0e363aaea0883df8bf2ca5f0103150b8317f..113d9fb8df53b23b17b1a546332c1c77ae7ec4ba 100644 (file)
@@ -186,6 +186,7 @@ int main(int argc, char **argv)
 #endif /* WITH_CGRAPH */
 
     Gvc = gvContextPlugins(lt_preloaded_symbols, DEMAND_LOADING);
+    ExitOnUsage = 1;
     gvParseArgs(Gvc, argc, argv);
 #ifndef WIN32
     signal(SIGUSR1, gvToggle);
index 7efa985b880184aaf5315c56bcbe53e22e1a6495..4778a056fe60348a62205c7c11520e6a3652162d 100644 (file)
 #include "tlayout.h"
 #include "gvc.h"
 
+/* neato_extra_args:
+ * Handle special neato arguments.
+ * Return number of unprocessed arguments; return < 0 on error.
+ */
 static int
 neato_extra_args(GVC_t *gvc, int argc, char** argv)
 {
@@ -42,8 +46,9 @@ neato_extra_args(GVC_t *gvc, int argc, char** argv)
         if (arg[2]) {
           Nop = atoi(arg+2);
           if (Nop <= 0) {
-            fprintf (stderr, "Invalid parameter \"%s\" for -n flag\n", arg+2);
+            agerr (AGERR, "Invalid parameter \"%s\" for -n flag\n", arg+2);
             dotneato_usage (1);
+           return -1;
           }
         }
         else Nop = 1;
@@ -65,6 +70,10 @@ neato_extra_args(GVC_t *gvc, int argc, char** argv)
   return cnt;
 }
 
+/* memtest_extra_args:
+ * Handle special memtest arguments.
+ * Return number of unprocessed arguments; return < 0 on error.
+ */
 static int
 memtest_extra_args(GVC_t *gvc, int argc, char** argv)
 {
@@ -81,8 +90,9 @@ memtest_extra_args(GVC_t *gvc, int argc, char** argv)
         if (arg[2]) {
           MemTest = atoi(arg+2);
           if (MemTest <= 0) {
-            fprintf (stderr, "Invalid parameter \"%s\" for -m flag\n", arg+2);
+            agerr (AGERR, "Invalid parameter \"%s\" for -m flag\n", arg+2);
             dotneato_usage (1);
+           return -1;
           }
         }
         else MemTest = -1;
@@ -104,6 +114,10 @@ memtest_extra_args(GVC_t *gvc, int argc, char** argv)
   return cnt;
 }
 
+/* config_extra_args:
+ * Handle special config arguments.
+ * Return number of unprocessed arguments; return < 0 on error.
+ */
 static int
 config_extra_args(GVC_t *gvc, int argc, char** argv)
 {
@@ -222,6 +236,7 @@ setFDPAttr (char* arg)
 /* fdp_extra_args:
  * Handle fdp specific arguments.
  * These have the form -L<name>=<value>.
+ * Return number of unprocessed arguments; return < 0 on error.
  */
 static int
 fdp_extra_args (GVC_t *gvc, int argc, char** argv)
@@ -234,7 +249,10 @@ fdp_extra_args (GVC_t *gvc, int argc, char** argv)
   for (i = 1; i < argc; i++) {
     arg = argv[i];
     if (arg && (*arg == '-') && (*(arg+1) == 'L')) {
-      if (setFDPAttr (arg+2)) dotneato_usage(1);
+      if (setFDPAttr (arg+2)) {
+       dotneato_usage(1);
+       return -1;
+      }
     }
     else {
       cnt++;
@@ -246,13 +264,23 @@ fdp_extra_args (GVC_t *gvc, int argc, char** argv)
   return cnt;
 }
 
+/* gvParseArgs:
+ * Return 0 on success.
+ * Return x if calling function should call exit(x-1).
+ */
 int gvParseArgs(GVC_t *gvc, int argc, char** argv)
 {
-    argc = neato_extra_args(gvc, argc, argv);
-    argc = fdp_extra_args(gvc, argc, argv);
-    argc = memtest_extra_args(gvc, argc, argv);
-    argc = config_extra_args(gvc, argc, argv);
-    dotneato_args_initialize(gvc, argc, argv);
+    int rv;
+    if ((argc = neato_extra_args(gvc, argc, argv)) < 0)
+       return (1-argc);
+    if ((argc = fdp_extra_args(gvc, argc, argv)) < 0)
+       return (1-argc);
+    if ((argc = memtest_extra_args(gvc, argc, argv)) < 0)
+       return (1-argc);
+    if ((argc = config_extra_args(gvc, argc, argv)) < 0)
+       return (1-argc);
+    if ((rv = dotneato_args_initialize(gvc, argc, argv)))
+       return rv;
     if (Verbose)
        gvplugin_write_status(gvc);
     return 0;
index d9cfcd08068547f6f1c63eda2fab74f99d285bbf..a6491d7e44f2749a5103d55d1284f750ddda927f 100644 (file)
@@ -91,6 +91,7 @@ extern "C" {
     EXTERN double Initial_dist;
     EXTERN double Damping;
     EXTERN int Y_invert;       /* invert y in dot & plain output */
+    EXTERN int ExitOnUsage;     /* dotneato_usage() should exit */
 
     EXTERN attrsym_t
        *G_activepencolor, *G_activefillcolor,
index 3cda3f30515878ce520034f3871e61ee405bd121..549e7608a20aed572d2c3861c19f412efcd7ae2d 100644 (file)
@@ -64,7 +64,11 @@ static char *configItems = "\n\
                with available plugin information.  Needs write privilege.)\n\
  -?          - Print usage and exit\n";
 
-void dotneato_usage(int exval)
+/* dotneato_usage:
+ * Print usage information. If ExitOnUsage is set, exit with
+ * given exval, else return exval+1.
+ */
+int dotneato_usage(int exval)
 {
     FILE *outs;
 
@@ -84,8 +88,10 @@ void dotneato_usage(int exval)
     fputs(memtestItems, outs);
     fputs(configItems, outs);
 
-    if (exval >= 0)
+    if (ExitOnUsage && (exval >= 0))
        exit(exval);
+    return (exval+1);
+       
 }
 
 /* getFlagOpt:
@@ -228,7 +234,12 @@ graph_t *gvPluginsGraph(GVC_t *gvc)
     return P_graph;
 }
 
-void dotneato_args_initialize(GVC_t * gvc, int argc, char **argv)
+/* dotneato_args_initialize"
+ * Scan argv[] for allowed flags.
+ * Return 0 on success; v+1 if calling function should call exit(v).
+ * If -c is set, config file is created and we exit. 
+ */
+int dotneato_args_initialize(GVC_t * gvc, int argc, char **argv)
 {
     char c, *rest, *layout;
     const char *val;
@@ -284,7 +295,7 @@ void dotneato_args_initialize(GVC_t * gvc, int argc, char **argv)
 #endif
                else {
                    fprintf(stderr, "Missing argument for -G flag\n");
-                   dotneato_usage(1);
+                   return (dotneato_usage(1));
                }
                break;
            case 'N':
@@ -296,7 +307,7 @@ void dotneato_args_initialize(GVC_t * gvc, int argc, char **argv)
 #endif
                else {
                    fprintf(stderr, "Missing argument for -N flag\n");
-                   dotneato_usage(1);
+                   return (dotneato_usage(1));
                }
                break;
            case 'E':
@@ -308,29 +319,27 @@ void dotneato_args_initialize(GVC_t * gvc, int argc, char **argv)
 #endif
                else {
                    fprintf(stderr, "Missing argument for -E flag\n");
-                   dotneato_usage(1);
+                   return (dotneato_usage(1));
                }
                break;
            case 'T':
                val = getFlagOpt(argc, argv, &i);
                if (!val) {
                    fprintf(stderr, "Missing argument for -T flag\n");
-                   dotneato_usage(1);
-                   exit(1);
+                   return (dotneato_usage(1));
                }
                v = gvjobs_output_langname(gvc, val);
                if (!v) {
                    fprintf(stderr, "Format: \"%s\" not recognized. Use one of:%s\n",
                        val, gvplugin_list(gvc, API_device, val));
-                   exit(1);
+                   return(2);
                }
                break;
            case 'K':
                val = getFlagOpt(argc, argv, &i);
                if (!val) {
                     fprintf(stderr, "Missing argument for -K flag\n");
-                    dotneato_usage(1);
-                    exit(1);
+                    return (dotneato_usage(1));
                 }
                 v = gvlayout_select(gvc, val);
                 if (v == NO_SUPPORT) {
@@ -342,7 +351,7 @@ void dotneato_args_initialize(GVC_t * gvc, int argc, char **argv)
                         fprintf(stderr, "Use one of:%s\n",
                                gvplugin_list(gvc, API_layout, val));
                    }
-                   exit(1);
+                   return(2);
                 }
                Kflag = 1;
                break;
@@ -353,13 +362,13 @@ void dotneato_args_initialize(GVC_t * gvc, int argc, char **argv)
                fprintf(stderr, "%s - %s version %s (%s)\n",
                        gvc->common.cmdname, gvc->common.info[0], 
                        gvc->common.info[1], gvc->common.info[2]);
-               exit(0);
+               return (1);
                break;
            case 'l':
                val = getFlagOpt(argc, argv, &i);
                if (!val) {
                    fprintf(stderr, "Missing argument for -l flag\n");
-                   dotneato_usage(1);
+                   return (dotneato_usage(1));
                }
                use_library(gvc, val);
                break;
@@ -389,7 +398,7 @@ void dotneato_args_initialize(GVC_t * gvc, int argc, char **argv)
                        fprintf(stderr,
                                "Invalid parameter \"%s\" for -s flag\n",
                                rest);
-                       dotneato_usage(1);
+                       return (dotneato_usage(1));
                    }
                } else
                    PSinputscale = POINTS_PER_INCH;
@@ -401,12 +410,12 @@ void dotneato_args_initialize(GVC_t * gvc, int argc, char **argv)
                Y_invert = TRUE;
                break;
            case '?':
-               dotneato_usage(0);
+               return (dotneato_usage(0));
                break;
            default:
-               fprintf(stderr, "%s: option -%c unrecognized\n\n", gvc->common.cmdname,
+               agerr(AGERR, "%s: option -%c unrecognized\n\n", gvc->common.cmdname,
                        c);
-               dotneato_usage(1);
+               return (dotneato_usage(1));
            }
        } else if (argv[i])
            gvc->input_filenames[nfiles++] = argv[i];
@@ -430,7 +439,7 @@ void dotneato_args_initialize(GVC_t * gvc, int argc, char **argv)
                fprintf(stderr, "Perhaps \"dot -c\" needs to be run (with installer's privileges) to register the plugins?\n");
            else 
                fprintf(stderr, "Use one of:%s\n", gvplugin_list(gvc, API_layout, ""));
-           exit(1);
+           return(2);
        }
     }
 
@@ -441,7 +450,7 @@ void dotneato_args_initialize(GVC_t * gvc, int argc, char **argv)
 //     assert(v);  /* "dot" should always be available as an output format */
                fprintf(stderr,
                        "Unable to find even the default \"-Tdot\" renderer.  Has the config\nfile been generated by running \"dot -c\" with installer's priviledges?\n");
-                       exit(1);
+                       return(2);
        }
     }
 
@@ -453,6 +462,7 @@ void dotneato_args_initialize(GVC_t * gvc, int argc, char **argv)
     if (!(agfindnodeattr(agprotograph(), "label")))
        agnodeattr(NULL, "label", NODENAME_ESC);
 #endif
+    return 0;
 }
 
 /* getdoubles2ptf:
index 63bb6c013ca868f1e101a954f8f51607d86af406..f39c72ddfe711df52aa5559bbcff3937915db496 100644 (file)
@@ -93,8 +93,8 @@ extern "C" {
     extern void do_graph_label(graph_t * sg);
     extern void graph_init(graph_t * g, boolean use_rankdir);
     extern void graph_cleanup(graph_t * g);
-    extern void dotneato_args_initialize(GVC_t * gvc, int, char **);
-    extern void dotneato_usage(int);
+    extern int dotneato_args_initialize(GVC_t * gvc, int, char **);
+    extern int dotneato_usage(int);
     extern void dotneato_postprocess(Agraph_t *);
     extern void gv_postprocess(Agraph_t *, int);
     extern void dotneato_set_margins(GVC_t * gvc, Agraph_t *);
index 966d97a1219ce17be5cb08a36bd53164de9495e0..8a729b66da90c2849e3dd83a9055aae5b33a7e92 100644 (file)
@@ -1544,7 +1544,7 @@ char* htmlEntityUTF8 (char* s)
            }
            else {
                agerr(AGERR, "Invalid 2-byte UTF8 found in input. Perhaps \"-Gcharset=latin1\" is needed?\n");
-               exit(EXIT_FAILURE);
+               return "";
            }
        }
        else if (c < 0xF0) { /* copy 3 byte UTF8 characters */
@@ -1556,12 +1556,12 @@ char* htmlEntityUTF8 (char* s)
            }
            else {
                agerr(AGERR, "Invalid 3-byte UTF8 found in input. Perhaps \"-Gcharset=latin1\" is needed?\n");
-               exit(EXIT_FAILURE);
+               return "";
            }
        }
        else  {
            agerr(AGERR, "UTF8 codes > 3 bytes are not currently supported. Or perhaps \"-Gcharset=latin1\" is needed?\n");
-           exit(EXIT_FAILURE);
+           return "";
         }
        rc = agxbputc(&xb, c);
     }