236 lines
8.5 KiB
Plaintext
236 lines
8.5 KiB
Plaintext
CONFFILE LIB 25-FEB-97
|
||
|
||
Datenstrukuren:
|
||
|
||
Die Entries:
|
||
|
||
typedef struct _entry {
|
||
char *name; /* Name des Entries z.B. "NUMBER", hier stehen _immer
|
||
Grossbuchstaben! */
|
||
char *value; /* Hier steht der Wert, oder NULL, wenn subsection
|
||
belegt ist, da nur einer von beiden einen Wert
|
||
haben kann */
|
||
struct _section *subsection; /* Hier kann wieder eine Subsection
|
||
kommen oder NULL */
|
||
struct _entry *next; /* Hier beginnt die verkettete Liste mit dem
|
||
naechsten Entry einer Section */
|
||
char flag; /* Interne Zwecke */
|
||
} entry;
|
||
|
||
typedef struct _section {
|
||
char *name; /* Name der Setcion z.B. "GLOBAL", hier stehen _immer
|
||
Grossbuchstaben! */
|
||
entry *entries; /* Hier haengt die Liste der Entries fuer diese
|
||
Section. */
|
||
struct _section *next; /* Hier kommen die naechsten Sectionen.
|
||
Ist eine verkettete Liste */
|
||
char flag; /* Interne Zwecke */
|
||
} section;
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
Funktion:
|
||
|
||
int Get_Type_Value(section *Section, char *Path, int Type, void **Pointer)
|
||
|
||
Section: ist der Pointer der auf die Sectionen zeigt. Diesen erhaelt man
|
||
von einer Funktion, die die Konfigurationsdateien einliest.
|
||
|
||
Path: Beschreibt, welchen Wert man haben will in Form eines UNIX-Pfades.
|
||
Da ein Entry immer in der zweiten Ebene und eine Vielfache davon ist,
|
||
muss die Pfad-Anzahl immer modulo 2 sein:
|
||
"NUMBER/ALIAS" (Section,Entry)
|
||
"NUMBER/START/FLAG/PROGRAMM" (Section,Entry,SubSection,Entry)
|
||
|
||
Type: Beschreibt den Rueckgabewert. Kann einen der folgenden Werte annehmen:
|
||
#define R_TYPE_INT 0
|
||
#define R_TYPE_LONG 1
|
||
#define R_TYPE_DOUBLE 2
|
||
#define R_TYPE_CHAR 3
|
||
#define R_TYPE_STRING 4
|
||
|
||
Pointer: ist die Variable, in der der Wert gespeichert werden soll. Fuer
|
||
einen integer, long, double, char und char* immer "&var" verwenden.
|
||
Bei char* darf kein String uebergeben werden, sonder ein Pointer
|
||
auf einen char, da hier nur der gefundene String einsetzt wird,
|
||
und nicht kopiert wird.
|
||
|
||
|
||
Als Rueckgabewert erhaelt man -1 bei einem Fehler (nicht gefunden),
|
||
0 bei int, long, double, und char, und bei char* die Laenge des Strings.
|
||
|
||
Diese Funktion kann in einer while-Schleife verwendet werden. Wenn Section und
|
||
Path beim ersten Aufruf mit einem Wert ungleich NULL belegt werden zur
|
||
Initialisierung. Dann kann man diese bei den naechsten Aufrufen auf NULL
|
||
setzen. Das Prinzip ist das gleich wie die Funktion strtok().
|
||
|
||
Beispiel:
|
||
|
||
...
|
||
path ="*/double*";
|
||
|
||
while (Get_Type_Value(ptr,path,R_TYPE_INT,&iV) >= 0)
|
||
{
|
||
...
|
||
|
||
ptr = NULL;
|
||
path = NULL;
|
||
}
|
||
|
||
In diesem Beispiel werden dann alle Werte ausgelesen, die folgende Konditionen
|
||
entsprechen:
|
||
|
||
- Section muss mit "*" matchen.
|
||
- Entry muss mit "double*" matchen. ("double" und "DOUBLE" ist das gleiche.)
|
||
- Der Wert _muss_ ein double sein!
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
Funtion:
|
||
|
||
Get_Type_Match(section *Section, char *Path, char* Pattern,
|
||
int (*_match)(char*, char*), int Type, void **Pointer)
|
||
|
||
|
||
|
||
Hat die gleiche Funktionsweise und Parameter, wie Get_Type_Value.
|
||
Zusaetzliche Parameter:
|
||
|
||
Pattern: Ist ein String, der fuer die Funktion match zum Vergleichen
|
||
verwendet wird.
|
||
|
||
(*_match): Hier kann eine Funktion uebergeben werden, mit dem der String
|
||
("NUMBER= 07531 / 21103", der Teil nach dem "=" ist der String)
|
||
mit dem Pattern in folgender Form aufgerufen wird:
|
||
_match(Pattern,String). Hier kann man funktionen wie
|
||
strcpy(char*,char*) und num_match(char*,char*) (ist eine Funktion
|
||
zum Vergleichen von Telefonnummern auf Gleichheit) verwenden.
|
||
|
||
|
||
Zu dem obigen Beispiel muesste neben diesen drei Bedingungen noch folgende
|
||
gelten:
|
||
|
||
- _match(Pattern,String) liefert 0 zurueck.
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
Funktion:
|
||
|
||
char *Get_Value(section *Section, char *Path)
|
||
|
||
|
||
Liefert die erste Section zurueck, die auf dem Pfad matched.
|
||
|
||
|
||
Section: ist der Pointer der auf die Sectionen zeigt. Diesen erhaelt man
|
||
von einer Funktion, die die Konfigurationsdateien einliest.
|
||
|
||
Path: Beschreibt, welchen Wert man haben will in Form eines UNIX-Pfades.
|
||
Da ein Entry immer in der zweiten Ebene und eine Vielfache davon ist,
|
||
muss die Pfad-Anzahl immer modulo 2 sein:
|
||
"NUMBER/ALIAS" (Section,Entry)
|
||
"NUMBER/START/FLAG/PROGRAMM" (Section,Entry,SubSection,Entry)
|
||
|
||
Liefert die Section, die auf den Pfad matched, zurueck. Wenn keine (mehr)
|
||
vorhanden ist, dann ist der R<>ckgabewert NULL.
|
||
|
||
Diese Funktion kann in einer while-Schleife aufgrufen werden. Dafuer muessen
|
||
die beiden Parameter beim zweiten und weiteren Aufrufen auf NULL gesetzt
|
||
werden.
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
Funktion:
|
||
|
||
section* Get_Section_Match(section* Section, char *Path,
|
||
char* Value, int (*_match)(char*, char*),
|
||
entry **RetEntry )
|
||
|
||
Liefert die erste Section zurueck, die auf dem Pfad und auf Value (dieser
|
||
Wert muss mit dem entsprchenden Wert von dem Entry passen, der im Pfad
|
||
gegeben ist. z.B. "NUMBER/NUMBER") matched.
|
||
|
||
Section: ist der Pointer der auf die Sectionen zeigt. Diesen erhaelt man
|
||
von einer Funktion, die die Konfigurationsdateien einliest.
|
||
|
||
Path: Beschreibt, welchen Wert man haben will in Form eines UNIX-Pfades.
|
||
Da ein Entry immer in der zweiten Ebene und eine Vielfache davon ist,
|
||
muss die Pfad-Anzahl immer modulo 2 sein:
|
||
"NUMBER/ALIAS" (Section,Entry)
|
||
"NUMBER/START/FLAG/PROGRAMM" (Section,Entry,SubSection,Entry)
|
||
|
||
(*_match): Hier kann eine Funktion uebergeben werden, mit dem der String
|
||
("NUMBER= 07531 / 21103", der Teil nach dem "=" ist der String)
|
||
mit dem Pattern in folgender Form aufgerufen wird:
|
||
_match(Pattern,String). Hier kann man funktionen wie
|
||
strcpy(char*,char*) und num_match(char*,char*) (ist eine Funktion
|
||
zum Vergleichen von Telefonnummern auf Gleichheit) verwenden.
|
||
Wird fuer diesen Parameter NULL uebergeben, wird ein normaler
|
||
strcmp() durchgefuert.
|
||
|
||
Wert: Ist ein Pattern, der mit dem Wert des Entries passen muss.
|
||
Wenn nach einer Subection gesucht wird, dann kann dieser Parameter
|
||
genau so wie _match NULL sein.
|
||
|
||
RetEntry: Optional. Hier wird sonst ein Pointer auf einen Pointer auf
|
||
einen Entry eingetragen. Dieser liefert dann den gefundenen
|
||
Entry zurueck.
|
||
|
||
Rueckgabewert:
|
||
Einweder die gefundene Section oder NULL.
|
||
|
||
Diese Funktion kann in einer while-Schleife aufgrufen werden. Dafuer muessen
|
||
die beiden Parameter beim zweiten und weiteren Aufrufen auf NULL gesetzt
|
||
werden.
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
Funktion:
|
||
|
||
section *write_file(section *Section, const char *FileName, char *Program,
|
||
char* Version)
|
||
|
||
Erzeugt eine Datei mit der bekannten Syntax zurueck. Dabei wird ein Datei-
|
||
header erzeugt.
|
||
Diese Datei laesst sich auch sehr sinnvoll fuer Debuggingzwecke nutzen.
|
||
|
||
|
||
Section: Beinhaltet den Pointer auf die Struktur, die zurueckgeschrieben
|
||
wertden soll.
|
||
|
||
FileName: Beinhaltet den Dateinamen, in der die Struktur abgelegt werden soll.
|
||
Besteht diese Datei, wird sie ohne Warnung ueberschrieben.
|
||
|
||
Programm: Name des Programm, das diese Datei anlegen soll.
|
||
|
||
Version: Version des Programmes, das diese Datei anlegen soll.
|
||
|
||
|
||
Rueckgabewert:
|
||
|
||
Bei erfolgreicher Erstellung der Datei wird Section zurueckgeliefert.
|
||
Im Fehlerfall NULL.
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
Funktion:
|
||
|
||
void free_section(section *Ptr)
|
||
|
||
Loescht eine Section mit ihrer ganzen Unterstruktur. Es wird also die gesamte
|
||
verkettete Liste (inklusive ihrer Subsections) geloescht.
|
||
|
||
Ptr: Pointer auf eine Struktur, die geloescht werden soll.
|
||
|
||
|
||
Rueckgabewert:
|
||
|
||
Keiner.
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
Da noch nicht mehr dokumentiert ist, verweise ich mal frech auf die Dateien
|
||
lib/conffile.c ;-(((
|