"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

C: Config files parsen

DJ_Cyberdance 27.04.2006 - 12:17 988 10
Posts

DJ_Cyberdance

Here to stay
Avatar
Registered: Jun 2002
Location: Vesterålen
Posts: 1838
Kennt jemand brauchbare Bibliotheken für C, mit denen man Config-Files parsen kann? Auch solche, die ineinander verschachtelte Abschnitte haben können? (Wie zB Apache-Config-Files oder die für Samba)

Wichtig: Muß in plain C sein und unter Linux und gcc compilen.

SYSMATRIX

Legend
Legend
Registered: May 2000
Location: ~
Posts: 5020
unter config file verstehst du jetzt eine selberdefinierte syntax? weil einen "config file standard" gibt es natürlich nicht, aber ich schätze mal daß du dir dessen bewußt bist.

in den letzten jahren hat es sich eingebürgert für config sachen XML zu verwenden. parser sind recht einfach zu bauen und eine parsertoolkit welches auf jeder linux distro von haus aus dabei ist und natürlich SAX(2) und DOM beherrscht ist die libxml.

die lib selbst ist in C geschrieben und es gibt *unzaehlige* bindings falls gewünscht, zusätzlich kompiliert die auf absolut jeder nur erdenklichen platform.

libxml kann sogar validaten und was mit DTDs anfangen, uU ist das aber für simple dinge eh overkill und du schlägst doch denn "roll your own" weg ein.

as said es ist ein parser toolkit und ich find ihre API zwar grauenhaft, aber die meisten verwenden das ding.

Code:
# Libxml2 exports Push (progressive) and Pull (blocking) type parser interfaces for both XML and HTML.
# Libxml2 can do DTD validation at parse time, 
using a parsed document instance, or with an arbitrary DTD.
# Libxml2 includes complete XPath, XPointer and XInclude implementations.
# It is written in plain C, making as few assumptions as possible, 
and sticking closely to ANSI C/POSIX for easy embedding. Works on
 Linux/Unix/Windows, ported to a number of other platforms.
# Basic support for HTTP and FTP client allowing applications to 
fetch remote resources.
# The design is modular, most of the extensions can be compiled out.
# The internal document representation is as close as possible to the DOM interfaces.
# Libxml2 also has a SAX like interface; 
the interface is designed to be compatible with Expat.
# This library is released under the MIT License. 

Spikx

My Little Pwny
Avatar
Registered: Jan 2002
Location: Scotland
Posts: 13504
Oder eben mit yacc/bison und flex selber basteln.. aber die Möglichkeit müsstest ja eh schon wissen? :)

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25422
Zitat
n den letzten jahren hat es sich eingebürgert für config sachen XML zu verwenden. parser sind recht einfach zu bauen und eine parsertoolkit welches auf jeder linux distro von haus aus dabei ist und natürlich SAX(2) und DOM beherrscht ist die libxml.
xml config files haben etwas ungutes an sich.. die lesbarkeit als plain text. ausserdem kenne ich diesen neuen trend nicht, habe xml configs auch noch nie bei klassischen linux applikationen gesehen. auch bei php, wo es sich anbieten würde, konnte ich von einem "einbürgern" noch nichts dergleichen feststellen.

SYSMATRIX

Legend
Legend
Registered: May 2000
Location: ~
Posts: 5020
Zitat von mat
xml config files haben etwas ungutes an sich.. die lesbarkeit als plain text.
tja, da bist du einer der wenigen die nicht einsehen welche vorteile human readable files besitzen, im besondern bezug auf config files. ich empfehle zwecks besseren verständnis die geschichte von UNIX nachzulesen, wo human readable files ein _fundamentales_ konzept bilden.


[quote]
Important Advantages

Plain text offers some important advantages over other ways of storing and manipulating data. They revolve around the fact that it is the most flexible and portable format for data. That is, everything can be done with plain text that could be done with any binary format, and some things can be done with plain text that cannot easily (if at all) be done with some binary formats. This is because plain text is supported by nearly every application program on every operating system and on every type of processor and allows information to be manipulated (including, searching, sorting and updating) both manually and programmatically using virtually every text processing tool in existence.

