/* parseSetMemType * * "pzText" points to the character after "members=" * What should follow is a name of a "set membership". * A collection of bit flags. */ static char* parseSetMemType( tOptions* pOpts, char* pzText, tOptionValue* pType ) { return skipUnknown( pzText ); }
/* 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; }
/* parseLoadMode * * "pzText" points to some name character. We check for "cooked" or * "uncooked" or "keep". This function should handle any attribute * that does not have an associated value. */ static char* parseLoadMode( char* pzText, tOptionLoadMode* pMode ) { { size_t len = strlen(zLoadCooked); if (strncmp( pzText, zLoadCooked, len ) == 0) { if ( (pzText[len] == '>') || (pzText[len] == '/') || isspace((int)pzText[len])) { *pMode = OPTION_LOAD_COOKED; return pzText + len; } goto unknown; } } { size_t len = strlen(zLoadUncooked); if (strncmp( pzText, zLoadUncooked, len ) == 0) { if ( (pzText[len] == '>') || (pzText[len] == '/') || isspace((int)pzText[len])) { *pMode = OPTION_LOAD_UNCOOKED; return pzText + len; } goto unknown; } } { size_t len = strlen(zLoadKeep); if (strncmp( pzText, zLoadKeep, len ) == 0) { if ( (pzText[len] == '>') || (pzText[len] == '/') || isspace((int)pzText[len])) { *pMode = OPTION_LOAD_KEEP; return pzText + len; } goto unknown; } } unknown: return skipUnknown( pzText ); }
/* parseValueType * * "pzText" points to the character after "type=" */ static char* parseValueType( char* pzText, tOptionValue* pType ) { { size_t len = strlen(zLtypeString); if (strncmp( pzText, zLtypeString, len ) == 0) { if ((pzText[len] == '>') || isspace((int)pzText[len])) { pType->valType = OPARG_TYPE_STRING; return pzText + len; } goto unknown; } } { size_t len = strlen(zLtypeInteger); if (strncmp( pzText, zLtypeInteger, len ) == 0) { if ((pzText[len] == '>') || isspace((int)pzText[len])) { pType->valType = OPARG_TYPE_NUMERIC; return pzText + len; } goto unknown; } } { size_t len = strlen(zLtypeBool); if (strncmp( pzText, zLtypeBool, len ) == 0) { if ((pzText[len] == '>') || isspace(pzText[len])) { pType->valType = OPARG_TYPE_BOOLEAN; return pzText + len; } goto unknown; } } { size_t len = strlen(zLtypeKeyword); if (strncmp( pzText, zLtypeKeyword, len ) == 0) { if ((pzText[len] == '>') || isspace((int)pzText[len])) { pType->valType = OPARG_TYPE_ENUMERATION; return pzText + len; } goto unknown; } } { size_t len = strlen(zLtypeSetMembership); if (strncmp( pzText, zLtypeSetMembership, len ) == 0) { if ((pzText[len] == '>') || isspace((int)pzText[len])) { pType->valType = OPARG_TYPE_MEMBERSHIP; return pzText + len; } goto unknown; } } { size_t len = strlen(zLtypeNest); if (strncmp( pzText, zLtypeNest, len ) == 0) { if ((pzText[len] == '>') || isspace((int)pzText[len])) { pType->valType = OPARG_TYPE_HIERARCHY; return pzText + len; } goto unknown; } } unknown: pType->valType = OPARG_TYPE_NONE; return skipUnknown( pzText ); }
/* parseAttributes * * Parse the various attributes of an XML-styled config file entry */ LOCAL char* parseAttributes( tOptions* pOpts, char* pzText, tOptionLoadMode* pMode, tOptionValue* pType ) { size_t len; do { if (! IS_WHITESPACE_CHAR(*pzText)) switch (*pzText) { case '/': pType->valType = OPARG_TYPE_NONE; case '>': return pzText; default: case NUL: return NULL; } while (IS_WHITESPACE_CHAR(*++pzText)) ; len = 0; while (IS_LOWER_CASE_CHAR(pzText[len])) len++; switch (find_xat_attribute_id(pzText, len)) { case XAT_KWD_TYPE: pzText = parseValueType( pzText+len, pType ); break; case XAT_KWD_WORDS: pzText = parseKeyWordType( pOpts, pzText+len, pType ); break; case XAT_KWD_MEMBERS: pzText = parseSetMemType( pOpts, pzText+len, pType ); break; case XAT_KWD_COOKED: pzText += len; if (! IS_END_XML_TOKEN_CHAR(*pzText)) goto invalid_kwd; *pMode = OPTION_LOAD_COOKED; break; case XAT_KWD_UNCOOKED: pzText += len; if (! IS_END_XML_TOKEN_CHAR(*pzText)) goto invalid_kwd; *pMode = OPTION_LOAD_UNCOOKED; break; case XAT_KWD_KEEP: pzText += len; if (! IS_END_XML_TOKEN_CHAR(*pzText)) goto invalid_kwd; *pMode = OPTION_LOAD_KEEP; break; default: case XAT_KWD_INVALID: invalid_kwd: pType->valType = OPARG_TYPE_NONE; return skipUnknown( pzText ); } } while (pzText != NULL); return pzText; }