diff --git a/configfile.c b/configfile.c index 645eab1..2edd781 100644 --- a/configfile.c +++ b/configfile.c @@ -103,105 +103,13 @@ StringArray ConfigFileSubsectionsForSection(CONFIGFILEPTR abstractConfigFile, CO return SectionStoreSubsectionsForSection(configFile->sectionStore, primarySection); } - -// a key is "foo.bar.baz.blah" where "foo" is the primary section name -// "bar.baz" is the secondary section name and "blah" is the variable name. -// this splits foo.bar.baz.blah into foo, bar.baz amd blah. -// section, subsection and variable. -// we'll get empty strings for the parts that arent present -StringArray ConfigFileSplitKeyCompletely(CONST_STRPTR key) -{ - StringArray result = StringArrayNew(); - StringArray parts = StringArrayNew(); - ULONG numberOfParts = 0; - - STRPTR token = NULL; - // we need to make a copy of the key because strtok modifies it. - STRPTR keyCopy = AllocVec(strlen(key)+1, MEMF_CLEAR); - CopyMem(key, keyCopy, strlen(key)); - - token = strtok(keyCopy, "."); - while (token != NULL) - { - StringArrayAppendAndRetain(parts, token); - token = strtok(NULL, "."); - } - FreeVec(keyCopy); - - // now we join all but the first and last part - numberOfParts = SizeOfArray(parts); - if( numberOfParts == 1 ) //just a variable ["","","var"] - { - StringArrayAppendAndRetain(result, ""); - StringArrayAppendAndRetain(result, ""); - StringArrayAppendAndRetain(result, (STRPTR)ArrayBackValue(STRPTR, parts)); - } - else if( numberOfParts == 2 ) // section and variable ["section","","var"] - { - StringArrayAppendAndRetain(result, StringArrayValues(parts)[0]); - StringArrayAppendAndRetain(result, ""); - StringArrayAppendAndRetain(result, StringArrayValues(parts)[1]); - } - else if( numberOfParts == 3 ) // section and subsection and variable ["section","subsec","var"] - { - StringArrayAppendAndRetain(result, StringArrayValues(parts)[0]); - StringArrayAppendAndRetain(result, StringArrayValues(parts)[1]); - StringArrayAppendAndRetain(result, StringArrayValues(parts)[2]); - } - else if( numberOfParts > 3 ) // subsections needs dotted ["section", "subsec1.subsec2", "var""] - { - StringArrayAppendAndRetain(result, StringArrayValues(parts)[0]); //section - - // start at index 1, and add (size -2 (start+end)) parts - StringArrayAppend(result, StringArrayJoinedParts(parts, '.', 1, SizeOfArray(parts)-2)); - - StringArrayAppendAndRetain(result, (STRPTR)ArrayBackValue(STRPTR, parts)); // variable - } - StringArrayFree(parts, TRUE); - return result; -} - -StringArray ConfigFileSplitKeyForVar(CONST_STRPTR key) -{ - // a key is "foo.bar.baz.blah" where "foo" is the primary section name - // "bar.baz" is the secondary section name and "blah" is the variable name. - // In this case we'll just break it down into the canonical section name, - // foo.bar.baz and the variable name blah. - - StringArray result = StringArrayNew(); - StringArray parts = StringArrayNew(); - STRPTR sectionPart = NULL; - STRPTR varPart = NULL; - - STRPTR token = NULL; - // we need to make a copy of the key because strtok modifies it. - STRPTR keyCopy = AllocVec(strlen(key)+1, MEMF_CLEAR); - CopyMem(key, keyCopy, strlen(key)); - - token = strtok(keyCopy, "."); - while (token != NULL) - { - StringArrayAppendAndRetain(parts, token); - token = strtok(NULL, "."); - } - FreeVec(keyCopy); - - // now we join all but the last part - sectionPart = StringArrayJoinedParts(parts, '.', 0, SizeOfArray(parts)-1); - StringArrayAppend(result, sectionPart); // its been alloced so dont copy - varPart = (STRPTR)ArrayBackValue(STRPTR, parts); - StringArrayAppendAndRetain(result, varPart); // its a reference so copy - StringArrayFree(parts, TRUE); - return result; -} - STRPTR ConfigFileGet(CONFIGFILEPTR abstractConfigFile, CONST_STRPTR compoundKey) { STRPTR result = NULL; struct ConfigFile* configFile = (struct ConfigFile*)abstractConfigFile; if( configFile != NULL ) { - StringArray split = ConfigFileSplitKeyForVar(compoundKey); + StringArray split = CompoundKeySplitKeyForVar(compoundKey); VARIABLEPTR var = SectionStoreGet(configFile->sectionStore, StringArrayValues(split)[0], StringArrayValues(split)[1]); if( var != NULL ) { @@ -221,7 +129,7 @@ StringArray ConfigFileGetAll(CONFIGFILEPTR abstractConfigFile, CONST_STRPTR comp struct ConfigFile* configFile = (struct ConfigFile*)abstractConfigFile; if( configFile != NULL ) { - StringArray split = ConfigFileSplitKeyForVar(compoundKey); + StringArray split = CompoundKeySplitKeyForVar(compoundKey); VariableArray vars = SectionStoreGetAll(configFile->sectionStore, StringArrayValues(split)[0], StringArrayValues(split)[1]); for( index = 0; index < SizeOfArray(vars); index++ ) { @@ -243,7 +151,7 @@ VOID ConfigFileAddVariable(CONFIGFILEPTR abstractConfigFile, CONST_STRPTR compou CONST_STRPTR varLine = NULL; LINEPTR line = NULL; - StringArray canonicalParts = ConfigFileSplitKeyForVar(compoundKey); + StringArray canonicalParts = CompoundKeySplitKeyForVar(compoundKey); var = VariableCreate(StringArrayValues(canonicalParts)[1], stringValue); varLine = VariableSerialize(var); line = LineNew(varLine); @@ -264,7 +172,7 @@ BOOL ConfigFileSet(CONFIGFILEPTR abstractConfigFile, CONST_STRPTR compoundKey, C struct ConfigFile* configFile = (struct ConfigFile*)abstractConfigFile; if( configFile != NULL ) { - StringArray parts = ConfigFileSplitKeyForVar(compoundKey); + StringArray parts = CompoundKeySplitKeyForVar(compoundKey); LineArray lines = SectionStoreFindLines(configFile->sectionStore, StringArrayValues(parts)[0], StringArrayValues(parts)[1]); if( SizeOfArray(lines) == 0 ) { @@ -299,7 +207,7 @@ VOID ConfigFileReplaceAll(CONFIGFILEPTR abstractConfigFile, CONST_STRPTR compoun struct ConfigFile* configFile = (struct ConfigFile*)abstractConfigFile; if( configFile != NULL ) { - StringArray parts = ConfigFileSplitKeyForVar(compoundKey); + StringArray parts = CompoundKeySplitKeyForVar(compoundKey); SectionStoreRemoveLines(configFile->sectionStore, StringArrayValues(parts)[0], StringArrayValues(parts)[1]); ConfigFileAddVariable( abstractConfigFile, compoundKey, stringValue); StringArrayFree(parts, TRUE); @@ -311,7 +219,7 @@ VOID ConfigFileUnset(CONFIGFILEPTR abstractConfigFile, CONST_STRPTR compoundKey, struct ConfigFile* configFile = (struct ConfigFile*)abstractConfigFile; if( configFile != NULL ) { - StringArray parts = ConfigFileSplitKeyCompletely(compoundKey); + StringArray parts = CompoundKeySplitKeyCompletely(compoundKey); StringArrayFree(parts, TRUE); @@ -323,7 +231,7 @@ VOID ConfigFileUnsetAll(CONFIGFILEPTR abstractConfigFile, CONST_STRPTR compoundK struct ConfigFile* configFile = (struct ConfigFile*)abstractConfigFile; if( configFile != NULL ) { - StringArray parts = ConfigFileSplitKeyCompletely(compoundKey); + StringArray parts = CompoundKeySplitKeyCompletely(compoundKey); StringArrayFree(parts, TRUE); } diff --git a/configfile.h b/configfile.h index 8f73de2..580c0a6 100644 --- a/configfile.h +++ b/configfile.h @@ -26,8 +26,6 @@ VOID ConfigFileRemoveSection(CONFIGFILEPTR abstractConfigFile, CONST_STRPTR cano VOID ConfigFileDump(CONFIGFILEPTR configFile); VOID ConfigFileSave(CONFIGFILEPTR configFile); VOID ConfigFileWrite(CONFIGFILEPTR abstractConfigFile, BPTR file); -StringArray ConfigFileSplitKeyForVar(CONST_STRPTR key); -StringArray ConfigFileSplitKeyCompletely(CONST_STRPTR key); StringArray ConfigFileSubsectionsForSection(CONFIGFILEPTR abstractConfigFile, CONST_STRPTR primarySection); diff --git a/configmodel.c b/configmodel.c index 00307e6..be95379 100644 --- a/configmodel.c +++ b/configmodel.c @@ -2,6 +2,7 @@ #include "containers/linearray.h" #include "containers/sectionarray.h" +#include "containers/stringarray.h" #include #include #include @@ -578,6 +579,98 @@ CONST_STRPTR VariableSerialize(VARIABLEPTR abstractVariable) return (CONST_STRPTR)result; } +// a key is "foo.bar.baz.blah" where "foo" is the primary section name +// "bar.baz" is the secondary section name and "blah" is the variable name. +// this splits foo.bar.baz.blah into foo, bar.baz amd blah. +// section, subsection and variable. +// we'll get empty strings for the parts that arent present +StringArray CompoundKeySplitKeyCompletely(CONST_STRPTR key) +{ + StringArray result = StringArrayNew(); + StringArray parts = StringArrayNew(); + ULONG numberOfParts = 0; + + STRPTR token = NULL; + // we need to make a copy of the key because strtok modifies it. + STRPTR keyCopy = AllocVec(strlen(key)+1, MEMF_CLEAR); + CopyMem(key, keyCopy, strlen(key)); + + token = strtok(keyCopy, "."); + while (token != NULL) + { + StringArrayAppendAndRetain(parts, token); + token = strtok(NULL, "."); + } + FreeVec(keyCopy); + + // now we join all but the first and last part + numberOfParts = SizeOfArray(parts); + if( numberOfParts == 1 ) //just a variable ["","","var"] + { + StringArrayAppendAndRetain(result, ""); + StringArrayAppendAndRetain(result, ""); + StringArrayAppendAndRetain(result, (STRPTR)ArrayBackValue(STRPTR, parts)); + } + else if( numberOfParts == 2 ) // section and variable ["section","","var"] + { + StringArrayAppendAndRetain(result, StringArrayValues(parts)[0]); + StringArrayAppendAndRetain(result, ""); + StringArrayAppendAndRetain(result, StringArrayValues(parts)[1]); + } + else if( numberOfParts == 3 ) // section and subsection and variable ["section","subsec","var"] + { + StringArrayAppendAndRetain(result, StringArrayValues(parts)[0]); + StringArrayAppendAndRetain(result, StringArrayValues(parts)[1]); + StringArrayAppendAndRetain(result, StringArrayValues(parts)[2]); + } + else if( numberOfParts > 3 ) // subsections needs dotted ["section", "subsec1.subsec2", "var""] + { + StringArrayAppendAndRetain(result, StringArrayValues(parts)[0]); //section + + // start at index 1, and add (size -2 (start+end)) parts + StringArrayAppend(result, StringArrayJoinedParts(parts, '.', 1, SizeOfArray(parts)-2)); + + StringArrayAppendAndRetain(result, (STRPTR)ArrayBackValue(STRPTR, parts)); // variable + } + StringArrayFree(parts, TRUE); + return result; +} + +StringArray CompoundKeySplitKeyForVar(CONST_STRPTR key) +{ + // a key is "foo.bar.baz.blah" where "foo" is the primary section name + // "bar.baz" is the secondary section name and "blah" is the variable name. + // In this case we'll just break it down into the canonical section name, + // foo.bar.baz and the variable name blah. + + StringArray result = StringArrayNew(); + StringArray parts = StringArrayNew(); + STRPTR sectionPart = NULL; + STRPTR varPart = NULL; + + STRPTR token = NULL; + // we need to make a copy of the key because strtok modifies it. + STRPTR keyCopy = AllocVec(strlen(key)+1, MEMF_CLEAR); + CopyMem(key, keyCopy, strlen(key)); + + token = strtok(keyCopy, "."); + while (token != NULL) + { + StringArrayAppendAndRetain(parts, token); + token = strtok(NULL, "."); + } + FreeVec(keyCopy); + + // now we join all but the last part + sectionPart = StringArrayJoinedParts(parts, '.', 0, SizeOfArray(parts)-1); + StringArrayAppend(result, sectionPart); // its been alloced so dont copy + varPart = (STRPTR)ArrayBackValue(STRPTR, parts); + StringArrayAppendAndRetain(result, varPart); // its a reference so copy + StringArrayFree(parts, TRUE); + return result; +} + + STATIC VOID downcaseString(STRPTR string) { diff --git a/configmodel.h b/configmodel.h index 526c401..80375cd 100644 --- a/configmodel.h +++ b/configmodel.h @@ -39,4 +39,8 @@ CONST_STRPTR VariableGetRawValue(VARIABLEPTR variable); VOID VariableFree(VARIABLEPTR variable); CONST_STRPTR VariableSerialize(VARIABLEPTR variable); +StringArray CompoundKeySplitKeyForVar(CONST_STRPTR key); +StringArray CompoundKeySplitKeyCompletely(CONST_STRPTR key); + + #endif \ No newline at end of file diff --git a/sectionstore.c b/sectionstore.c index e3f99b7..545ccaf 100644 --- a/sectionstore.c +++ b/sectionstore.c @@ -236,11 +236,11 @@ StringArray SectionStoreSubsectionsForSection(SECTIONSTOREPTR abstractSectionSto SECTIONPTR SectionStoreFindOrCreateSection(SECTIONSTOREPTR sectionStore, CONST_STRPTR compoundKey) { // now get the section - StringArray canonicalParts = ConfigFileSplitKeyForVar(compoundKey); + StringArray canonicalParts = CompoundKeySplitKeyForVar(compoundKey); SECTIONPTR section = SectionStoreGetSection(sectionStore, StringArrayValues(canonicalParts)[0]); if( section == NULL ) { - StringArray separateParts = ConfigFileSplitKeyCompletely(compoundKey); + StringArray separateParts = CompoundKeySplitKeyCompletely(compoundKey); CONST_STRPTR sectionLineText = NULL; LINEPTR sectionLine = NULL;