// TODO: Change all the 0 linenos below into real line numbers void parseConfigFile(const char* configFilename, int32_t lineno, int32_t filename) { FILE* argFile = fopen(configFilename, "r"); if (!argFile) { char* message = chpl_glom_strings(2, "Unable to open ", configFilename); chpl_error(message, lineno, filename); } chpl_saveFilename(configFilename); // CHPL_FILE_IDX_SAVED_FILENAME will now // give us configFilename while (!feof(argFile)) { int numScans = 0; char setConfigBuffer[_default_string_length]; numScans = fscanf(argFile, _default_format_read_string, setConfigBuffer); if (numScans == 1) { if (*setConfigBuffer == '#') { if (!feof(argFile)) { do { char ch = fgetc(argFile); if (ch == '\n') break; } while (!feof(argFile)); } } else if (!aParsedString(argFile, setConfigBuffer, 0, CHPL_FILE_IDX_SAVED_FILENAME)) { char* equalsSign; const char* moduleName; char* varName; configVarType *configVar = breakIntoPiecesAndLookup(setConfigBuffer, &equalsSign, &moduleName, &varName, 0, CHPL_FILE_IDX_SAVED_FILENAME); if (configVar == NULL) { handleUnexpectedConfigVar(moduleName, varName, 0, CHPL_FILE_IDX_SAVED_FILENAME); } else { char* value = equalsSign + 1; if (equalsSign && *value) { initSetValue(varName, value, moduleName, 0, CHPL_FILE_IDX_SAVED_FILENAME); } else { char configValBuffer[_default_string_length]; numScans = fscanf(argFile, _default_format_read_string, configValBuffer); if (numScans != 1) { char *message = chpl_glom_strings(3, "Configuration variable '", varName, "' is missing its initialization value"); chpl_error(message, 0, CHPL_FILE_IDX_SAVED_FILENAME); } else { initSetValue(varName, configValBuffer, moduleName, 0, CHPL_FILE_IDX_SAVED_FILENAME); } } } } } } fclose(argFile); }
// TODO: Change all the 0 linenos below into real line numbers void parseConfigFile(const char* configFilename, int32_t lineno, chpl_string filename) { FILE* argFile = fopen(configFilename, "r"); if (!argFile) { char* message = chpl_glom_strings(2, "Unable to open ", configFilename); chpl_error(message, lineno, filename); } while (!feof(argFile)) { int numScans = 0; char setConfigBuffer[_default_string_length]; numScans = fscanf(argFile, _default_format_read_string, setConfigBuffer); if (numScans == 1) { if (!aParsedString(argFile, setConfigBuffer, 0, configFilename)) { char* equalsSign; const char* moduleName; char* varName; configVarType* configVar = breakIntoPiecesAndLookup(setConfigBuffer, &equalsSign, &moduleName, &varName, 0, configFilename); if (configVar == NULL) { handleUnexpectedConfigVar(moduleName, varName, 0, configFilename); } else { char* value = equalsSign + 1; checkDeprecatedConfig(varName, equalsSign ? value : equalsSign); if (equalsSign && *value) { initSetValue(varName, value, moduleName, 0, configFilename); } else { char configValBuffer[_default_string_length]; numScans = fscanf(argFile, _default_format_read_string, configValBuffer); if (numScans != 1) { char* message = chpl_glom_strings(3, "Configuration variable '", varName, "' is missing its initialization value"); chpl_error(message, 0, configFilename); } else { initSetValue(varName, configValBuffer, moduleName, 0, configFilename); } } } } } } fclose(argFile); }
int handlePossibleConfigVar(int* argc, char* argv[], int argnum, int32_t lineno, chpl_string filename) { int retval = 0; int arglen = strlen(argv[argnum]+2)+1; char* argCopy = chpl_mem_allocMany(arglen, sizeof(char), CHPL_RT_MD_CONFIG_ARG_COPY_DATA, argnum, "<command-line>"); char* equalsSign; const char* moduleName; char* varName; configVarType* configVar; strcpy(argCopy, argv[argnum]+2); configVar = breakIntoPiecesAndLookup(argCopy, &equalsSign, &moduleName, &varName, lineno, filename); if (configVar == NULL) { if (argv[argnum][1] == '-') { // this is a -- argument retval = handleNonstandardArg(argc, argv, argnum, lineno, filename); } else { // this is a -s argument handleUnexpectedConfigVar(moduleName, varName, lineno, filename); } } else { char* value = equalsSign + 1; checkDeprecatedConfig(varName, equalsSign ? value : equalsSign); if (equalsSign && *value) { initSetValue(varName, value, moduleName, lineno, filename); } else if (!strcmp(configVar->defaultValue, "bool")) { initSetValue(varName, "true", moduleName, lineno, filename); } else { if (argnum + 1 >= *argc) { char* message = chpl_glom_strings(3, "Configuration variable '", varName, "' is missing its initialization value"); chpl_error(message, lineno, filename); } else { initSetValue(varName, argv[argnum+1], moduleName, lineno, filename); retval = 1; } } } chpl_mem_free(argCopy, argnum, "<command-line>"); return retval; }
void parseArgs(chpl_bool isLauncher, chpl_parseArgsMode_t mode, int* argc, char* argv[]) { int i; int printHelp = 0; int printAbout = 0; int origargc = *argc; int stop_parsing = 0; // // Handle the pre-parse for '-E' arguments separately. // if (mode == parse_dash_E) { assert(!isLauncher); parseDashEArgs(argc, argv); return; } for (i = 1; i < *argc; i++) { const char* filename = "<command-line arg>"; int lineno = i + (origargc - *argc); int argLength = 0; const char* currentArg = argv[i]; argLength = strlen(currentArg); if (mainHasArgs && (stop_parsing || argLength < 2)) { /* update the argv structure passed to a Chapel program, but don't parse * the arguments */ chpl_gen_main_arg.argv[chpl_gen_main_arg.argc] = argv[i]; chpl_gen_main_arg.argc++; continue; } /* if the Chapel main takes arguments, then "--" is a magic argument that * will prevent parsing of any additional arguments */ if (mainHasArgs && strcmp(currentArg, "--") == 0) { stop_parsing = 1; continue; } if (argLength < 2) { const char* message = chpl_glom_strings(3, "\"", currentArg, "\" is not a valid argument"); chpl_error(message, lineno, filename); } switch (currentArg[0]) { case '-': switch (currentArg[1]) { case '-': { const char* flag = currentArg + 2; if (strcmp(flag, "gdb") == 0) { gdbFlag = i; break; } if (strcmp(flag, "help") == 0) { printHelp = 1; chpl_gen_main_arg.argv[chpl_gen_main_arg.argc] = "--help"; chpl_gen_main_arg.argc++; break; } if (strcmp(flag, "about") == 0) { printAbout = 1; break; } if (strcmp(flag, "verbose") == 0) { verbosity=2; break; } if (strcmp(flag, "blockreport") == 0) { blockreport = 1; break; } if (strcmp(flag, "taskreport") == 0) { taskreport = 1; break; } if (strcmp(flag, "quiet") == 0) { verbosity = 0; break; } if (argLength < 3) { char* message = chpl_glom_strings(3, "\"", currentArg, "\" is not a valid argument"); chpl_error(message, lineno, filename); } i += handlePossibleConfigVar(argc, argv, i, lineno, filename); break; } case 'a': if (currentArg[2] == '\0') { printAbout = 1; } else { i += handleNonstandardArg(argc, argv, i, lineno, filename); } break; case 'b': if (currentArg[2] == '\0') { blockreport = 1; } else { i += handleNonstandardArg(argc, argv, i, lineno, filename); } break; case 'E': if (isLauncher) { i += handleNonstandardArg(argc, argv, i, lineno, filename); } else { // // We parse -E only in parse_dash_E mode, which is handled above. // if (currentArg[2] == '\0') { i++; } } break; case 'f': if (currentArg[2] == '\0') { i++; if (i >= *argc) { chpl_error("-f flag is missing <filename> argument", lineno, filename); } currentArg = argv[i]; parseConfigFile(currentArg, lineno, filename); } else { parseConfigFile(currentArg + 2, lineno, filename); } break; case 'h': if (currentArg[2] == '\0') { printHelp = 1; chpl_gen_main_arg.argv[chpl_gen_main_arg.argc] = "-h"; chpl_gen_main_arg.argc++; } else { i += handleNonstandardArg(argc, argv, i, lineno, filename); } break; case 'n': if (currentArg[2] == 'l') { const char* numPtr; if (currentArg[3] == '\0') { i++; if (i >= *argc) { chpl_error("-nl flag is missing <numLocales> argument", lineno, filename); } currentArg = argv[i]; numPtr = currentArg; } else { numPtr = &(currentArg[3]); } initSetValue("numLocales", numPtr, "Built-in", lineno, filename); break; } i += handleNonstandardArg(argc, argv, i, lineno, filename); break; case 'q': if (currentArg[2] == '\0') { verbosity = 0; } else { i += handleNonstandardArg(argc, argv, i, lineno, filename); } break; case 's': { if (argLength < 3) { char* message = chpl_glom_strings(3, "\"", currentArg, "\" is not a valid argument"); chpl_error(message, lineno, filename); } i += handlePossibleConfigVar(argc, argv, i, lineno, filename); break; } case 't': if (currentArg[2] == '\0') { taskreport = 1; } else { i += handleNonstandardArg(argc, argv, i, lineno, filename); } break; case 'v': if (currentArg[2] == '\0') { verbosity = 2; } else { i += handleNonstandardArg(argc, argv, i, lineno, filename); } break; default: i += handleNonstandardArg(argc, argv, i, lineno, filename); break; } break; default: i += handleNonstandardArg(argc, argv, i, lineno, filename); break; } } if (printAbout) { chpl_program_about(); chpl_exit_any(0); } if (printHelp) { if (!mainHasArgs) { printHelpTable(); printConfigVarTable(); chpl_exit_any(0); } } }
/* This function parses a config var of type string, and sets its value in the hash table. */ static int aParsedString(FILE* argFile, char* setConfigBuffer, int32_t lineno, int32_t filename) { char* equalsSign = strchr(setConfigBuffer, '='); int stringLength = strlen(setConfigBuffer); char firstChar; char* value; char lastChar; const char* moduleName; char* varName; if (!equalsSign || !(equalsSign + 1)) { return 0; } firstChar = equalsSign[1]; if ((firstChar != '"') && (firstChar != '\'')) { return 0; } value = equalsSign + 2; *equalsSign = '\0'; lastChar = setConfigBuffer[stringLength - 1]; parseModVarName(setConfigBuffer, &moduleName, &varName); if ((firstChar != lastChar) || (strlen(value) == 0)) { int nextChar = fgetc(argFile); do { switch (nextChar) { case EOF: { char* message; setConfigBuffer[stringLength] = '\0'; message = chpl_glom_strings(2, "Found end of file while reading string: ", equalsSign + 1); chpl_error(message, lineno, filename); break; } case '\n': { char* message; setConfigBuffer[stringLength] = '\0'; message = chpl_glom_strings(2, "Found newline while reading string: ", equalsSign + 1); chpl_error(message, lineno, filename); break; } default: { if (stringLength >= _default_string_length - 1) { char dsl[1024]; char* message; sprintf(dsl, "%d", _default_string_length); message = chpl_glom_strings(2, "String exceeds the maximum string length of ", dsl); chpl_error(message, lineno, filename); } setConfigBuffer[stringLength] = nextChar; stringLength++; nextChar = fgetc(argFile); } } } while (nextChar != firstChar); } else { stringLength--; } setConfigBuffer[stringLength] = '\0'; initSetValue(varName, value, moduleName, lineno, filename); return 1; }