Sitzung: Jeden Freitag ab 14:30 s.t. online. Falls ihr den Link haben wollt, schreibt uns.

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, "&amp;");
            write += 5;
            break;
        case '<':
            strcpy(write, "&lt;");
            write += 4;
            break;
        case '>':
            strcpy(write, "&gt;");
            write += 4;
            break;
        case '\'':
            strcpy(write, "&apos;");
            write += 6;
            break;
        case '"':
            strcpy(write, "&quot;");
            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 Funktion 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" (auf demselben String) zu arbeiten.
Der Prototyp von single_slashes sollte sein:

void single_slashes(char *input_output);

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


Viel Spaß und Erfolg!