PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : konfigurations-parser ...



TheDodger
07-02-2002, 14:51
Moin!

Sagt mal, gibt einen Parser für konfigurations-Dateien die ungefähr so aufgebaut sind?

[GROUP1]
var = value
...
[GROUP2]
...

Oder lässt sich das - mal eben schnell, wie mein Chef immer sagt - proggen?

anda_skoa
07-02-2002, 17:50
Hi Doger!

Vielleicht geht das:
http://www.enjoy.ne.jp/~gm/program/parsecfg/parsecfg.html
http://freshmeat.net/projects/configurationpackage/
http://sourceforge.net/projects/config/

Sonst kannst ja noch eine Blick in die Implementation von KConfigBase werfen :)

Ciao,
_

TheDodger
07-02-2002, 18:08
Die ersten beiden kannte ich schon, die sind mir pers. aber zu kompliziert aufgebaut.
das letztere schaut da schon besser aus :)
ich selbst habe hier appconf gefunden ... allerdings leider ohne URL ...

danke für deine hilfe!
ich glaube, ich sollte mir sowas auch irgendwo hinlegen ... sowas braucht man doch immer wieder mal ... ;)

TheDodger
08-02-2002, 15:39
...
naja ... da ich unter QT programmiere, werde ich mir wohl selber eine Klasse erstellen ... das bringt mich auch schon etwas weiter ...
das parsen von 'var = value' klappt ... das gruppenhandling wird wohl etwas komplizierter ...

anda_skoa
08-02-2002, 20:14
Du könntest eine eigene Klasse für Groups machen.



class ConfigGroup {
public:
ConfigGroup(const QString& name);
~ConfigGroup();

void writeEntry(const QString& name, const QString& value) {
if (name.isEmpty())
return;
QString val = (value.isNull() ? QString("") : value;
m_entries.replace(name, val);
}
QString readEntry(const QString& name) {
if (name.isEmpty())
return QString::null;

if (!m_entries.contains(name))
return QString::null;

return m_entries[name];
}

protected:
QString m_name;
QMap<QString, QString> m_entries;
};

class Config {
public:
Config();
~Config();

int load(const QString& filename);
int save(const QString& filename);

// return 0 if no such group
ConfigGroup* group(const QString& groupName) {
if (groupName.isEmpty())
return 0;
return m_groups[groupName];
}

void addGroup(const QString& groupName) {
if (groupName.isEmpty())
return;

if (m_groups.find(groupName))
return;
ConfigGroup* group = new ConfigGroup(groupName);
m_groups.insert(groupName, group);
}
// etc..

protected:
QDict<ConfigGroup> m_groups;
};


beim Laden leist du am besten Zeileenweise von einem QTextIStream.
Wenn es [] enthält, ist das dazwischen eine Gruppe.
dann erzeugts du eine neue Gruppe und macht so lange writeEntry, bis du auf die nächste Gruppe triffst.

Alles natürlich stark vereinfacht.

Ciao,
_

TheDodger
09-02-2002, 09:32
Original geschrieben von anda_skoa
Du könntest eine eigene Klasse für Groups machen.




[...]



beim Laden leist du am besten Zeileenweise von einem QTextIStream.
Wenn es [] enthält, ist das dazwischen eine Gruppe.
dann erzeugts du eine neue Gruppe und macht so lange writeEntry, bis du auf die nächste Gruppe triffst.

Alles natürlich stark vereinfacht.


:)
Auf QDict baue ich im Moment auch auf ...
Ich habe gestern abend noch ein wenig in meinem dicken QT-Wälzen geschmöckert und bin auf den selben Lösungsansatz gekommen.
Naja fast. Ich hätte eine QDictList benutzt ... oder es damit mal probiert :)

Sag mal, sowas schüttelst du mal locker aus'm Ärmel? :)

anda_skoa
09-02-2002, 10:34
Original geschrieben von TheDodger

Sag mal, sowas schüttelst du mal locker aus'm Ärmel? :)

:D
Hab in letzter Zeit ein paarmal Parser für einfache Textformate geschrieben.
Und mit configs hab ich mich beschäftigt, als ich an einre Möglichkeit gearbeitet hab, KConfig als Frontend für Configgroups zu verwenden, die in einem XML Format abgeschpeichert werden sollten.

Und KConfig benutzt intern eben auch eine QMap für die Einträge und parsed die values beim auslesen mit den verschiedenen readEntry Methoden, sodaß der Rückgabewert zB gleich eine QColor oder QFOnt Instanz ist und es war leichter das KConfig zu überlassen, als selbst alle diese Methoden zu schreiben :)

Ciao,
_