00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <ctype.h>
00027 #include "render.h"
00028 #include "tlayout.h"
00029
00030
00031 fdpParms_t fdp_parms_default = {
00032 1,
00033 1,
00034 -1,
00035 50,
00036 0.0,
00037 1.0,
00038 -1.0,
00039 -1.0,
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
00154
00155
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
00173
00174
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
00192
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
00229
00230
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 }