This flexibility and portability make plain text the best format for storing data persistently (i.e., for years, decades, or even millennia). That is, plain text provides insurance against the obsolescence of any application programs that are needed to create, read, modify and extend data. Human-readable forms of data (including data in self-describing formats such as HTML and XML) will most likely survive longer than all other forms of data and the application programs that created them. In other words, as long as the data itself survives, it will be possible to use it even if the original application programs have long since vanished.

For example, it is very easy to read a data file from a legacy system (i.e., an antiquated program or operating system) or convert it to some other format even if there is little or no information about the original program that was used to create it, if that data file is written in plain text. If it is written in some binary format, such as by a proprietary (i.e., commercial) word processor or spreadsheet program, it might be very difficult or impossible to read or use it.

Plain text is not necessarily unstructured text. Programming languages as well as SGML (standard generalized markup language) and its modern descendants, most notably HTML (hypertext markup language) and XML (extensible markup language), are examples of plain text formats that have well-defined structures. These formats have the important advantage of making plain text easier for computers to read, reorganize and modify while keeping it relatively readable by humans.

Plain Text and the Unix Philosophy

The use of plain text is an important part of the Unix philosophy, and thus of the Linux philosophy (which incorporates the Unix philosophy). Consequently, in contrast to other types of operating systems, Linux and other Unix-like operating systems attempt to use plain text as much as possible and to minimize the use of binary code.

For example, programs are designed to produce plain text output to the extent practical. An obvious example of a type of program whose primary output cannot be plain text is a compiler, because its purpose is to translate plain text (i.e., source code) into binary code (i.e., runnable programs that can be read directly by the CPU).

All filters use plain text input and produce plain text output. Filters, which are among the most important programs in Unix-like operating systems, are small and (usually) specialized programs that transform plain text data in some meaningful way. They are designed to be linked together using pipes (represented in commands by the vertical bar character) to form pipelines of commands that can have great power and flexibility.

Also, Unix-like operating systems use plain text files (i.e., files that contain only plain text and no binary data) for system and application configuration information. A major advantage of this approach is ease of access and modification, which can be particularly useful when repairing a crashed or otherwise damaged system. Examples of plain text configuration files include /etc/fstab (which lists the currently mountable filesystems), etc/passwd (which holds user account data) and /etc/httpd.conf (which is the configuration file for the highly popular Apache web server).
[/quote]



[QUOTE]Originally posted by mat
ausserdem kenne ich diesen neuen trend nicht, habe xml configs auch noch nie bei klassischen linux applikationen gesehen. auch bei php, wo es sich anbieten würde, konnte ich von einem "einbürgern" noch nichts dergleichen feststellen. [/QUOTE]

dann liegt es hoechstwahrscheinlich daran daß dein horizont in diesem fall nicht breit genug ist.

siehe:
Gnome: durch und durch XML
OS X: xml für startup config und init (launchd)
fonttool/fontconfig/freetype
FreeBSD: kann mit xml files boostrapped werden: m0n0wall
(launchd port auch möglich)
ImageMagick
OpenOffice
XChat
foomatic
KDE's kate
xkb in X11
Evolution
Gentoo Linux installer und diverse andere installer
elektra initiative (die vielleicht mal LSB wird) [XML config für Xorg, Samba, ...]


... sind mal die dinge die die mir ad hoc einfallen und die jetzt schon XML config verwenden, wahrscheinlich verwenden dutzende andere apps XML als basis fürs config, die bei jeder 0815 linux installation dabei sind. nicht umsonst ist die libxml2 als standardpacket in nahe zu jeder distribution zu finden, und das in der minimal/basis-config.
und dies war noch vor ~5-8 jahren nicht so, da war dieser trend zumindest mir nicht so offensichtlich wie jetzt.


aus wikipedia:
[quote]Recently, XML and YAML have become popular as configuration file formats. They have the advantages of having well-defined syntaxes, and tools to validate and verify the syntax of the files that are created in those formats. [/quote]

nur weil es sich bei php anbieten würde XML für die konfiguration zu verwenden und es nicht so realisiert ist bis dato, heißt das lange nicht daß dieser trend nicht existiert, oder gar daß die PHP devs nicht in dieser richtung schnuppern würden. obwohls großteil ansichtssache ist: faktisch gesehen ist PHP gsd keine klassische linux applikation, sowas gibt es eigentlich gar nicht.

