move the key splitting to somewhere more private

main
Alan Francis 1 year ago
parent c181c7b60c
commit 83ff97feaf
  1. 106
      configfile.c
  2. 2
      configfile.h
  3. 93
      configmodel.c
  4. 4
      configmodel.h
  5. 4
      sectionstore.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);
}

@ -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);

@ -2,6 +2,7 @@
#include "containers/linearray.h"
#include "containers/sectionarray.h"
#include "containers/stringarray.h"
#include <proto/exec.h>
#include <proto/dos.h>
#include <string.h>
@ -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)
{

@ -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

@ -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;

Loading…
Cancel
Save