From 4295bf213ba548e7b8f9451212fee97c27bfce11 Mon Sep 17 00:00:00 2001 From: Peter Veenstra Date: Tue, 19 Apr 2005 15:30:03 +0000 Subject: [PATCH] Added new functions so you can find Sections from property names. Moved a few implementations from the header to the cpp file Reordered some stuff so every thing is present when it's encountered (inside a class) Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2179 --- include/setup.h | 94 +++++++++++++++++++++------------------------- src/misc/setup.cpp | 50 +++++++++++++++++++----- 2 files changed, 82 insertions(+), 62 deletions(-) diff --git a/include/setup.h b/include/setup.h index 8f944e43..e55b1973 100644 --- a/include/setup.h +++ b/include/setup.h @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: setup.h,v 1.18 2005-03-25 11:43:36 qbix79 Exp $ */ +/* $Id: setup.h,v 1.19 2005-04-19 15:29:59 qbix79 Exp $ */ #ifndef DOSBOX_SETUP_H #define DOSBOX_SETUP_H @@ -36,7 +36,7 @@ public: CommandLine(int argc,char * argv[]); CommandLine(char * name,char * cmdline); const char * GetFileName(){ return file_name.c_str();} - + bool FindExist(char * name,bool remove=false); bool FindHex(char * name,int & value,bool remove=false); bool FindInt(char * name,int & value,bool remove=false); @@ -122,25 +122,8 @@ public: void GetValuestring(char* str); }; -class Section; -class Module_base { - /* Base for all hardware and software "devices" */ -protected: - Section* m_configuration; -public: - Module_base(Section* configuration){m_configuration=configuration;}; -// Module_base(Section* configuration, SaveState* state) {}; - ~Module_base(){/*LOG_MSG("executed")*/;};//Destructors are required - /* Returns true if succesful.*/ - virtual bool Change_Config(Section* newconfig) {return false;} ; -}; - - class Section { -public: - Section(const char* _sectionname) { sectionname=_sectionname; } - virtual ~Section(){ExecuteDestroy(true); } - +private: typedef void (*SectionFunction)(Section*); /* Wrapper class around startup and shutdown functions. the variable * canchange indicates it can be called on configuration changes */ @@ -152,36 +135,31 @@ public: canchange=_ch; } }; - void AddInitFunction(SectionFunction func,bool canchange=false) {initfunctions.push_back(Function_wrapper(func,canchange));} - void AddDestroyFunction(SectionFunction func,bool canchange=false) {destroyfunctions.push_front(Function_wrapper(func,canchange));} - void ExecuteInit(bool initall=true) { - typedef std::list::iterator func_it; - for (func_it tel=initfunctions.begin(); tel!=initfunctions.end(); tel++){ - if(initall || (*tel).canchange) (*tel).function(this); - } - } - void ExecuteDestroy(bool destroyall=true) { - typedef std::list::iterator func_it; - for (func_it tel=destroyfunctions.begin(); tel!=destroyfunctions.end(); ){ - if(destroyall || (*tel).canchange) { - (*tel).function(this); - tel=destroyfunctions.erase(tel); //Remove destroyfunction once used - } else tel++; - } - } std::list initfunctions; std::list destroyfunctions; + std::string sectionname; +public: + Section(const char* _sectionname) { sectionname=_sectionname; } + + void AddInitFunction(SectionFunction func,bool canchange=false) {initfunctions.push_back(Function_wrapper(func,canchange));} + void AddDestroyFunction(SectionFunction func,bool canchange=false) {destroyfunctions.push_front(Function_wrapper(func,canchange));} + void ExecuteInit(bool initall=true); + void ExecuteDestroy(bool destroyall=true); + const char* GetName() {return sectionname.c_str();} + + virtual bool HasProperty(const char* _property)=0; virtual void HandleInputline(char * _line){} virtual void PrintData(FILE* outfile) {} - std::string sectionname; + virtual ~Section(){ExecuteDestroy(true); } }; class Section_prop:public Section { - public: +private: + std::list properties; + typedef std::list::iterator it; +public: Section_prop(const char* _sectionname):Section(_sectionname){} - //ExecuteDestroy should be here else the destroy functions use destroyed properties - ~Section_prop(){ExecuteDestroy(true);} void Add_int(const char* _propname, int _value=0); void Add_string(const char* _propname, char* _value=NULL); void Add_bool(const char* _propname, bool _value=false); @@ -195,9 +173,9 @@ class Section_prop:public Section { float Get_float(const char* _propname); void HandleInputline(char *gegevens); void PrintData(FILE* outfile); - - std::list properties; - typedef std::list::iterator it; + virtual bool HasProperty(const char* _property); + //ExecuteDestroy should be here else the destroy functions use destroyed properties + virtual ~Section_prop(){ExecuteDestroy(true);} }; class Section_line: public Section{ @@ -206,20 +184,27 @@ public: ~Section_line(){ExecuteDestroy(true);} void HandleInputline(char* gegevens); void PrintData(FILE* outfile); + virtual bool HasProperty(const char* _property); std::string data; }; class Config{ +public: + CommandLine * cmdline; +private: + std::list sectionlist; + typedef std::list::iterator it; + typedef std::list::reverse_iterator reverse_it; + void (* _start_function)(void); public: Config(CommandLine * cmd){ cmdline=cmd;} ~Config(); - CommandLine * cmdline; - Section * AddSection(const char * _name,void (*_initfunction)(Section*)); Section_line * AddSection_line(const char * _name,void (*_initfunction)(Section*)); Section_prop * AddSection_prop(const char * _name,void (*_initfunction)(Section*),bool canchange=false); Section* GetSection(const char* _sectionname); + Section* GetSectionFromProperty(const char* prop); void SetStartUp(void (*_function)(void)); void Init(); @@ -228,12 +213,17 @@ public: void PrintConfig(const char* configfilename); bool ParseConfigFile(const char* configfilename); void ParseEnv(char ** envp); - - std::list sectionlist; - typedef std::list::iterator it; - typedef std::list::reverse_iterator reverse_it; -private: - void (* _start_function)(void); }; +class Module_base { + /* Base for all hardware and software "devices" */ +protected: + Section* m_configuration; +public: + Module_base(Section* configuration){m_configuration=configuration;}; +// Module_base(Section* configuration, SaveState* state) {}; + ~Module_base(){/*LOG_MSG("executed")*/;};//Destructors are required + /* Returns true if succesful.*/ + virtual bool Change_Config(Section* newconfig) {return false;} ; +}; #endif diff --git a/src/misc/setup.cpp b/src/misc/setup.cpp index 34aeed34..9c4394a5 100644 --- a/src/misc/setup.cpp +++ b/src/misc/setup.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: setup.cpp,v 1.25 2005-03-25 12:00:52 qbix79 Exp $ */ +/* $Id: setup.cpp,v 1.26 2005-04-19 15:30:03 qbix79 Exp $ */ #include "dosbox.h" #include "cross.h" @@ -168,7 +168,15 @@ void Section_prop::PrintData(FILE* outfile){ } } - +bool Section_prop::HasProperty(const char* _property) { + for(it tel=properties.begin();tel!=properties.end();tel++){ + if(!strcasecmp((*tel)->propname.c_str(),_property)){ + return true; + } + } + return false; +} + void Section_line::HandleInputline(char* line){ data+=line; data+="\n"; @@ -178,13 +186,17 @@ void Section_line::PrintData(FILE* outfile) { fprintf(outfile,"%s",data.c_str()); } +bool Section_line::HasProperty(const char* _property) { + return false; +} + void Config::PrintConfig(const char* configfilename){ char temp[50];char helpline[256]; FILE* outfile=fopen(configfilename,"w+t"); if(outfile==NULL) return; for (it tel=sectionlist.begin(); tel!=sectionlist.end(); tel++){ /* Print out the Section header */ - strcpy(temp,(*tel)->sectionname.c_str()); + strcpy(temp,(*tel)->GetName()); lowcase(temp); fprintf(outfile,"[%s]\n",temp); upcase(temp); @@ -207,12 +219,6 @@ void Config::PrintConfig(const char* configfilename){ fclose(outfile); } -Section* Config::AddSection(const char* _name,void (*_initfunction)(Section*)){ - Section* blah = new Section(_name); - blah->AddInitFunction(_initfunction); - sectionlist.push_back(blah); - return blah; -} Section_prop* Config::AddSection_prop(const char* _name,void (*_initfunction)(Section*),bool canchange){ Section_prop* blah = new Section_prop(_name); @@ -235,6 +241,23 @@ void Config::Init(){ } } +void Section::ExecuteInit(bool initall) { + typedef std::list::iterator func_it; + for (func_it tel=initfunctions.begin(); tel!=initfunctions.end(); tel++) { + if(initall || (*tel).canchange) (*tel).function(this); + } +} + +void Section::ExecuteDestroy(bool destroyall) { + typedef std::list::iterator func_it; + for (func_it tel=destroyfunctions.begin(); tel!=destroyfunctions.end(); ) { + if(destroyall || (*tel).canchange) { + (*tel).function(this); + tel=destroyfunctions.erase(tel); //Remove destroyfunction once used + } else tel++; + } +} + Config::~Config() { reverse_it cnt=sectionlist.rbegin(); while (cnt!=sectionlist.rend()) { @@ -245,11 +268,18 @@ Config::~Config() { Section* Config::GetSection(const char* _sectionname){ for (it tel=sectionlist.begin(); tel!=sectionlist.end(); tel++){ - if (!strcasecmp((*tel)->sectionname.c_str(),_sectionname)) return (*tel); + if (!strcasecmp((*tel)->GetName(),_sectionname)) return (*tel); } return NULL; } +Section* Config::GetSectionFromProperty(const char* prop) +{ + for (it tel=sectionlist.begin(); tel!=sectionlist.end(); tel++){ + if ((*tel)->HasProperty(prop)) return (*tel); + } + return NULL; +} bool Config::ParseConfigFile(const char* configfilename){ ifstream in(configfilename); if (!in) return false;