Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

C-Kurs/Text processing

Vorgabe

Folgender Code zum Escaping von XML ist gegeben:

#include <assert.h>
#include <string.h>

int
copy_escape_xml(char *output, const char *input) {
    const char *read = input;
    char *write = output;

    assert(input != NULL);
    assert(output != NULL);

    for (;;) {
        switch (read[0]) {
        case '\0':
            write[0] = '\0';
            return write - output;  /* == strlen(output) */
        case '&':
            strcpy(write, "&");
            write += 5;
            break;
        case '<':
            strcpy(write, "<");
            write += 4;
            break;
        case '>':
            strcpy(write, ">");
            write += 4;
            break;
        case '\:
            strcpy(write, "'");
            write += 6;
            break;
        case '"':
            strcpy(write, """);
            write += 6;
            break;
        default:
            *(write++) = read[0];
        }
        read++;
    }
}

Aufgaben

Anwendung

Finde heraus, was die Funktion copy_escape_xml aus dem String "Kernighan & Ritchie" macht und schreibe eine Test-Funktion für diesen Fall.

Refactoring

Extrahiere eine Methode aus den Blöcken mit

strcpy(write, "...");
write += ...;

um Code Duplication zu reduzieren. Nutze die Test-Funktion um sicherzustellen, dass der Code nach deinem Refactoring noch funktioniert.

In-place

Schreibe eine Methode single_slashes, die Folgen von Schrägstrichen durch einzelne Schrägstriche ersetzt. Aus "/usr//bin///env" soll "/usr/bin/env" werden.

Da die Strings dabei nicht länger werden können, bietet sich hier an "in place", also auf demselben String zu arbeiten. Der Prototyp sollte sein:

void single_slashes(char *input_output);

Auch hier kann die Verwendung von Lese- und Schreibköpfen (wie oben) praktisch sein.


Viel Spaß und Erfolg!