Graphviz 2.29.20120208.0545
lib/common/args.c
Go to the documentation of this file.
00001 /* $Id$ $Revision$ */
00002 /* vim:set shiftwidth=4 ts=8: */
00003 
00004 /*************************************************************************
00005  * Copyright (c) 2011 AT&T Intellectual Property 
00006  * All rights reserved. This program and the accompanying materials
00007  * are made available under the terms of the Eclipse Public License v1.0
00008  * which accompanies this distribution, and is available at
00009  * http://www.eclipse.org/legal/epl-v10.html
00010  *
00011  * Contributors: See CVS logs. Details at http://www.graphviz.org/
00012  *************************************************************************/
00013 
00014 /* FIXME
00015  * This is an ugly mess.
00016  *
00017  * Args should be made independent of layout engine and arg values
00018  * should be stored in gvc or gvc->job.   All globals should be eliminated.
00019  *
00020  * Needs to be fixed before layout engines can be plugins.
00021  */
00022 
00023 #include <ctype.h>
00024 #include "render.h"
00025 #include "tlayout.h"
00026 #include "gvc.h"
00027 
00028 /* neato_extra_args:
00029  * Handle special neato arguments.
00030  * Return number of unprocessed arguments; return < 0 on error.
00031  */
00032 static int
00033 neato_extra_args(GVC_t *gvc, int argc, char** argv)
00034 {
00035   char** p = argv+1;
00036   int    i;
00037   char*  arg;
00038   int    cnt = 1;
00039 
00040   for (i = 1; i < argc; i++) {
00041     arg = argv[i];
00042     if (arg && *arg == '-') {
00043       switch (arg[1]) {
00044       case 'x' : Reduce = TRUE; break;
00045       case 'n':
00046         if (arg[2]) {
00047           Nop = atoi(arg+2);
00048           if (Nop <= 0) {
00049             agerr (AGERR, "Invalid parameter \"%s\" for -n flag\n", arg+2);
00050             dotneato_usage (1);
00051             return -1;
00052           }
00053         }
00054         else Nop = 1;
00055         break;
00056       default :
00057         cnt++;
00058         if (*p != arg) *p = arg;
00059         p++;
00060         break;
00061       }
00062     }
00063     else {
00064       cnt++;
00065       if (*p != arg) *p = arg;
00066       p++;
00067     }
00068   }
00069   *p = 0;
00070   return cnt;
00071 }
00072 
00073 /* memtest_extra_args:
00074  * Handle special memtest arguments.
00075  * Return number of unprocessed arguments; return < 0 on error.
00076  */
00077 static int
00078 memtest_extra_args(GVC_t *gvc, int argc, char** argv)
00079 {
00080   char** p = argv+1;
00081   int    i;
00082   char*  arg;
00083   int    cnt = 1;
00084 
00085   for (i = 1; i < argc; i++) {
00086     arg = argv[i];
00087     if (arg && *arg == '-') {
00088       switch (arg[1]) {
00089       case 'm' :
00090         if (arg[2]) {
00091           MemTest = atoi(arg+2);
00092           if (MemTest <= 0) {
00093             agerr (AGERR, "Invalid parameter \"%s\" for -m flag\n", arg+2);
00094             dotneato_usage (1);
00095             return -1;
00096           }
00097         }
00098         else MemTest = -1;
00099         break;
00100       default :
00101         cnt++;
00102         if (*p != arg) *p = arg;
00103         p++;
00104         break;
00105       }
00106     }
00107     else {
00108       cnt++;
00109       if (*p != arg) *p = arg;
00110       p++;
00111     }
00112   }
00113   *p = 0;
00114   return cnt;
00115 }
00116 
00117 /* config_extra_args:
00118  * Handle special config arguments.
00119  * Return number of unprocessed arguments; return < 0 on error.
00120  */
00121 static int
00122 config_extra_args(GVC_t *gvc, int argc, char** argv)
00123 {
00124   char** p = argv+1;
00125   int    i;
00126   char*  arg;
00127   int    cnt = 1;
00128 
00129   for (i = 1; i < argc; i++) {
00130     arg = argv[i];
00131     if (arg && *arg == '-') {
00132       switch (arg[1]) {
00133       case 'v':
00134         gvc->common.verbose = 1;
00135         if (isdigit(arg[2]))
00136           gvc->common.verbose = atoi(&arg[2]);
00137         break;
00138       case 'O' :
00139           gvc->common.auto_outfile_names = TRUE;
00140           break;
00141       case 'c' :
00142           gvc->common.config = TRUE;
00143           break;
00144       default :
00145         cnt++;
00146         if (*p != arg) *p = arg;
00147         p++;
00148         break;
00149       }
00150     }
00151     else {
00152       cnt++;
00153       if (*p != arg) *p = arg;
00154       p++;
00155     }
00156   }
00157   *p = 0;
00158   return cnt;
00159 }
00160 
00161 /* setDouble:
00162  * If arg is an double, value is stored in v
00163  * and functions returns 0; otherwise, returns 1.
00164  */
00165 static int
00166 setDouble (double* v, char* arg)
00167 {
00168   char*    p;
00169   double   d;
00170 
00171   d = strtod(arg,&p);
00172   if (p == arg) {
00173     agerr (AGERR, "bad value in flag -L%s - ignored\n", arg-1);
00174     return 1;
00175   }
00176   *v = d;
00177   return 0;
00178 }
00179 
00180 /* setInt:
00181  * If arg is an integer, value is stored in v
00182  * and functions returns 0; otherwise, returns 1.
00183  */
00184 static int
00185 setInt (int* v, char* arg)
00186 {
00187   char*    p;
00188   int      i;
00189 
00190   i = (int)strtol(arg,&p,10);
00191   if (p == arg) {
00192     agerr (AGERR, "bad value in flag -L%s - ignored\n", arg-1);
00193     return 1;
00194   }
00195   *v = i;
00196   return 0;
00197 }
00198 
00199 /* setFDPAttr:
00200  * Actions for fdp specific flags
00201  */
00202 static int
00203 setFDPAttr (char* arg)
00204 {
00205   switch (*arg++) {
00206   case 'g' :
00207     fdp_parms.useGrid = 0;
00208     break;
00209   case 'O' :
00210     fdp_parms.useNew = 0;
00211     break;
00212   case 'n' :
00213     if (setInt (&fdp_parms.numIters, arg)) return 1;
00214     break;
00215   case 'U' :
00216     if (setInt (&fdp_parms.unscaled, arg)) return 1;
00217     break;
00218   case 'C' :
00219     if (setDouble (&fdp_parms.C, arg)) return 1;
00220     break;
00221   case 'T' :
00222     if (*arg == '*') {
00223       if (setDouble (&fdp_parms.Tfact, arg+1)) return 1;
00224     }
00225     else {
00226       if (setDouble (&fdp_parms.T0, arg)) return 1;
00227     }
00228     break;
00229   default :
00230     agerr (AGWARN, "unknown flag -L%s - ignored\n", arg-1);
00231     break;
00232   }
00233   return 0;
00234 }
00235 
00236 /* fdp_extra_args:
00237  * Handle fdp specific arguments.
00238  * These have the form -L<name>=<value>.
00239  * Return number of unprocessed arguments; return < 0 on error.
00240  */
00241 static int
00242 fdp_extra_args (GVC_t *gvc, int argc, char** argv)
00243 {
00244   char** p = argv+1;
00245   int    i;
00246   char*  arg;
00247   int    cnt = 1;
00248 
00249   for (i = 1; i < argc; i++) {
00250     arg = argv[i];
00251     if (arg && (*arg == '-') && (*(arg+1) == 'L')) {
00252       if (setFDPAttr (arg+2)) {
00253         dotneato_usage(1);
00254         return -1;
00255       }
00256     }
00257     else {
00258       cnt++;
00259       if (*p != arg) *p = arg;
00260       p++;
00261     }
00262   }
00263   *p = 0;
00264   return cnt;
00265 }
00266 
00267 /* gvParseArgs:
00268  * Return 0 on success.
00269  * Return x if calling function should call exit(x-1).
00270  */
00271 int gvParseArgs(GVC_t *gvc, int argc, char** argv)
00272 {
00273     int rv;
00274     if ((argc = neato_extra_args(gvc, argc, argv)) < 0)
00275         return (1-argc);
00276     if ((argc = fdp_extra_args(gvc, argc, argv)) < 0)
00277         return (1-argc);
00278     if ((argc = memtest_extra_args(gvc, argc, argv)) < 0)
00279         return (1-argc);
00280     if ((argc = config_extra_args(gvc, argc, argv)) < 0)
00281         return (1-argc);
00282     if ((rv = dotneato_args_initialize(gvc, argc, argv)))
00283         return rv;
00284     if (Verbose)
00285         gvplugin_write_status(gvc);
00286     return 0;
00287 }