/misc/src/release/graphviz-2.18-1/src/graphviz-2.18/lib/common/args.c

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

Generated on Mon Mar 31 19:03:23 2008 for Graphviz by  doxygen 1.5.1