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
00027
00028
00029
00030 #include "Parser_dh.h"
00031 #include "Mem_dh.h"
00032
00033 typedef struct _optionsNode OptionsNode;
00034
00035 struct _parser_dh
00036 {
00037 OptionsNode *head;
00038 OptionsNode *tail;
00039 };
00040
00041 struct _optionsNode
00042 {
00043 char *name;
00044 char *value;
00045 OptionsNode *next;
00046 };
00047
00048 static bool find (Parser_dh p, char *option, OptionsNode ** ptr);
00049 static void init_from_default_settings_private (Parser_dh p);
00050
00051
00052 #undef __FUNC__
00053 #define __FUNC__ "Parser_dhCreate"
00054 void
00055 Parser_dhCreate (Parser_dh * p)
00056 {
00057 START_FUNC_DH OptionsNode * ptr;
00058
00059
00060 struct _parser_dh *tmp =
00061 (struct _parser_dh *) MALLOC_DH (sizeof (struct _parser_dh));
00062 CHECK_V_ERROR;
00063 *p = tmp;
00064
00065
00066 tmp->head = tmp->tail = (OptionsNode *) MALLOC_DH (sizeof (OptionsNode));
00067 CHECK_V_ERROR;
00068 ptr = tmp->head;
00069 ptr->next = NULL;
00070 ptr->name = (char *) MALLOC_DH (6 * sizeof (char));
00071 CHECK_V_ERROR;
00072 ptr->value = (char *) MALLOC_DH (6 * sizeof (char));
00073 CHECK_V_ERROR;
00074 strcpy (ptr->name, "JUNK");
00075 strcpy (ptr->value, "JUNK");
00076 END_FUNC_DH}
00077
00078 #undef __FUNC__
00079 #define __FUNC__ "Parser_dhDestroy"
00080 void
00081 Parser_dhDestroy (Parser_dh p)
00082 {
00083 START_FUNC_DH OptionsNode * ptr2 = p->head, *ptr1 = ptr2;
00084 if (ptr1 != NULL)
00085 {
00086 do
00087 {
00088 ptr2 = ptr2->next;
00089 FREE_DH (ptr1->name);
00090 FREE_DH (ptr1->value);
00091 FREE_DH (ptr1);
00092 ptr1 = ptr2;
00093 }
00094 while (ptr1 != NULL);
00095 }
00096 FREE_DH (p);
00097 END_FUNC_DH}
00098
00099
00100 #undef __FUNC__
00101 #define __FUNC__ "Parser_dhUpdateFromFile"
00102 void
00103 Parser_dhUpdateFromFile (Parser_dh p, char *filename)
00104 {
00105 START_FUNC_DH_2 char line[80], name[80], value[80];
00106 FILE *fp;
00107
00108 if ((fp = fopen (filename, "r")) == NULL)
00109 {
00110 sprintf (msgBuf_dh, "can't open >>%s<< for reading", filename);
00111 SET_INFO (msgBuf_dh);
00112 }
00113 else
00114 {
00115 sprintf (msgBuf_dh, "updating parser from file: >>%s<<", filename);
00116 SET_INFO (msgBuf_dh);
00117 while (!feof (fp))
00118 {
00119 if (fgets (line, 80, fp) == NULL)
00120 break;
00121 if (line[0] != '#')
00122 {
00123 if (sscanf (line, "%s %s", name, value) != 2)
00124 break;
00125 Parser_dhInsert (p, name, value);
00126 }
00127 }
00128 fclose (fp);
00129 }
00130 END_FUNC_DH_2}
00131
00132 #undef __FUNC__
00133 #define __FUNC__ "Parser_dhInit"
00134 void
00135 Parser_dhInit (Parser_dh p, int argc, char *argv[])
00136 {
00137 START_FUNC_DH_2 int j;
00138
00139
00140
00141
00142 init_from_default_settings_private (p);
00143 CHECK_V_ERROR;
00144
00145
00146 Parser_dhUpdateFromFile (p, "./database");
00147 CHECK_V_ERROR;
00148
00149
00150 for (j = 1; j < argc; ++j)
00151 {
00152 if (strcmp (argv[j], "-db_filename") == 0)
00153 {
00154 ++j;
00155 if (j < argc)
00156 {
00157 Parser_dhUpdateFromFile (p, argv[j]);
00158 CHECK_V_ERROR;
00159 }
00160 }
00161 }
00162
00163
00164 {
00165 int i = 0;
00166 while (i < argc)
00167 {
00168 if (argv[i][0] == '-')
00169 {
00170 char value[] = { "1" };
00171 bool flag = false;
00172 if (i + 1 < argc && argv[i + 1][0] == '-'
00173 && argv[i + 1][1] == '-')
00174 {
00175 flag = true;
00176 }
00177
00178 if ((i + 1 == argc || argv[i + 1][0] == '-') && !flag)
00179 {
00180 Parser_dhInsert (p, argv[i], value);
00181 }
00182 else if (flag)
00183 {
00184 Parser_dhInsert (p, argv[i], argv[i + 1] + 1);
00185 }
00186 else
00187 {
00188 Parser_dhInsert (p, argv[i], argv[i + 1]);
00189 }
00190 }
00191 ++i;
00192 }
00193 }
00194 END_FUNC_DH_2}
00195
00196
00197 #undef __FUNC__
00198 #define __FUNC__ "Parser_dhHasSwitch"
00199 bool
00200 Parser_dhHasSwitch (Parser_dh p, char *s)
00201 {
00202 START_FUNC_DH_2 bool has_switch = false;
00203 OptionsNode *node;
00204
00205 if (p != NULL && find (p, s, &node))
00206 {
00207 if (!strcmp (node->value, "0"))
00208 {
00209 has_switch = false;
00210 }
00211 else if (!strcmp (node->value, "false"))
00212 {
00213 has_switch = false;
00214 }
00215 else if (!strcmp (node->value, "False"))
00216 {
00217 has_switch = false;
00218 }
00219 else if (!strcmp (node->value, "FALSE"))
00220 {
00221 has_switch = false;
00222 }
00223 else
00224 {
00225 has_switch = true;
00226 }
00227 }
00228 END_FUNC_VAL_2 (has_switch)}
00229
00230
00231
00232
00233 #undef __FUNC__
00234 #define __FUNC__ "Parser_dhReadInt"
00235 bool
00236 Parser_dhReadInt (Parser_dh p, char *in, int *out)
00237 {
00238 START_FUNC_DH_2 bool has_switch = false;
00239 OptionsNode *node;
00240
00241 if (p != NULL && find (p, in, &node))
00242 {
00243 *out = atoi (node->value);
00244 if (!strcmp (node->value, "0"))
00245 {
00246 has_switch = false;
00247 }
00248 else
00249 {
00250 has_switch = true;
00251 }
00252 }
00253 END_FUNC_VAL_2 (has_switch)}
00254
00255
00256 #undef __FUNC__
00257 #define __FUNC__ "Parser_dhReadDouble"
00258 bool
00259 Parser_dhReadDouble (Parser_dh p, char *in, double *out)
00260 {
00261 START_FUNC_DH_2 bool optionExists = false;
00262 OptionsNode *node;
00263
00264 if (p != NULL && find (p, in, &node))
00265 {
00266 *out = atof (node->value);
00267 optionExists = true;
00268 }
00269 END_FUNC_VAL_2 (optionExists)}
00270
00271 #undef __FUNC__
00272 #define __FUNC__ "Parser_dhReadString"
00273 bool
00274 Parser_dhReadString (Parser_dh p, char *in, char **out)
00275 {
00276 START_FUNC_DH_2 bool optionExists = false;
00277 OptionsNode *node;
00278
00279 if (p != NULL && find (p, in, &node))
00280 {
00281 *out = node->value;
00282 optionExists = true;
00283 }
00284 END_FUNC_VAL_2 (optionExists)}
00285
00286
00287 #undef __FUNC__
00288 #define __FUNC__ "Parser_dhPrint"
00289 void
00290 Parser_dhPrint (Parser_dh p, FILE * fp, bool allPrint)
00291 {
00292 START_FUNC_DH_2 OptionsNode * ptr = p->head;
00293
00294 if (fp == NULL)
00295 SET_V_ERROR ("fp == NULL");
00296
00297 if (myid_dh == 0 || allPrint)
00298 {
00299 fprintf (fp, "------------------------ registered options:\n");
00300 if (ptr == NULL)
00301 {
00302 fprintf (fp, "Parser object is invalid; nothing to print!\n");
00303 }
00304 else
00305 {
00306 ptr = ptr->next;
00307 while (ptr != NULL)
00308 {
00309 fprintf (fp, " %s %s\n", ptr->name, ptr->value);
00310 fflush (fp);
00311 ptr = ptr->next;
00312 }
00313 }
00314 fprintf (fp, "\n");
00315 fflush (fp);
00316 }
00317 END_FUNC_DH_2}
00318
00319 #undef __FUNC__
00320 #define __FUNC__ "Parser_dhInsert"
00321 void
00322 Parser_dhInsert (Parser_dh p, char *option, char *value)
00323 {
00324 START_FUNC_DH_2 OptionsNode * node;
00325 int length;
00326
00327 if (p == NULL)
00328 goto PARSER_NOT_INITED;
00329
00330
00331 if (find (p, option, &node))
00332 {
00333 int length2 = strlen (node->value) + 1;
00334 length = strlen (value) + 1;
00335 if (length2 < length)
00336 {
00337 FREE_DH (node->value);
00338 node->value = (char *) MALLOC_DH (length * sizeof (char));
00339 CHECK_V_ERROR;
00340 }
00341 strcpy (node->value, value);
00342 }
00343
00344 else
00345 {
00346 node = p->tail;
00347 p->tail = node->next = (OptionsNode *) MALLOC_DH (sizeof (OptionsNode));
00348 CHECK_V_ERROR;
00349 node = node->next;
00350 length = strlen (option) + 1;
00351 node->name = (char *) MALLOC_DH (length * sizeof (char));
00352 CHECK_V_ERROR;
00353 strcpy (node->name, option);
00354 length = strlen (value) + 1;
00355 node->value = (char *) MALLOC_DH (length * sizeof (char));
00356 CHECK_V_ERROR;
00357 strcpy (node->value, value);
00358 node->next = NULL;
00359 }
00360
00361 PARSER_NOT_INITED:
00362 ;
00363
00364 END_FUNC_DH_2}
00365
00366 #undef __FUNC__
00367 #define __FUNC__ "find"
00368 bool
00369 find (Parser_dh p, char *option, OptionsNode ** ptr)
00370 {
00371 START_FUNC_DH_2 OptionsNode * tmpPtr = p->head;
00372 bool foundit = false;
00373 while (tmpPtr != NULL)
00374 {
00375 if (strcmp (tmpPtr->name, option) == 0)
00376 {
00377 foundit = true;
00378 *ptr = tmpPtr;
00379 break;
00380 }
00381 tmpPtr = tmpPtr->next;
00382 }
00383 END_FUNC_VAL_2 (foundit)}
00384
00385
00386 #undef __FUNC__
00387 #define __FUNC__ "init_from_default_settings_private"
00388 void
00389 init_from_default_settings_private (Parser_dh p)
00390 {
00391 START_FUNC_DH_2
00392
00393
00394
00395 Parser_dhInsert (p, "-sig_dh", "1");
00396 CHECK_V_ERROR;
00397
00398
00399 Parser_dhInsert (p, "-px", "1");
00400 CHECK_V_ERROR;
00401 Parser_dhInsert (p, "-py", "1");
00402 CHECK_V_ERROR;
00403 Parser_dhInsert (p, "-pz", "0");
00404 CHECK_V_ERROR;
00405 Parser_dhInsert (p, "-m", "4");
00406 CHECK_V_ERROR;
00407
00408 Parser_dhInsert (p, "-xx_coeff", "-1.0");
00409 CHECK_V_ERROR;
00410 Parser_dhInsert (p, "-yy_coeff", "-1.0");
00411 CHECK_V_ERROR;
00412 Parser_dhInsert (p, "-zz_coeff", "-1.0");
00413 CHECK_V_ERROR;
00414
00415 Parser_dhInsert (p, "-level", "1");
00416 CHECK_V_ERROR;
00417
00418 Parser_dhInsert (p, "-printStats", "0");
00419 CHECK_V_ERROR;
00420 END_FUNC_DH_2}