blackberry
09.07.2009, 18:27
Mein zweiter Config-Parser. (der erste sollte hier irgendwo noch rumschwirren, ist aber schon relativ alt...)
Ich weiß es gibt Bibliotheken für soetwas, aber ich mache mir mein Zeug lieber selbst :)
Die Syntax ist wie folgt:
Kommentare:
... können ähnlich wie in PHP mit
/* C Stil */
// C++ Stil
# Perl Stil
eingeleitet werden.
Die Kommentare 2. und 3. werden mit einem Zeilenumbruch beendet.
1. wird durch */ beendet und kann theoretisch über mehrere Zeilen gehen.
Einträge:
... können wie folgt getätigt werden:
1 Bezeichner 1 = 123 Wert 123
Die blauen Zahlen bezeichnen mögliche Orte für Kommentare.
Dort können Kommentare stehen, müssen aber nicht.
An den Stellen, an denen nur eine eins steht ist nur ein Block-Kommentar möglich. Wo 123 steht, sind alle Kommentare möglich.
Die Bereiche nach dem "ist-gleich-Zeichen" (=) sind optional.
Das Bezeichner-Feld:
Hier stehen folgende Zeichen zur Verfügung:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ0123456789_
Das heißt: a-z + A-Z + 0-9 + _ (Unterstrich)
Dieses Feld kann maximal 30 Zeichen lang sein.
Das Werte-Feld:
Hier werden 3 Typen unterschieden:
String / Zeichenkette
vorzeichenbehaftete Zahl (signed int)
Leer / Nichts
Ein String kann folgende Zeichen enthalten:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ0123456789^°!\"§$%&/()=?`´²³{[]}\\@€~|µüÜöÖäÄ+*#'-_.:,;<>\t\v\a\b\f
(C-Syntax: \t steht z.B. für einen Tabulator)
Er kann maximal 512 Bytes (1/2 KB) groß sein.
Will man Leerzeichen benutzen muss der String in einfachen bzw. doppelten Anführungszeichen (' bzw. ") stehen.
Eine Zahl kann entweder in oktaler, dezimaler, oder hexadezimaler Form angegeben werden.
Normalerweise wird die dezimale Form angenommen.
Um eine Oktalzahl zu schreiben wird der Zahl eine 0 vorausgestellt.
Um eine Hexadezimalzahl zu schreiben wird der Zahl ein 0x vorausgestellt.
Die Zahlen sind durch die Größe eines vorzeichenbehafteten Integers (signed int) begrenzt.
Hier einige Beispiele:
mydec = 1010
myhex = 0xBEEF
myoct = 044535
Ein leerer Eintrag wird erzeugt, indem man nach dem "ist-gleich-Zeichen" einen Zeilenumbruch einfügt, oder einen der folgenden Werte hinschreibt:
'', "", None, Empty, Null
Groß- bzw. Kleinschreibung wird hierbei nicht beachtet.
Benutzung:
Um den Parser benutzen zu können muss man cfgparser.c zu seinem Projekt hinzufügen und cfgparser.h inkludieren.
Anschließend ruft man die Funktion cfgp_parse auf.
Ihr übergibt man den Dateinamen als ersten und eine "Callback-Funktion" als zweiten Parameter.
Die "Callback-Funktion" besitzt folgenden Funktionsprototypen:
void cfgp_callback(char *name, void *value, int type)
Name ist hierbei der Bezeichner (siehe oben) und value ein Zeiger auf den Wert.
Von welchem Typ dieser Zeiger ist wird durch den Parameter type beschrieben.
Mögliche Werte für type sind:
#define CFGP_TYPE_INTEGER 0
#define CFGP_TYPE_STRING 1
#define CFGP_TYPE_EMPTY 2
(siehe cfgparser.h)
Im Fall von CFGP_TYPE_INTEGER ist value ein Zeiger auf einen signed int.
Für CFGP_TYPE_STRING ist value ein Zeiger auf einen char (char * - nicht char **).
Bei CFGP_TYPE_EMPTY ist value uninteressant und wird auf 0 gesetzt.
Der Rückgabewert von cfg_parse ist ein Integer, welcher im Erfolgsfall CFGP_SUCCESS (0) entspricht.
Ist ein Fehler vorhanden wird (FEHLERCODE | ZEILE) zurückgegeben (| = Bitweises einschließendes ODER).
Der Fehlercode kann mit dem Makro CFGP_ERROR_GET_CODE(x) extrahiert werden. Als Parameter wird der Rückgabewert angenommen.
Das Makro CFGP_ERROR_GET_LINE(x) nimmt ebenfalls den Rückgabewert von cfgp_parse als Parameter, gibt hingegen die Zeile zurück, in der der Fehler aufgetreten ist.
Ein Beispiel hierfür kann unten zusammen mit den anderen Sourcecodes gedownloadet werden.
PS: dieses Verfahren kann ab der Zeile 268435455 (0x0FFFFFFF) zu Fehlern führen, da sich dann die Zeilenzahl mit dem Fehlercode überlagert und diesen somit verfälscht.
Ich glaube jedoch nicht, dass jemand so große Dateien parsen wird.
Download Inhalt:
Der Download enthält folgende Dateien:
cfgparser.c - die Hauptsourcedatei
cfgparser.h - die Schnittstelle
CfgParser.dev - die Projektdatei für Dev-C++
CfgParserZustände.png - ein (unvollständiges) Zustandsdiagramm (Achtung: nicht aktuell)
main.cpp - ein Beispielprogramm, welches die Werte aus example.conf ausgibt
example.conf - eine Beispielkonfiguationsdatei - wird von main.cpp benötigt
Download:
http://bbsrc.incecx.net/cfgparser.rar <--- freundlicherweise zur Verfügung gestellt von cby (http://free-hack.com/member.php?u=75490)
MD5 Checksum: a9a287d027bcda29f05d6a4c6dcf6d8f *cfgparser.rar
Passwort: free-hack.com
Ich hoffe jemand kann das hier gebrauchen :)
PS: Feedback ist erwünscht - ich hab das Programm heute erst fertiggestellt, also wer lust hat kann gerne nach Bugs suchen.
mfG. BlackBerry
Ich weiß es gibt Bibliotheken für soetwas, aber ich mache mir mein Zeug lieber selbst :)
Die Syntax ist wie folgt:
Kommentare:
... können ähnlich wie in PHP mit
/* C Stil */
// C++ Stil
# Perl Stil
eingeleitet werden.
Die Kommentare 2. und 3. werden mit einem Zeilenumbruch beendet.
1. wird durch */ beendet und kann theoretisch über mehrere Zeilen gehen.
Einträge:
... können wie folgt getätigt werden:
1 Bezeichner 1 = 123 Wert 123
Die blauen Zahlen bezeichnen mögliche Orte für Kommentare.
Dort können Kommentare stehen, müssen aber nicht.
An den Stellen, an denen nur eine eins steht ist nur ein Block-Kommentar möglich. Wo 123 steht, sind alle Kommentare möglich.
Die Bereiche nach dem "ist-gleich-Zeichen" (=) sind optional.
Das Bezeichner-Feld:
Hier stehen folgende Zeichen zur Verfügung:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ0123456789_
Das heißt: a-z + A-Z + 0-9 + _ (Unterstrich)
Dieses Feld kann maximal 30 Zeichen lang sein.
Das Werte-Feld:
Hier werden 3 Typen unterschieden:
String / Zeichenkette
vorzeichenbehaftete Zahl (signed int)
Leer / Nichts
Ein String kann folgende Zeichen enthalten:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ0123456789^°!\"§$%&/()=?`´²³{[]}\\@€~|µüÜöÖäÄ+*#'-_.:,;<>\t\v\a\b\f
(C-Syntax: \t steht z.B. für einen Tabulator)
Er kann maximal 512 Bytes (1/2 KB) groß sein.
Will man Leerzeichen benutzen muss der String in einfachen bzw. doppelten Anführungszeichen (' bzw. ") stehen.
Eine Zahl kann entweder in oktaler, dezimaler, oder hexadezimaler Form angegeben werden.
Normalerweise wird die dezimale Form angenommen.
Um eine Oktalzahl zu schreiben wird der Zahl eine 0 vorausgestellt.
Um eine Hexadezimalzahl zu schreiben wird der Zahl ein 0x vorausgestellt.
Die Zahlen sind durch die Größe eines vorzeichenbehafteten Integers (signed int) begrenzt.
Hier einige Beispiele:
mydec = 1010
myhex = 0xBEEF
myoct = 044535
Ein leerer Eintrag wird erzeugt, indem man nach dem "ist-gleich-Zeichen" einen Zeilenumbruch einfügt, oder einen der folgenden Werte hinschreibt:
'', "", None, Empty, Null
Groß- bzw. Kleinschreibung wird hierbei nicht beachtet.
Benutzung:
Um den Parser benutzen zu können muss man cfgparser.c zu seinem Projekt hinzufügen und cfgparser.h inkludieren.
Anschließend ruft man die Funktion cfgp_parse auf.
Ihr übergibt man den Dateinamen als ersten und eine "Callback-Funktion" als zweiten Parameter.
Die "Callback-Funktion" besitzt folgenden Funktionsprototypen:
void cfgp_callback(char *name, void *value, int type)
Name ist hierbei der Bezeichner (siehe oben) und value ein Zeiger auf den Wert.
Von welchem Typ dieser Zeiger ist wird durch den Parameter type beschrieben.
Mögliche Werte für type sind:
#define CFGP_TYPE_INTEGER 0
#define CFGP_TYPE_STRING 1
#define CFGP_TYPE_EMPTY 2
(siehe cfgparser.h)
Im Fall von CFGP_TYPE_INTEGER ist value ein Zeiger auf einen signed int.
Für CFGP_TYPE_STRING ist value ein Zeiger auf einen char (char * - nicht char **).
Bei CFGP_TYPE_EMPTY ist value uninteressant und wird auf 0 gesetzt.
Der Rückgabewert von cfg_parse ist ein Integer, welcher im Erfolgsfall CFGP_SUCCESS (0) entspricht.
Ist ein Fehler vorhanden wird (FEHLERCODE | ZEILE) zurückgegeben (| = Bitweises einschließendes ODER).
Der Fehlercode kann mit dem Makro CFGP_ERROR_GET_CODE(x) extrahiert werden. Als Parameter wird der Rückgabewert angenommen.
Das Makro CFGP_ERROR_GET_LINE(x) nimmt ebenfalls den Rückgabewert von cfgp_parse als Parameter, gibt hingegen die Zeile zurück, in der der Fehler aufgetreten ist.
Ein Beispiel hierfür kann unten zusammen mit den anderen Sourcecodes gedownloadet werden.
PS: dieses Verfahren kann ab der Zeile 268435455 (0x0FFFFFFF) zu Fehlern führen, da sich dann die Zeilenzahl mit dem Fehlercode überlagert und diesen somit verfälscht.
Ich glaube jedoch nicht, dass jemand so große Dateien parsen wird.
Download Inhalt:
Der Download enthält folgende Dateien:
cfgparser.c - die Hauptsourcedatei
cfgparser.h - die Schnittstelle
CfgParser.dev - die Projektdatei für Dev-C++
CfgParserZustände.png - ein (unvollständiges) Zustandsdiagramm (Achtung: nicht aktuell)
main.cpp - ein Beispielprogramm, welches die Werte aus example.conf ausgibt
example.conf - eine Beispielkonfiguationsdatei - wird von main.cpp benötigt
Download:
http://bbsrc.incecx.net/cfgparser.rar <--- freundlicherweise zur Verfügung gestellt von cby (http://free-hack.com/member.php?u=75490)
MD5 Checksum: a9a287d027bcda29f05d6a4c6dcf6d8f *cfgparser.rar
Passwort: free-hack.com
Ich hoffe jemand kann das hier gebrauchen :)
PS: Feedback ist erwünscht - ich hab das Programm heute erst fertiggestellt, also wer lust hat kann gerne nach Bugs suchen.
mfG. BlackBerry