From 754fe554f289e6ea1933815a1f772bfd34b20d92 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 11 Apr 2025 12:07:18 +0200 Subject: better documentation for code blocks in readme --- readme.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/readme.md b/readme.md index 7abfb7b..2b080cf 100644 --- a/readme.md +++ b/readme.md @@ -73,7 +73,7 @@ Lösung: => Selber schreiben! Nehmen wir an, wir schreiben eine Funktion zur CSV-Verarbeitung. Das Grundgerüst sieht dann etwa so aus: -~~~ +~~~c bool processFile(const char *filename) { @@ -92,7 +92,7 @@ processFile(const char *filename) Wir fügen als erstes etwas Code hinzu: -~~~ +~~~c csv_t csv; csv_init(&csv); @@ -107,7 +107,7 @@ Dieser Code erzeugt ein neues `csv_t`-Objekt im Speicher welches anschließend d Dann wird der Datenstrom `in` zeilenweise in den Speicher eingelesen und innerhalb der Schleife verarbeitet. Die Anzahl der Felder pro Zeile wird mit Hilfe der Funktion `csv_nfields()` ermittelt. Alternativ liefert auch der Returnwert von `csv_read()` die Feldanzahl: -~~~ +~~~c // ... size_t nf; while ( (nf = csv_read(&csv, in)) != 0 ) { @@ -130,7 +130,7 @@ Wenn nichts weiter angegeben ist, gehen wir von einem Komma (`,`) als Feldtrenne Wir berücksichtigen dies bei der Initialisierung eines `csv_options_t`-Objektes. -~~~ +~~~c csv_options_t csv_options = csv_default_options; csv_options.field_delimiter = '"'; csv_options.field_separator = ','; @@ -155,7 +155,7 @@ Bei der Verarbeitung können verschiedene Fehler auftreten, die ein robustes Pro Die beste Variante, die dem klassischen Exceptions am nächsten kommt, sind die beiden C-Funktionen `setjmp()` und `longjmp()`, mit deren Hilfe wir nun die Fehlerbehandlung umsetzen. Wir benötigen dafür die beiden Felder `cb_error` und `cb_error_arg` des `csv_options`-Objektes: -~~~ +~~~c jmp_buf env; csv_options.cb_error = csvErrorHandler; csv_options.cb_error_arg = &env; @@ -163,7 +163,7 @@ csv_options.cb_error_arg = &env; `cb_error` ist ein Zeiger auf eine Callback-Funktion, die im Falle eines Fehlers aus der CSV-Bibliothek heraus aufgerufen wird. Ihr werden ein Fehlerwert vom Typ `csv_err_t` sowie ein Zeiger auf benutzerdefinierte Daten -- in unserem Fall ein Zeiger auf eine `jmp_buf`-Variable -- mit übergeben: -~~~ +~~~c static void csvErrorHandler(csv_err_t err, void *cb_arg) { @@ -176,7 +176,7 @@ Mit Hilfe des Parameter `err` wird eine einfache Fehlermeldung protokolliert. An Die Hauptschleife in unserer Funktion sieht nun so aus: -~~~ +~~~c csv_options_t csv_options = csv_default_options; csv_options.field_delimiter = '"'; csv_options.field_separator = ','; @@ -218,7 +218,7 @@ case CSV_ERR_IO_READ: **Fehlercodes** für die Callbackhandler: -~~~ +~~~c typedef enum { CSV_ERR_OK = 0, CSV_ERR_OUT_OF_MEMORY = -1, @@ -230,7 +230,7 @@ typedef enum { **Optionen** für das Parsen eines CSV-Streams: -~~~ +~~~c typedef struct { int field_delimiter; int field_separator; @@ -249,7 +249,7 @@ extern const csv_options_t csv_default_options; **Contextobjekt** zur Aufnahme der aktuell gelesenen Zeile: -~~~ +~~~c typedef struct { csv_options_t *csv_options; /* additional internal fields */ @@ -260,7 +260,7 @@ typedef struct { **Initialisieren** -~~~ +~~~c void csv_init(csv_t *csv); void csv_init_opt(csv_t *csv, const csv_options_t *const csv_options); ~~~ @@ -277,7 +277,7 @@ Mit der Funktion `csv_init_opt()` und einem angepassten `csv_options_t`-Objektes **Manuelles Freigeben** -~~~ +~~~c void csv_cleanup(csv_t *csv); ~~~ @@ -290,7 +290,7 @@ Parameter **Zeilenweises Lesen** -~~~ +~~~c size_t csv_read(csv_t *csv, FILE *in); ~~~ @@ -305,7 +305,7 @@ Rückgabe **Feldzugriff** -~~~ +~~~c size_t csv_nfields(const csv_t *const csv); const char *csv_field(const csv_t *const csv, size_t idx); ~~~ @@ -322,7 +322,7 @@ Rückgabe **Fehlercodes als Textmeldung** -~~~ +~~~c const char *csv_err_str(csv_err_t csv_err); ~~~ @@ -351,11 +351,11 @@ Table: Makros Soll beispielsweise das in Deutschland viel häufiger vorkommende Semikolon (`;`) statt einem Komma (`,`) standardmäßig als Trennsymbol zwischen den Feldern einer CSV-Datei benutzt werden sieht der Aufruf zum Compilieren so aus: -~~~ +~~~sh cc -DCSV_DEFAULT_SEPARATOR="';'" -o csv-german.o -c csv.c ~~~ -Anschließend wird die Datei `csv-german.o` statt `csv.o` zum Projekt dazugelinkt. +Anschließend wird die Datei `csv-german.o` statt `csv.o` zum Projekt dazu gelinkt. Die Headerdatei (`csv.h`) bleibt unverändert. -- cgit v1.3