git-svn-id: https://svn.microneil.com/svn/CodeDweller/branches/adeniz_1@68 d34b734f-a00e-4b39-a726-e4eeb87269abadeniz_1
| @@ -598,6 +598,16 @@ ConfigurationElement& ConfigurationElement::mapTo( | |||
| return(*this); // then dereference and return myself. | |||
| } | |||
| ConfigurationElement& ConfigurationElement::RawData(std::string &RawData) { | |||
| myRawTranslator.setRawDataAssignment(RawData); | |||
| return(*this); | |||
| } | |||
| ConfigurationElement& ConfigurationElement::RawIndex(int &Index, int &Endex) { | |||
| myRawTranslator.setIndexAssignment(Index, Endex); | |||
| return(*this); | |||
| } | |||
| void ConfigurationElement::initialize() { // Reset all translators to defaults. | |||
| // Initialize the elements below me | |||
| @@ -702,8 +712,6 @@ bool ConfigurationElement::interpret(ConfigurationData& Data) { | |||
| ++Index; // past it and scan for our name. | |||
| } | |||
| startOfElementIndex = Data.Index(); // AVD | |||
| for(unsigned int I = 0; I < myName.length(); I++) { // For the length of our name, | |||
| char x = Data.Data(Index + I); // get each corresponding Data byte | |||
| if(x != myName.at(I)) { // check it sudden death style. | |||
| @@ -790,6 +798,8 @@ bool ConfigurationElement::interpret(ConfigurationData& Data) { | |||
| // may have contained, and we are syncrhonized with Data. | |||
| if(ThisIsAnEmptyElement) { // If the element was self closing then | |||
| myEndex = Data.Index() - 1; | |||
| myRawTranslator.translate(myIndex, myEndex, Data); | |||
| runEndConfigurators(Data); // run the End Configurators and return | |||
| return true; // true to the caller. | |||
| } | |||
| @@ -945,7 +955,9 @@ bool ConfigurationElement::interpret(ConfigurationData& Data) { | |||
| } | |||
| // And finally, after all is done successfully... | |||
| myEndex = Data.Index() - 1; | |||
| myRawTranslator.translate(myIndex, myEndex, Data); | |||
| runEndConfigurators(Data); // Launch the End Configurators. | |||
| return true; // Return our success! | |||
| } | |||
| @@ -1225,6 +1237,20 @@ ConfigurationData::~ConfigurationData() { | |||
| myLine = 0; | |||
| } | |||
| std::string ConfigurationData::extract(int Index, int Endex) const { | |||
| int Start = Index, End = Endex; | |||
| if (0 == myBufferSize) return std::string(""); | |||
| if (Start < 0) Start = 0; | |||
| if (Start >= myBufferSize) Start = myBufferSize - 1; | |||
| if (Start > End) End = Start; | |||
| if (End >= myBufferSize) End = myBufferSize - 1; | |||
| return std::string(myDataBuffer, Start, End - Start + 1); | |||
| } | |||
| //// Utilities ///////////////////////////////////////////////////////////////// | |||
| // SetTrueOnComplete Configurator ////////////////////////////////////////////// | |||
| @@ -124,6 +124,17 @@ class ConfigurationTranslator; | |||
| class ConfigurationMnemonic; // Mnemonics exist | |||
| class Configurator; // Configurators exist | |||
| class RawTranslator { | |||
| private: | |||
| int *IndexAssignment = 0; | |||
| int *EndexAssignment = 0; | |||
| std::string *RawDataAssignment = 0; | |||
| public: | |||
| void setRawDataAssignment(std::string &RawData); | |||
| void setIndexAssignment(int &Index, int &Endex); | |||
| void translate(int Index, int Endex, ConfigurationData &Data); | |||
| }; | |||
| //// Configuration Element ///////////////////////////////////////////////////// | |||
| // | |||
| // Elements make up the core of a configuration. That is, a configuration is a | |||
| @@ -150,10 +161,13 @@ class ConfigurationElement { | |||
| std::list<ConfigurationMnemonic*> myMnemonics; // They may have a list of mnemonics. | |||
| std::list<ConfigurationTranslator*> myTranslators; // They may have a list of translators. | |||
| RawTranslator myRawTranslator; // Provides entire element. | |||
| // During Interpret() operations we keep track of where we are seen... | |||
| int myLine; // Last line number I was seen on. | |||
| int myIndex; // Last char position I was seen on. | |||
| int myEndex; // Last char of element. | |||
| int myLength; // Last segment length. | |||
| bool myCleanFlag; // Keep track of initialization. | |||
| @@ -252,6 +266,12 @@ class ConfigurationElement { | |||
| const std::string Name, // requires a name, of course, | |||
| bool& x, bool init = false); // Map to a boolean. | |||
| ConfigurationElement& RawData( // Copy entire element to | |||
| std::string &Element); // a string. | |||
| ConfigurationElement& RawIndex( // Copy indices of the entire | |||
| int &Index, int &Endex); // element. | |||
| // End methods for heading back up the tree at the end of an element. | |||
| class EndNameDoesNotMatch {}; // Throw when End(name) doesn't match. | |||
| @@ -376,8 +396,6 @@ class ConfigurationElement { | |||
| bool interpret(ConfigurationData& Data); // (re) Interpret this data. | |||
| int startOfElementIndex; // AVD | |||
| }; | |||
| //// Configuration Attribute /////////////////////////////////////////////////// | |||
| @@ -599,7 +617,7 @@ class ConfigurationData { | |||
| int Index(int i); // Changes the current Index. | |||
| int Line(); // Reads the current Line number. | |||
| int addNewLines(int Count); // Increments the Line number. | |||
| char const *Buffer() const { return myDataBuffer; } // AVD | |||
| std::string extract(int Index, int Endex) const ; // Return substring of buffer. | |||
| std::stringstream Log; // Convenient Interpret log. | |||
| @@ -559,6 +559,21 @@ inline void BoolTranslator::initialize() { | |||
| myVariable = myInitializer; // Revert to the initializer value. | |||
| } | |||
| inline void RawTranslator::setRawDataAssignment(std::string &RawData) { | |||
| RawDataAssignment = &RawData; | |||
| } | |||
| inline void RawTranslator::setIndexAssignment(int &Index, int &Endex) { | |||
| IndexAssignment = &Index; | |||
| EndexAssignment = &Endex; | |||
| } | |||
| inline void RawTranslator::translate(int Index, int Endex, ConfigurationData &Data) { | |||
| if (0 != RawDataAssignment) *RawDataAssignment = Data.extract(Index, Endex); | |||
| if (0 != IndexAssignment) *IndexAssignment = Index; | |||
| if (0 != EndexAssignment) *EndexAssignment = Endex; | |||
| } | |||
| //// Configuration Mnemonic //////////////////////////////////////////////////// | |||
| inline ConfigurationMnemonic::ConfigurationMnemonic( // To make one, provide both parts. | |||