Luzandro

OC Addicted
Avatar
Registered: Mar 2006
Location: 2482
Posts: 708
Zitat von SYSMATRIX
tja, da bist du einer der wenigen die nicht einsehen welche vorteile human readable files besitzen, im besondern bezug auf config files.

ich glaube es ging ihm eher darum, dass XMLs u.U. etwas mühsamer zu lesen sind...

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25422
Zitat
tja, da bist du einer der wenigen die nicht einsehen welche vorteile human readable files besitzen, im besondern bezug auf config files. ich empfehle zwecks besseren verständnis die geschichte von UNIX nachzulesen, wo human readable files ein _fundamentales_ konzept bilden.
tja, da hast du wohl meinen satz nicht ganz verstanden.. xml files = schwer lesbar, plain text config (ini, apache, ..) files = leicht lesbar.

deine beispiele kommen aus der gui welt.. dort wird die reine shell natürlich seltener angewendet und xml files haben mehr bzw. bessere möglichkeiten dargestellt zu werden.

fyi:
Zitat
dann liegt es hoechstwahrscheinlich daran daß dein
horizont in diesem fall nicht breit genug ist.
nehm ich als beleidigung, nicht als kritik.

@wikipedia zitate, manchmal schön und gut.. sollte man allerdings ebenfalls, so wie alles, auf die waage stellen. für mich sind xml files nicht populär, ohne jeglicher aussage über das konzept selbst, ich finde sie sind sehr spärlich vorhanden, obwohl ich täglich mit allerlei programmen hantiere. dort wo ich sie auffinde (zB in der config für die config für pear), dort haben sich mich bis jetzt genervt. man wird sehen was sich durchsetzen wird, für ein vereinheitlichtes config format bin ich jedenfalls offen.. ob ini oder xml.

SYSMATRIX

Legend
Legend
Registered: May 2000
Location: ~
Posts: 5020
Zitat von mat
tja, da hast du wohl meinen satz nicht ganz verstanden.. xml files = schwer lesbar, plain text config (ini, apache, ..) files = leicht lesbar
da hast du absolut recht, habe dich hier falsch verstanden.

Zitat von mat
deine beispiele kommen aus der gui welt.. dort wird die reine shell natürlich seltener angewendet und xml files haben mehr bzw. bessere möglichkeiten dargestellt zu werden.
das ist durchaus richtig, jedoch sind zB OS X launchd, maybe auch FreeBSD launchd und auch Sun's system was das angeht richtungsweisend, ob es sich lohnt dorthin zu gehen ist eine andere sache, s. u. .

Zitat von mat
fyi:nehm ich als beleidigung, nicht als kritik.
entschuldigung, so war es nicht gemeint. gab/gibt auch keinen anlaß dich zu beleidigen.

Zitat von mat
@wikipedia zitate, manchmal schön und gut.. sollte man allerdings ebenfalls, so wie alles, auf die waage stellen. für mich sind xml files nicht populär, ohne jeglicher aussage über das konzept selbst, ich finde sie sind sehr spärlich vorhanden, obwohl ich täglich mit allerlei programmen hantiere. dort wo ich sie auffinde (zB in der config für die config für pear), dort haben sich mich bis jetzt genervt. man wird sehen was sich durchsetzen wird, für ein vereinheitlichtes config format bin ich jedenfalls offen.. ob ini oder xml.
mir sind die qualitätsprobleme von wikipedia bewußt.

es geht mir genauso auf die nerven, jeder der schon einmal fonts.conf/horde/... oä editieren wollte wird das auch bestätigen.
aus diesem grund wurde ja auch YAML entwickelt, es ist aus genau dieser argumentation hervorgegangen.


as said ich bin auch kein verfechter der xml config sachen, habe es nur bemerkt daß der trend in diese richtung geht.

