diff options
Diffstat (limited to 'src/libopts/configfile.c')
-rw-r--r-- | src/libopts/configfile.c | 108 |
1 files changed, 58 insertions, 50 deletions
diff --git a/src/libopts/configfile.c b/src/libopts/configfile.c index e3da1bb0c4..56e22b5db7 100644 --- a/src/libopts/configfile.c +++ b/src/libopts/configfile.c @@ -1,7 +1,7 @@ /** * \file configfile.c * - * Time-stamp: "2012-02-25 12:54:32 bkorb" + * Time-stamp: "2012-03-31 13:56:11 bkorb" * * configuration/rc/ini file handling. * @@ -52,7 +52,7 @@ static int parse_xml_encoding(char ** ppz); static char * -trim_xml_text(char * pztxt, char const * pznm, tOptionLoadMode mode); +trim_xml_text(char * intxt, char const * pznm, tOptionLoadMode mode); static void cook_xml_text(char * pzData); @@ -202,7 +202,7 @@ optionFindValue(const tOptDesc* pOptDesc, char const* pzName, } if (pRes == NULL) errno = ENOENT; - } while (0); + } while (false); return pRes; } @@ -210,6 +210,8 @@ optionFindValue(const tOptDesc* pOptDesc, char const* pzName, /*=export_func optionFindNextValue * + * FIXME: the handling of 'pzName' and 'pzVal' is just wrong. + * * what: find a hierarcicaly valued option instance * arg: + const tOptDesc* + pOptDesc + an option with a nested arg type + * arg: + const tOptionValue* + pPrevVal + the last entry + @@ -238,9 +240,12 @@ tOptionValue const * optionFindNextValue(const tOptDesc * pOptDesc, const tOptionValue * pPrevVal, char const * pzName, char const * pzVal) { - int foundOldVal = 0; + bool old_found = false; tOptionValue* pRes = NULL; + (void)pzName; + (void)pzVal; + if ( (pOptDesc == NULL) || (OPTST_GET_ARGTYPE(pOptDesc->fOptState) != OPARG_TYPE_HIERARCHY)) { errno = EINVAL; @@ -255,23 +260,18 @@ optionFindNextValue(const tOptDesc * pOptDesc, const tOptionValue * pPrevVal, int ct = pAL->useCt; void** ppOV = (void**)pAL->apzArgs; - if (ct == 0) { - errno = ENOENT; - break; - } - while (--ct >= 0) { tOptionValue* pOV = *(ppOV++); - if (foundOldVal) { + if (old_found) { pRes = pOV; break; } if (pOV == pPrevVal) - foundOldVal = 1; + old_found = true; } if (pRes == NULL) errno = ENOENT; - } while (0); + } while (false); return pRes; } @@ -431,7 +431,7 @@ file_preset(tOptions * opts, char const * fname, int dir) do { optst.flags = st_flags; - while (IS_WHITESPACE_CHAR(*ftext)) ftext++; + ftext = SPN_WHITESPACE_CHARS(ftext); if (IS_VAR_FIRST_CHAR(*ftext)) { ftext = handle_cfg(opts, &optst, ftext, dir); @@ -508,8 +508,8 @@ handle_cfg(tOptions * pOpts, tOptState * pOS, char * pzText, int dir) if (pzEnd == NULL) return pzText + strlen(pzText); - while (IS_VALUE_NAME_CHAR(*pzText)) pzText++; - while (IS_WHITESPACE_CHAR(*pzText)) pzText++; + pzText = SPN_VALUE_NAME_CHARS(pzText); + pzText = SPN_WHITESPACE_CHARS(pzText); if (pzText > pzEnd) { name_only: *pzEnd++ = NUL; @@ -523,7 +523,7 @@ handle_cfg(tOptions * pOpts, tOptState * pOS, char * pzText, int dir) * is an invalid format and we give up parsing the text. */ if ((*pzText == '=') || (*pzText == ':')) { - while (IS_WHITESPACE_CHAR(*++pzText)) ; + pzText = SPN_WHITESPACE_CHARS(pzText+1); if (pzText > pzEnd) goto name_only; } else if (! IS_WHITESPACE_CHAR(pzText[-1])) @@ -630,9 +630,9 @@ handle_directive(tOptions * pOpts, char * pzText) static char * aoflags_directive(tOptions * pOpts, char * pzText) { - char * pz = pzText; + char * pz; - while (IS_WHITESPACE_CHAR(*++pz)) ; + pz = SPN_WHITESPACE_CHARS(pzText+1); pzText = strchr(pz, '>'); if (pzText != NULL) { @@ -665,7 +665,7 @@ program_directive(tOptions * pOpts, char * pzText) memcpy(ttl + sizeof(ttlfmt) - 1, zCfgProg, ttl_len - (sizeof(ttlfmt) - 1)); do { - while (IS_WHITESPACE_CHAR(*++pzText)) ; + pzText = SPN_WHITESPACE_CHARS(pzText+1); if ( (strneqvcmp(pzText, pOpts->pzProgName, (int)name_len) == 0) && (IS_END_XML_TOKEN_CHAR(pzText[name_len])) ) { @@ -809,28 +809,35 @@ parse_xml_encoding(char ** ppz) * except for OPTION_LOAD_UNCOOKED. */ static char * -trim_xml_text(char * pztxt, char const * pznm, tOptionLoadMode mode) +trim_xml_text(char * intxt, char const * pznm, tOptionLoadMode mode) { static char const fmt[] = "</%s>"; - char z[64], *pz = z; size_t len = strlen(pznm) + sizeof(fmt) - 2 /* for %s */; + char * etext; - if (len > sizeof(z)) - pz = AGALOC(len, "scan name"); + { + char z[64], *pz = z; + if (len >= sizeof(z)) + pz = AGALOC(len, "scan name"); + + len = sprintf(pz, fmt, pznm); + *intxt = ' '; + etext = strstr(intxt, pz); + if (pz != z) AGFREE(pz); + } - sprintf(pz, fmt, pznm); - *pztxt = ' '; - pztxt = strstr(pztxt, pz); - if (pz != z) AGFREE(pz); + if (etext == NULL) + return etext; - if (pztxt == NULL) - return pztxt; + { + char * result = etext + len; - if (mode != OPTION_LOAD_UNCOOKED) - while (IS_WHITESPACE_CHAR(pztxt[-1])) len++, pztxt--; + if (mode != OPTION_LOAD_UNCOOKED) + etext = SPN_WHITESPACE_BACK(intxt, etext); - *pztxt = NUL; - return pztxt + len - 1 /* for NUL byte */; + *etext = NUL; + return result; + } } /** @@ -889,14 +896,14 @@ handle_struct(tOptions * pOpts, tOptState * pOS, char * pzText, int dir) char* pzData; char* pcNulPoint; - while (IS_VALUE_NAME_CHAR(*pzText)) pzText++; + pzText = SPN_VALUE_NAME_CHARS(pzText); pcNulPoint = pzText; valu.valType = OPARG_TYPE_STRING; switch (*pzText) { case ' ': case '\t': - pzText = parseAttributes(pOpts, pzText, &mode, &valu); + pzText = parse_attrs(pOpts, pzText, &mode, &valu); if (*pzText == '>') break; if (*pzText != '/') @@ -933,7 +940,7 @@ handle_struct(tOptions * pOpts, tOptState * pOS, char * pzText, int dir) /* * Rejoin the name and value for parsing by "loadOptionLine()". - * Erase any attributes parsed by "parseAttributes()". + * Erase any attributes parsed by "parse_attrs()". */ memset(pcNulPoint, ' ', pzData - pcNulPoint); @@ -1159,11 +1166,8 @@ optionLoadOpt(tOptions * pOpts, tOptDesc * pOptDesc) * Parse the various attributes of an XML-styled config file entry */ LOCAL char* -parseAttributes( - tOptions* pOpts, - char* pzText, - tOptionLoadMode* pMode, - tOptionValue* pType ) +parse_attrs(tOptions * pOpts, char * pzText, tOptionLoadMode * pMode, + tOptionValue * pType) { size_t len; @@ -1177,9 +1181,8 @@ parseAttributes( case NUL: return NULL; } - while (IS_WHITESPACE_CHAR(*++pzText)) ; - len = 0; - while (IS_LOWER_CASE_CHAR(pzText[len])) len++; + pzText = SPN_WHITESPACE_CHARS(pzText+1); + len = SPN_LOWER_CASE_CHARS(pzText) - pzText; switch (find_xat_attribute_id(pzText, len)) { case XAT_KWD_TYPE: @@ -1237,6 +1240,9 @@ parseAttributes( static char* parse_keyword(tOptions * pOpts, char * pzText, tOptionValue * pType) { + (void)pOpts; + (void)pType; + return skip_unkn(pzText); } @@ -1249,6 +1255,9 @@ parse_keyword(tOptions * pOpts, char * pzText, tOptionValue * pType) static char* parse_set_mem(tOptions * pOpts, char * pzText, tOptionValue * pType) { + (void)pOpts; + (void)pType; + return skip_unkn(pzText); } @@ -1264,16 +1273,15 @@ parse_value(char * pzText, tOptionValue * pType) if (*(pzText++) != '=') goto woops; - while (IS_OPTION_NAME_CHAR(pzText[len])) len++; - pzText += len; + len = SPN_OPTION_NAME_CHARS(pzText) - pzText; - if ((len == 0) || (! IS_END_XML_TOKEN_CHAR(*pzText))) { + if ((len == 0) || (! IS_END_XML_TOKEN_CHAR(pzText[len]))) { woops: pType->valType = OPARG_TYPE_NONE; - return skip_unkn(pzText); + return skip_unkn(pzText + len); } - switch (find_value_type_id(pzText - len, len)) { + switch (find_value_type_id(pzText, len)) { default: case VTP_KWD_INVALID: goto woops; @@ -1304,7 +1312,7 @@ parse_value(char * pzText, tOptionValue * pType) pType->valType = OPARG_TYPE_HIERARCHY; } - return pzText; + return pzText + len; } |