Abgabe: 31.10.2006 in der Vorlesung
Aufgabenstellung unbedingt sorgfältig lesen!
Ausarbeitung in Form von relevanten kommentierten Code-Fragmenten!
Die folgenden Aufgaben sollen mit UNIX-üblichen Werkzeugen entwickelt werden. Verteilt die Funktionalität in geeigneter Weise auf Quelldateien, und erstellt ggf. erforderliche header. Die Quellen sollen dem ANSI-C-Standard folgen und mittels gcc übersetzt werden. Erstellt ein Makefile, dass targets für jede der Aufgaben enthält, und auch alle quellenspezifischen targets explizit angibt. Achtet bei allen Aufgaben auf korrekte Fehlerbehandlung!
Schreibt eine Funktion
int match(char *pattern, char *input);welche die übergebene Eingabe-Zeichenkette input mit der vorgegebenen Muster-Zeichenkette pattern vergleicht. pattern darf dabei normale Zeichen enthalten, die jeweils genau übereinstimen müssen, sowie einzeln stehende '*' Zeichen, die als Platzhalter für eine beliebige Zeichenfolge in der Eingabe input gelten. Eine solche Folge endet auf jeden Fall mit dem ersten Vorkommen des Muster-Zeichens nach dem '*'. match liefert den Rückgabewert 1, wenn die Eingabe mit dem Muster übereinstimmt, sonst den Wert 0. Beispiele:
match("foo", "bar") == 0 f und b stimmen nicht überein
match("*foo*", "foobar") == 1 * entspricht vorne "" und hinten "bar"
match("foo*bar", "fooxyzbar") == 1 * entspricht "xyz"
match("foo*bar", "foobarbar") == 0 * entspricht ""
Schreibt außerdem ein Programm match, das ein Muster und eine
Eingabe als Argumente bekommt und das Ergebnis von match() als
exit code liefert.
Schreibt ein Programm
copy <source> <target>welches die Datei source in die Datei target kopiert. Verwendet dazu die Funktionen open, read, write und close der Systemschnittstelle. Das Programm soll aus Gründen der Effizienz mit einem größeren Zeichen-Puffer arbeiten. Zur Verwendung der benötigten Funktionen siehe man 2 open etc.
Schreibt eine Funktion
char* getline(int fd);die vom angegebenen Kanal (file descriptor) eine beliebig lange Zeile liest und als C-Zeichenkette zurückliefert. Ein Zeile endet entweder beim Auftreten eines Zeilenende-Zeichens '\n' oder wenn nicht weiter von fd gelesen werden kann. Verwendet zum Lesen wieder die Systemfunktion read, unter Zuhilfenahme eines Puffers. Eventuell überzählig gelesene Zeichen sollen zwischen zwei Aufrufen zwischengespeichert werden (Hinweis: static !). Stehen keine Zeichen mehr zur Verfügung, soll getline den Wert NULL liefern. Verwendet zur Implementierung die Bibliotheksfunktionen malloc, realloc und free für dynamische Speicherverwaltung. Der Aufrufer ist für die Freigabe der zurückgelieferten Zeile verantwortlich. Schreibt ferner ein Programm linetest, welches mittels getline() Zeilen von der Standardeingabe (fd=0) liest und auf die Standardausgabe (fd=1) schreibt.
Erstellt ein Programm
matching <pattern> <source> <target>welches die Datei source zeilenweise ausliest und jeweils mit dem angegebenen Muster pattern vergleicht. Zeilen sollen bei Übereinstimmung in die Ausgabedatei target geschrieben und ansonsten verworfen werden. Verwendet hier die Möglichkeiten des Makefile, um die Quellen der Aufgaben 1 und 3 wiederzuverwenden.