summaryrefslogtreecommitdiff
path: root/src/libopts/configfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libopts/configfile.c')
-rw-r--r--src/libopts/configfile.c108
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;
}