diff --git a/uppsrc/Core/Ini.cpp b/uppsrc/Core/Ini.cpp index 63349592a..6c5be838a 100644 --- a/uppsrc/Core/Ini.cpp +++ b/uppsrc/Core/Ini.cpp @@ -2,50 +2,56 @@ namespace Upp { -VectorMap LoadIniStream(Stream &sin) { - Stream *in = &sin; - FileIn fin; - VectorMap key; - int c; - if((c = in->Get()) < 0) return key; - for(;;) { - String k, v; - for(;;) { - if(IsAlNum(c) || c == '_') - k.Cat(c); - else - break; - if((c = in->Get()) < 0) return key; - } - for(;;) { - if(c != '=' && c != ' ') break; - if((c = in->Get()) < 0) return key; - } - for(;;) { - if(c < ' ') break; - v.Cat(c); - if((c = in->Get()) < 0) break; - } - if(!k.IsEmpty()) - key.Add(k, v); - if(k == "LINK") { - if(in == &fin) - fin.Close(); - if(!fin.Open(v) || (c = in->Get()) < 0) return key; - in = &fin; +static void LoadIniStream(Stream &sin, VectorMap& ret, const char *sfile); + +static void LoadIniFile(const char *filename, VectorMap& ret) +{ + FileIn in(filename); + if(in) LoadIniStream(in, ret, filename); +} + +bool sKeyChar(int c) +{ + return IsAlNum(c) || c == '_' || c == '@'; +} + +static void LoadIniStream(Stream& in, VectorMap& key, const char *sfile) +{ + while(!in.IsEof()) { + String line = in.GetLine(); + CParser p(line); + if(p.IsId()) { + String k = p.ReadId(); + if(p.Char('=')) + key.Add(k, p.GetSpacePtr()); } else - for(;;) { - if(IsAlNum(c) || c == '_') break; - if((c = in->Get()) < 0) return key; + if(p.Char('@')) { + if(p.Id("include")) { + String fn = p.GetPtr(); + if(!IsFullPath(fn) && sfile) + fn = AppendFileName(GetFileFolder(GetFullPath(sfile)), fn); + LoadIniFile(fn, key); } + else + if(p.Id("end")) + return; + } } } -VectorMap LoadIniFile(const char *filename) { - FileIn in(filename); - if(!in) return VectorMap(); - return LoadIniStream(in); +VectorMap LoadIniStream(Stream &sin) +{ + VectorMap ret; + LoadIniStream(sin, ret, NULL); + return ret; +} + +VectorMap LoadIniFile(const char *filename) +{ + VectorMap ret; + LoadIniFile(filename, ret); + return ret; } static StaticMutex sMtx;