Zitat von mat
für ein vereinheitlichtes config format bin ich jedenfalls offen.. ob ini oder xml.
dann dürfte dich die elektra initiative interessieren.
http://www.libelektra.org/Main_Page

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25422
Zitat
dann dürfte dich die elektra initiative interessieren.
http://www.libelektra.org/Main_Page
klingt interessant, jedoch wieder nur für GUI basierende anwendungen. das config format selber strotzt von wiederholten wörter und das dient der übersichtlichkeit in plain text leider überhaupt nicht.

auszug:
Code:
An example of an elektrified /etc/X11/xorg.conf or /etc/X11/XF86Config: 

   system/sw/xorg/Layouts/Default Layout/Inputs/Keyboard0/CoreKeyboard =
   system/sw/xorg/Layouts/Default Layout/Inputs/Mouse0/CorePointer =
   system/sw/xorg/Layouts/Default Layout/Screens/Screen0/Absolute.x = 0
   system/sw/xorg/Layouts/Default Layout/Screens/Screen0/Absolute.y = 0
   system/sw/xorg/Layouts/Default Layout/Screens/Screen0/ScreenNumber = 0
   system/sw/xorg/Files/FontPath = unix/:7100
   system/sw/xorg/Files/RgbPath = /usr/X11R6/lib/X11/rgb
   system/sw/xorg/Devices/Videocard0/BoardName = Intel 740 (generic)

YAML dagegen wirkt wirklich interessant, hat aber nichts mehr mit XML zu tun. einfach, übersichtlich.. perfekt für skriptsprachen. lediglich über die freiheit lässt sich streiten, mehr kann ich aber nicht sagen, dafür würde man den gebrauch in der praxis benötigen. bin jedenfalls schwer am überlegen, ob mein nächstes projekt nicht YAML statt einer eigenen mysql serialisierung verwenden wird. danke für den tip! :)

Geigerzeiger

Addicted
Registered: Jan 2004
Location: anywhere
Posts: 449
@topic: So einen Parser musst du selber schreiben (es fällt mir momentan keine lilbrary für .cfg-parser ein).

Du gehst am Besten so vor:
1. Guck dir die Syntax der config files an bzw. wie sie aufgebaut sind. Wie du sagtest ist ein apache config file (z.B. httpd.conf) so aufgebaut:
Jeder Kommentar bigennt mit einem # (kann in jeder Zeile stehen). nach dem # ist alles bis zur neuzeile auskommentiert.
Nach einem Wort folgt meistens eine Zahl oder ein weiterer String, das sind dann die Einstellungen.
Siehe
Code:
#
# Timeout: The number of seconds before receives and sends #time out.
#
Timeout 300

2. Du brauchst einen Scanner (lexikalischer Analysator) der dir erkennt ob es sich jetzt um ein Kommentar oder, einem zusammengesetzten Wort oder einer Zahl handelt. Das File muss daher zeichenweise eingelesen werden.

3. Der Scanner übergibt dem Parser das erkannte Wort oder die Zahl, usw. (auch genannt Symbol) Derr Parser muss erkennen ob die Folge der erkannten Symbole in der syntaktischen Reihenfolge sind oder nicht.

In unserem Beispiel:
wenn er das "timeout" wort erkennt und nachher die zahl "30" folgt, ist das syntaktisch korrekt. Der Parser muss an der Stelle eine sematische Aktion ausführen. D. h. er muss das timeout auf 30 sekunden setzen.

DJ_Cyberdance

Here to stay
Avatar
Registered: Jun 2002
Location: Vesterålen
Posts: 1838
Njo das Parsen ist ja eigentlich das geringere Problem, hab mit Bison und Flex schon ein paar Parser gebastelt, die ganz nett funktionieren.
Das gröbere Problem ist, daß ich nicht weiß, wie ich einen Wert in einem Config-File ändern kann, ohne das ganze File neu zu schreiben. Wenn ich händisch einen Kommentar einfüge, ignoriert der Parser diesen Kommentar. Wenn jetzt mein Programm einen Wert ändert, muß ich den im Config-File aktualisieren... Wie tu ich da am blödesten?

Syntax ist selber definiert, Config-File besteht aus Sections und normalen Einträgen. Jede Section besteht wieder aus normalen Einträgen und/oder weiteren Sections, das ganze hat beliebige Rekursionstiefe.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz