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.
#endif /* WITH_CGRAPH */
Gvc = gvContextPlugins(lt_preloaded_symbols, DEMAND_LOADING);
+ ExitOnUsage = 1;
gvParseArgs(Gvc, argc, argv);
#ifndef WIN32
signal(SIGUSR1, gvToggle);
#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)
{
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;
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)
{
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;
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)
{
/* 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)
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++;
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;
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,
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;
fputs(memtestItems, outs);
fputs(configItems, outs);
- if (exval >= 0)
+ if (ExitOnUsage && (exval >= 0))
exit(exval);
+ return (exval+1);
+
}
/* getFlagOpt:
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;
#endif
else {
fprintf(stderr, "Missing argument for -G flag\n");
- dotneato_usage(1);
+ return (dotneato_usage(1));
}
break;
case 'N':
#endif
else {
fprintf(stderr, "Missing argument for -N flag\n");
- dotneato_usage(1);
+ return (dotneato_usage(1));
}
break;
case 'E':
#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) {
fprintf(stderr, "Use one of:%s\n",
gvplugin_list(gvc, API_layout, val));
}
- exit(1);
+ return(2);
}
Kflag = 1;
break;
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;
fprintf(stderr,
"Invalid parameter \"%s\" for -s flag\n",
rest);
- dotneato_usage(1);
+ return (dotneato_usage(1));
}
} else
PSinputscale = POINTS_PER_INCH;
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];
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);
}
}
// 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);
}
}
if (!(agfindnodeattr(agprotograph(), "label")))
agnodeattr(NULL, "label", NODENAME_ESC);
#endif
+ return 0;
}
/* getdoubles2ptf:
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 *);
}
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 */
}
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);
}