|
Graphviz 2.29.20120208.0545
|
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 }
1.7.4