U++: Issues
https://www.ultimatepp.org/redmine/
https://www.ultimatepp.org/redmine/redmine/favicon.ico
2014-03-05T13:40:30Z
Redmine
Redmine
Bug #710 (Approved): ScrollWheel should scroll ScrollBar
https://www.ultimatepp.org/redmine/issues/710
2014-03-05T13:40:30Z
Miroslav Fidler
cxl@ntllib.org
Bug #453 (Approved): Improve .ini files
https://www.ultimatepp.org/redmine/issues/453
2013-03-08T07:38:51Z
Miroslav Fidler
cxl@ntllib.org
<p>Prikladam svoji predstavu o nacitani ini souboru v uppsrc/Core/Ini.cpp,<br />ustrizek nahrazuje funkce LoadIniFile a LoadIniStream.</p>
<p>Pri zapnutem flagLOOSEINI se to chova jako drive. Pri vypnutem flagLOOSEINI to:<br />ignoruje radky ktere pred prvnim alfanumerickym (nebo podtrzitkem) maji neco co neni mezera.<br />To zapne podporu pro bezne komentare v ini souborech (';' a '#').<br />Zaroven pridavam @include, ktery se chova jako opravdovy include, na rozdil od LINK, ktery<br />/prepina/ vstup. (Navic jsem pridal @end, ktery umoznuje zakomentovat vse az do konce souboru)</p>
<pre>
static void LoadIniStream(Stream &sin, VectorMap<String, String>& ret);
static void LoadIniFile(const char *filename, VectorMap<String, String>& ret) {
FileIn in(filename);
if(in) LoadIniStream(in, ret);
}
static void LoadIniStream(Stream &sin, VectorMap<String, String>& key){
Stream *in = &sin;
FileIn fin;
int c;
if((c = in->Get()) < 0) return;
for(;;) {
String k, v;
#ifndef flagLOOSEINI
while (IsSpace(c))
if((c = in->Get()) < 0) return;
if (c == '@') {
k.Cat(c);
if((c = in->Get()) < 0) return;
}
#endif
for(;;) {
if(IsAlNum(c) || c == '_')
k.Cat(c);
else
break;
if((c = in->Get()) < 0) return;
}
for(;;) {
#ifdef flagLOOSEINI
if(c != '=' && c != ' ') break;
#else
if(c != '=' && c != ' ' && c != '\t') break;
#endif
if((c = in->Get()) < 0) return;
}
for(;;) {
if(c < ' ') break;
v.Cat(c);
if((c = in->Get()) < 0) break;
}
#ifndef flagLOOSEINI
if(k.StartsWith("@")) {
if (ToLower(k) == "@end")
return;
if (ToLower(k) == "@include")
LoadIniFile(v, key);
} else
#endif
if(!k.IsEmpty())
key.Add(k, v);
if(k == "LINK") {
if(in == &fin)
fin.Close();
if(!fin.Open(v) || (c = in->Get()) < 0) return;
in = &fin;
}
else
for(;;) {
#ifdef flagLOOSEINI
if(IsAlNum(c) || c == '_') break;
#else
if(c == '\r' || c == '\n') break;
#endif
if((c = in->Get()) < 0) return;
}
}
}
VectorMap<String, String> LoadIniStream(Stream &sin) {
VectorMap<String, String> ret;
LoadIniStream(sin, ret);
return ret;
}
VectorMap<String, String> LoadIniFile(const char *filename) {
VectorMap<String, String> ret;
LoadIniFile(filename, ret);
return ret;
}
</pre>