Has anyone written an INI parser in tango?
Rayne
DiscipleRayne at gmail.com
Fri Sep 12 23:28:13 PDT 2008
Walter Bright Wrote:
> Rayne wrote:
> > Just wondering if anyone had because it doesnt seen that the creators
> > of Tango have, and their crappy properties stuff doesnt appeal to me
> > in the least bit.
>
> Here's a simple one I wrote a while back. A description of the file
> format is here: http://openrj.sourceforge.net/
>
> // Written in the D programming language
> // placed into Public Domain
> // Written by Walter Bright
>
> module std.openrj;
>
> import std.string;
>
> alias char[][] [char[]] [] openrj_t;
>
> class OpenrjException : Exception
> {
> uint linnum;
>
> this(uint linnum, char[] msg)
> {
> this.linnum = linnum;
> super(std.string.format("OpenrjException line %s: %s", linnum, msg));
> }
> }
>
> openrj_t parse(char[] db)
> {
> openrj_t rj;
> char[][] lines;
> char[][] [char[]] record;
>
> lines = std.string.splitlines(db);
>
> for (uint linnum = 0; linnum < lines.length; linnum++)
> {
> char[] line = lines[linnum];
>
> // Splice lines ending with backslash
> while (line.length && line[length - 1] == '\\')
> {
> if (++linnum == lines.length)
> throw new OpenrjException(linnum, "no line after \\ line");
> line = line[0 .. length - 1] ~ lines[linnum];
> }
>
> if (line[0 .. 2] == "%%")
> {
> // Comment lines separate records
> if (record)
> rj ~= record;
> record = null;
> line = null;
> continue;
> }
>
> int colon = std.string.find(line, ':');
> if (colon == -1)
> throw new OpenrjException(linnum, "'key : value' expected");
>
> char[] key = std.string.strip(line[0 .. colon]);
> char[] value = std.string.strip(line[colon + 1 .. length]);
>
> char[][] fields = record[key];
> fields ~= value;
> record[key] = fields;
> }
> if (record)
> rj ~= record;
> return rj;
> }
Thanks for the effort, however as it turns out I was being an idiot, I figured out how the properties work in Tango, its basicly an INI file. At least it works almost the same.
More information about the Digitalmars-d
mailing list