diff --git a/core/cfg/cfg.cpp b/core/cfg/cfg.cpp index fe3b79ae2..69e4d79d1 100644 --- a/core/cfg/cfg.cpp +++ b/core/cfg/cfg.cpp @@ -23,227 +23,124 @@ string cfgPath; struct vitem { - string s; - string n; - string v; - vitem(string a,string b,string c){s=a;n=b;v=c;} + string s; + string n; + string v; + vitem(string a,string b,string c){s=a;n=b;v=c;} }; vector vlist; wchar* trim_ws(wchar* str); ConfigEntry::ConfigEntry(ConfigEntry* pp) - { - next=pp; - flags=0; - } +{ + next=pp; + flags=0; +} + void ConfigEntry::SaveFile(FILE* file) - { - if (flags & CEM_SAVE) - fprintf(file,"%s=%s\n",name.c_str(),value.c_str()); - } +{ + if (flags & CEM_SAVE) + fprintf(file,"%s=%s\n",name.c_str(),value.c_str()); +} string ConfigEntry::GetValue() - { - if (flags&CEM_VIRTUAL) - return valueVirtual; - else - return value; - } +{ + if (flags&CEM_VIRTUAL) + return valueVirtual; + else + return value; +} ConfigSection::ConfigSection(ConfigSection* pp) - { - next=pp; - flags=0; - entrys=0; - } +{ + next=pp; + flags=0; + entrys=0; +} + ConfigEntry* ConfigSection::FindEntry(string name) +{ + ConfigEntry* c= entrys; + while(c) { - ConfigEntry* c= entrys; - while(c) - { - if (stricmp(name.c_str(),c->name.c_str())==0) - return c; - c=c->next; - } - return 0; + if (stricmp(name.c_str(),c->name.c_str())==0) + return c; + c=c->next; } + return 0; +} + void ConfigSection::SetEntry(string name,string value,u32 eflags) +{ + ConfigEntry* c=FindEntry(name); + if (c) { - ConfigEntry* c=FindEntry(name); - if (c) + //readonly is read only =) + if (c->flags & CEM_READONLY) + return; + + //virtual : save only if different value + if (c->flags & CEM_VIRTUAL) { - //readonly is read only =) - if (c->flags & CEM_READONLY) + + if(stricmp(c->valueVirtual.c_str(),value.c_str())==0) return; - - //virtual : save only if different value - if (c->flags & CEM_VIRTUAL) - { - - if(stricmp(c->valueVirtual.c_str(),value.c_str())==0) - return; - c->flags&=~CEM_VIRTUAL; - } + c->flags&=~CEM_VIRTUAL; } - else - { - entrys=c= new ConfigEntry(entrys); - c->name=name; - } - - verify(!(c->flags&(CEM_VIRTUAL|CEM_READONLY))); - //Virtual - //Virtual | ReadOnly - //Save - if (eflags & CEM_VIRTUAL) - { - verify(!(eflags & CEM_SAVE)); - c->flags|=eflags; - c->valueVirtual=value; - } - else if (eflags & CEM_SAVE) - { - verify(!(eflags & (CEM_VIRTUAL|CEM_READONLY))); - flags|=CEM_SAVE; - c->flags|=CEM_SAVE; - - c->value=value; - } - else - { - die("Invalid eflags value"); - } - } + else + { + entrys=c= new ConfigEntry(entrys); + c->name=name; + } + + verify(!(c->flags&(CEM_VIRTUAL|CEM_READONLY))); + //Virtual + //Virtual | ReadOnly + //Save + if (eflags & CEM_VIRTUAL) + { + verify(!(eflags & CEM_SAVE)); + c->flags|=eflags; + c->valueVirtual=value; + } + else if (eflags & CEM_SAVE) + { + verify(!(eflags & (CEM_VIRTUAL|CEM_READONLY))); + flags|=CEM_SAVE; + c->flags|=CEM_SAVE; + + c->value=value; + } + else + { + die("Invalid eflags value"); + } + +} + ConfigSection::~ConfigSection() +{ + ConfigEntry* n=entrys; + + while(n) { - ConfigEntry* n=entrys; - - while(n) - { - ConfigEntry* p=n; - n=n->next; - delete p; - } + ConfigEntry* p=n; + n=n->next; + delete p; } +} + void ConfigSection::SaveFile(FILE* file) +{ + if (flags&CEM_SAVE) { - if (flags&CEM_SAVE) - { - fprintf(file,"[%s]\n",name.c_str()); + fprintf(file,"[%s]\n",name.c_str()); - vector stuff; + vector stuff; - ConfigEntry* n=entrys; + ConfigEntry* n=entrys; - while(n) - { - stuff.push_back(n); - n=n->next; - } - - for (int i=stuff.size()-1;i>=0;i--) - { - stuff[i]->SaveFile(file); - } - - fprintf(file,"\n"); - } - } - -ConfigSection* ConfigFile::FindSection(string name) - { - ConfigSection* c= entrys; - while(c) - { - if (stricmp(name.c_str(),c->name.c_str())==0) - return c; - c=c->next; - } - return 0; - } -ConfigSection* ConfigFile::GetEntry(string name) - { - ConfigSection* c=FindSection(name); - if (!c) - { - entrys=c= new ConfigSection(entrys); - c->name=name; - } - - return c; - } -ConfigFile::~ConfigFile() - { - ConfigSection* n=entrys; - - while(n) - { - ConfigSection* p=n; - n=n->next; - delete p; - } - } - -void ConfigFile::ParseFile(FILE* file) - { - wchar line[512]; - wchar cur_sect[512]={0}; - int cline=0; - while(file && !feof(file)) - { - fgets(line,512,file); - if (feof(file)) - break; - - cline++; - - if (strlen(line)<3) - continue; - if (line[strlen(line)-1]=='\r' || line[strlen(line)-1]=='\n') - line[strlen(line)-1]=0; - - wchar* tl=trim_ws(line); - if (tl[0]=='[' && tl[strlen(tl)-1]==']') - { - tl[strlen(tl)-1]=0; - strcpy(cur_sect,tl+1); - trim_ws(cur_sect); - } - else - { - if (cur_sect[0]==0) - continue;//no open section - wchar* str1=strstr(tl,"="); - if (!str1) - { - printf("Malformed entry on config - ignoring @ %d(%s)\n",cline,tl); - continue; - } - *str1=0; - str1++; - wchar* v=trim_ws(str1); - wchar* k=trim_ws(tl); - if (v && k) - { - ConfigSection*cs=this->GetEntry(cur_sect); - - //if (!cs->FindEntry(k)) - cs->SetEntry(k,v,CEM_SAVE|CEM_LOAD); - } - else - { - printf("Malformed entry on config - ignoring @ %d(%s)\n",cline,tl); - } - } - } - } -void ConfigFile::SaveFile(FILE* file) - { - vector stuff; - - ConfigSection* n=entrys; - while(n) { stuff.push_back(n); @@ -252,70 +149,183 @@ void ConfigFile::SaveFile(FILE* file) for (int i=stuff.size()-1;i>=0;i--) { - if (stuff[i]->name!="emu") - stuff[i]->SaveFile(file); + stuff[i]->SaveFile(file); + } + + fprintf(file,"\n"); + } +} + +ConfigSection* ConfigFile::FindSection(string name) +{ + ConfigSection* c= entrys; + while(c) + { + if (stricmp(name.c_str(),c->name.c_str())==0) + return c; + c=c->next; + } + return 0; +} + +ConfigSection* ConfigFile::GetEntry(string name) +{ + ConfigSection* c=FindSection(name); + if (!c) + { + entrys=c= new ConfigSection(entrys); + c->name=name; + } + + return c; +} + +ConfigFile::~ConfigFile() +{ + ConfigSection* n=entrys; + + while(n) + { + ConfigSection* p=n; + n=n->next; + delete p; + } +} + +void ConfigFile::ParseFile(FILE* file) +{ + wchar line[512]; + wchar cur_sect[512]={0}; + int cline=0; + while(file && !feof(file)) + { + fgets(line,512,file); + if (feof(file)) + break; + + cline++; + + if (strlen(line)<3) + continue; + if (line[strlen(line)-1]=='\r' || line[strlen(line)-1]=='\n') + line[strlen(line)-1]=0; + + wchar* tl=trim_ws(line); + if (tl[0]=='[' && tl[strlen(tl)-1]==']') + { + tl[strlen(tl)-1]=0; + strcpy(cur_sect,tl+1); + trim_ws(cur_sect); + } + else + { + if (cur_sect[0]==0) + continue;//no open section + wchar* str1=strstr(tl,"="); + if (!str1) + { + printf("Malformed entry on config - ignoring @ %d(%s)\n",cline,tl); + continue; + } + *str1=0; + str1++; + wchar* v=trim_ws(str1); + wchar* k=trim_ws(tl); + if (v && k) + { + ConfigSection*cs=this->GetEntry(cur_sect); + + //if (!cs->FindEntry(k)) + cs->SetEntry(k,v,CEM_SAVE|CEM_LOAD); + } + else + { + printf("Malformed entry on config - ignoring @ %d(%s)\n",cline,tl); + } } } +} + +void ConfigFile::SaveFile(FILE* file) +{ + vector stuff; + + ConfigSection* n=entrys; + + while(n) + { + stuff.push_back(n); + n=n->next; + } + + for (int i=stuff.size()-1;i>=0;i--) + { + if (stuff[i]->name!="emu") + stuff[i]->SaveFile(file); + } +} + s32 ConfigFile::Exists(const wchar * Section, const wchar * Key) - { - if (Section==0) - return -1; - //return cfgRead(Section,Key,0); - ConfigSection*cs= this->FindSection(Section); - if (cs == 0) - return 0; +{ + if (Section==0) + return -1; + //return cfgRead(Section,Key,0); + ConfigSection*cs= this->FindSection(Section); + if (cs == 0) + return 0; - if (Key==0) - return 1; + if (Key==0) + return 1; + + ConfigEntry* ce=cs->FindEntry(Key); + if (ce!=0) + return 2; + else + return 0; +} - ConfigEntry* ce=cs->FindEntry(Key); - if (ce!=0) - return 2; - else - return 0; - } void ConfigFile::LoadStr(const wchar * Section, const wchar * Key, wchar * Return,const wchar* Default) - { - verify(Return!=0); - string value = this->LoadStr(Section, Key, Default); - strcpy(Return, value.c_str()); - } +{ + verify(Return!=0); + string value = this->LoadStr(Section, Key, Default); + strcpy(Return, value.c_str()); +} string ConfigFile::LoadStr(const wchar * Section, const wchar * Key, const wchar* Default) - { - verify(Section != 0 && strlen(Section) != 0); - verify(Key != 0 && strlen(Key) != 0); +{ + verify(Section != 0 && strlen(Section) != 0); + verify(Key != 0 && strlen(Key) != 0); - if (Default == 0) - Default = ""; - ConfigSection* cs = this->GetEntry(Section); - ConfigEntry* ce = cs->FindEntry(Key); - if (!ce) - { - cs->SetEntry(Key, Default, CEM_SAVE); - return Default; - } - else - { - return ce->GetValue(); - } - } + if (Default == 0) + Default = ""; + ConfigSection* cs = this->GetEntry(Section); + ConfigEntry* ce = cs->FindEntry(Key); + if (!ce) + { + cs->SetEntry(Key, Default, CEM_SAVE); + return Default; + } + else + { + return ce->GetValue(); + } +} s32 ConfigFile::LoadInt(const wchar * Section, const wchar * Key,s32 Default) - { - wchar temp_d[30]; - wchar temp_o[30]; - sprintf(temp_d,"%d",Default); - this->LoadStr(Section,Key,temp_o,temp_d); - if (strstr(temp_o, "0x") != NULL) - { - return strtol(temp_o, NULL, 16); - } - else - { - return atoi(temp_o); - } - } +{ + wchar temp_d[30]; + wchar temp_o[30]; + sprintf(temp_d,"%d",Default); + this->LoadStr(Section,Key,temp_o,temp_d); + if (strstr(temp_o, "0x") != NULL) + { + return strtol(temp_o, NULL, 16); + } + else + { + return atoi(temp_o); + } +} ConfigFile cfgdb; @@ -394,12 +404,12 @@ bool cfgOpen() } } - cfgdb.ParseFile(cfgfile); + cfgdb.ParseFile(cfgfile); - for (size_t i=0;iSetEntry(vlist[i].n,vlist[i].v,CEM_VIRTUAL); - } + for (size_t i=0;iSetEntry(vlist[i].n,vlist[i].v,CEM_VIRTUAL); + } if (cfgfile) { diff --git a/core/cfg/cfg.h b/core/cfg/cfg.h index fe8fa6368..30f06789e 100644 --- a/core/cfg/cfg.h +++ b/core/cfg/cfg.h @@ -22,39 +22,39 @@ bool ParseCommandLine(int argc,wchar* argv[]); struct ConfigEntry { - u32 flags; - string name; - string value; - string valueVirtual; - ConfigEntry* next; - ConfigEntry(ConfigEntry*); - string GetValue(); - void SaveFile(FILE*); + u32 flags; + string name; + string value; + string valueVirtual; + ConfigEntry* next; + ConfigEntry(ConfigEntry*); + string GetValue(); + void SaveFile(FILE*); }; struct ConfigSection { - u32 flags; - string name; - ConfigEntry* entrys; - ConfigSection* next; - ~ConfigSection(); - ConfigSection(ConfigSection*); - ConfigEntry* FindEntry(string); - void SetEntry(string, string, u32); - void SaveFile(FILE*); + u32 flags; + string name; + ConfigEntry* entrys; + ConfigSection* next; + ~ConfigSection(); + ConfigSection(ConfigSection*); + ConfigEntry* FindEntry(string); + void SetEntry(string, string, u32); + void SaveFile(FILE*); }; struct ConfigFile { - ConfigSection* entrys; - ~ConfigFile(); - void ParseFile(FILE*); - void SaveFile(FILE*); - ConfigSection* FindSection(string); - ConfigSection* GetEntry(string); - s32 Exists(const wchar *, const wchar *); - void LoadStr(const wchar *, const wchar *, wchar *,const wchar*); - string LoadStr(const wchar *, const wchar *, const wchar*); - s32 LoadInt(const wchar *, const wchar *,s32); + ConfigSection* entrys; + ~ConfigFile(); + void ParseFile(FILE*); + void SaveFile(FILE*); + ConfigSection* FindSection(string); + ConfigSection* GetEntry(string); + s32 Exists(const wchar *, const wchar *); + void LoadStr(const wchar *, const wchar *, wchar *,const wchar*); + string LoadStr(const wchar *, const wchar *, const wchar*); + s32 LoadInt(const wchar *, const wchar *,s32); }; \ No newline at end of file