/* parseValueType * * "pzText" points to the character after "type=" */ static char* parseValueType( char* pzText, tOptionValue* pType ) { size_t len = 0; if (*(pzText++) != '=') goto woops; while (IS_OPTION_NAME_CHAR(pzText[len])) len++; pzText += len; if ((len == 0) || (! IS_END_XML_TOKEN_CHAR(*pzText))) { woops: pType->valType = OPARG_TYPE_NONE; return skipUnknown( pzText ); } switch (find_value_type_id(pzText - len, len)) { default: case VTP_KWD_INVALID: goto woops; case VTP_KWD_STRING: pType->valType = OPARG_TYPE_STRING; break; case VTP_KWD_INTEGER: pType->valType = OPARG_TYPE_NUMERIC; break; case VTP_KWD_BOOL: case VTP_KWD_BOOLEAN: pType->valType = OPARG_TYPE_BOOLEAN; break; case VTP_KWD_KEYWORD: pType->valType = OPARG_TYPE_ENUMERATION; break; case VTP_KWD_SET: case VTP_KWD_SET_MEMBERSHIP: pType->valType = OPARG_TYPE_MEMBERSHIP; break; case VTP_KWD_NESTED: case VTP_KWD_HIERARCHY: pType->valType = OPARG_TYPE_HIERARCHY; } return pzText; }
/* * fixupSubblockString */ static char* fixupSubblockString(char const * pzSrc) { char * pzString; char * pzDest; char * pzCopy; pzString = strdup(pzSrc); /* * Make sure we find the '=' separator */ { char * p = strchr(pzString, '='); if (p == NULL) die(zNoList, pzString); /* * Trim the name */ pzDest = p++; while ((pzDest > pzString) && IS_HORIZ_WHITE_CHAR(pzDest[-1])) pzDest--; *(pzDest++) = NUL; /* * Make sure at least one attribute name is defined */ while (IS_WHITESPACE_CHAR(*p)) p++; if (*p == NUL) die(zNoList, pzString); pzCopy = p; } for (;;) { /* * Attribute names must start with an alpha */ if (! IS_ALPHABETIC_CHAR(*pzCopy)) { fprintf(stderr, "ERROR: attribute names must start " "with an alphabetic character:\n\t%s\n", pzString); USAGE(EXIT_FAILURE); } /* * Copy the name. */ while (IS_OPTION_NAME_CHAR(*pzCopy)) *pzDest++ = *pzCopy++; /* * Skip over one comma (optional) and any white space. * If there is a newline, it must be after the comma. */ while (IS_HORIZ_WHITE_CHAR(*pzCopy)) pzCopy++; if (*pzCopy == ',') pzCopy++; while (IS_WHITESPACE_CHAR(*pzCopy)) pzCopy++; if (*pzCopy == NUL) break; /* * The final string contains only one space between attributes */ *pzDest++ = ' '; } *pzDest = NUL; return pzString; }
/** * Load an option from a block of text. The text must start with the * configurable/option name and be followed by its associated value. * That value may be processed in any of several ways. See "tOptionLoadMode" * in autoopts.h. * * @param[in,out] opts program options descriptor * @param[in,out] opt_state option processing state * @param[in,out] line source line with long option name in it * @param[in] direction current processing direction (preset or not) * @param[in] load_mode option loading mode (OPTION_LOAD_*) */ LOCAL void load_opt_line(tOptions * opts, tOptState * opt_state, char * line, tDirection direction, tOptionLoadMode load_mode ) { /* * When parsing a stored line, we only look at the characters after * a hyphen. Long names must always be at least two characters and * short options are always exactly one character long. */ line = SPN_LOAD_LINE_SKIP_CHARS(line); { char * arg = assemble_arg_val(line, load_mode); if (IS_OPTION_NAME_CHAR(line[1])) { if (! SUCCESSFUL(opt_find_long(opts, line, opt_state))) return; } else if (! SUCCESSFUL(opt_find_short(opts, *line, opt_state))) return; if ((! CALLED(direction)) && (opt_state->flags & OPTST_NO_INIT)) return; opt_state->pzOptArg = trim_quotes(arg); } if (! direction_ok(opt_state->flags, direction)) return; /* * Fix up the args. */ if (OPTST_GET_ARGTYPE(opt_state->pOD->fOptState) == OPARG_TYPE_NONE) { if (*opt_state->pzOptArg != NUL) return; opt_state->pzOptArg = NULL; } else if (opt_state->pOD->fOptState & OPTST_ARG_OPTIONAL) { if (*opt_state->pzOptArg == NUL) opt_state->pzOptArg = NULL; else { AGDUPSTR(opt_state->pzOptArg, opt_state->pzOptArg, "opt arg"); opt_state->flags |= OPTST_ALLOC_ARG; } } else { if (*opt_state->pzOptArg == NUL) opt_state->pzOptArg = zNil; else { AGDUPSTR(opt_state->pzOptArg, opt_state->pzOptArg, "opt arg"); opt_state->flags |= OPTST_ALLOC_ARG; } } { tOptionLoadMode sv = option_load_mode; option_load_mode = load_mode; handle_opt(opts, opt_state); option_load_mode = sv; } }