ini library in OSX
Joel via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Sep 9 20:48:20 PDT 2014
How do you use this ini file parser?
-----------------
http://dpaste.dzfl.pl/1b29ef20
module rangeini;
import std.stdio: File, writeln;
import std.range;
import std.algorithm: canFind;
import std.string: strip, splitLines;
import std.traits: Unqual;
import std.conv: text;
struct ConfigItem {
string section;
string key;
string value;
}
private struct ConfigItems(Range,string kvSeparators=":=",string
commentChars=";#")
{
Unqual!Range _input;
string currentSection = "GLOBAL";
this(Unqual!Range r) {
_input = r;
skipNonKeyValueLines();
}
@property bool empty() {
return _input.empty;
}
@property void popFront() {
_input.popFront();
skipNonKeyValueLines();
}
@property auto front() {
auto line = _input.front;
foreach(uint i, const c; line) {
if (kvSeparators.canFind(c)) {
auto key = line[0..i];
auto value = line[i+1..$];
return ConfigItem(currentSection, key.idup, value.idup);
}
}
return ConfigItem(currentSection, line.idup, "");
}
private void skipNonKeyValueLines() {
while(!_input.empty) {
auto line = strip(_input.front);
if (line == "" || isComment(line)) {
_input.popFront();
continue;
}
if (line[0] == '[' && line[$-1] == ']') { /* section start */
currentSection = line[1..$-1].idup;
_input.popFront();
continue;
}
break;
}
}
private static bool isComment(in char[] line) pure @safe {
assert (line != "");
auto c = line[0];
if (commentChars.canFind(c)) return true;
return false;
}
}
auto parseINIlines(Range)(Range r) if
(isInputRange!(Unqual!Range))
{
return ConfigItems!(Range)(r);
}
auto parseINI(string data)
{
return data.splitLines.parseINIlines;
}
auto parseINI(File fh)
{
return fh.byLine.parseINIlines;
}
unittest {
auto data = "
general section=possible
[Simple Values]
key=value
spaces in keys=allowed
spaces in values=allowed as well
spaces around the delimiter = obviously
you can also use : to delimit keys from values
[All Values Are Strings]
values like this: 1000000
or this: 3.14159265359
are they treated as numbers? : no
integers, floats and booleans are held as: strings
can use the API to get converted values directly: true
[Multiline Values]
[No Values]
key_without_value
empty string value here =
[You can use comments]
# like this
; or this
# By default only in an empty line.
# Inline comments can be harmful because they prevent users
# from using the delimiting characters as parts of values.
# That being said, this can be customized.
[Sections Can Be Indented]
can_values_be_as_well = True
does_that_mean_anything_special = False
purpose = formatting for readability
# Did I mention we can indent comments, too?";
foreach(item; parseINI(data)) {
writeln("[*", text(item), "*]");
}
}
int main() { return 0; }
More information about the Digitalmars-d-learn
mailing list