Tips und Tricks für C-Programmierer

Arbeit mit Kommandozeilenparametern

Atari-Anwender kommen im Normalfall kaum mit Kommandozeilenparametern in Berührung. Dies ist nur beim Aufruf von ».TTP«-Anwendungen oder beim Einsatz eines externen Kommandozeilen-Interpreters der Fall. Zusätzlich zum Dateinamen übergeben wir weitere Parameter, die den Funktionsablauf des Programms festlegen. Gängige C-Compiler unterstützen zum Auswerten der Kommandozeile einen ANSI-C-konformen Standard, bei dem der Zugriff über zwei Parameter der main() -Funktion erfolgt:

int main (int argc, char *argv[])

Der Parameter »argc« enthält die Anzahl der übergebenen Argumente, wobei der Programmname bereits als ein Element zählt. Im »argv[]«-Zeichenkettenfeld finden wir die einzelnen Parameter in getrennten Strings wieder, wobei »argv[0]« leer ist (bei MS-DOS enthält es den Dateinamen des aufgerufenen Programmes). argv[1] bis argv[n] enthalten die Parameter. Unser Programm »ARGLIST.TTP« gibt die übergebenen Parameter zeilenweise aus. (Frank Mathy/ah)

for(i=0; i<argc; i++)
	printf („%s\n“,argv[i]);

Dateistatistik leichtgemacht

Anwender von 1ST-Word-Plus schätzen die Funktion zum Ermitteln der Textgröße, Zeilen- und Wortzahl. Eine derartige Funktion stellt uns das Betriebssystem leider nicht zur Verfügung. Diese Aufgabe übernimmt das Programm »WC.TTP« auf der TOS-Diskette. Nach dem Doppelklick auf »WC.TTP« erscheint ein Dialogfeld, in dem wir als Parameter einfach die Dateinamen der auszuwertenden Dateien, jeweils durch Leerzeichen getrennt, angeben. Das Programm ermittelt nun die Statistik für die genannten Daten und gibt sie auf dem Bildschirm aus.

Wurden mehrere Dateien gewählt, so erscheint abschließend eine Gesamtstatistik über alle Dateien. Einzelne Informationen wie Wort oder Zeilenzahl ermitteln Sie über einen zusätzlichen Parameter, der mit einem Minuszeichen eingeleitet wird. Je nach gewünschter Information schließen wir ein »c« für die Zeichenzahl (»character«), ein »w« für die Wortzahl und ein »l« für die Zeilenzahl (»lines«) an. Der Aufruf »-wl test.txt« steht für die Ausgabe der Anzahl der Worte und Zeilen der Datei »TEST.TXT«.

Zur Programmtechnik: Nach der Auswertung der Aufrufparameter werden alle Dateien schrittweise bearbeitet. Hierzu öffnen wir jeweils die Datei mit »fopen()«, ermitteln mit »zaehl()« die Dateistatistik, schließen die Datei und geben die ermittelten Daten auf dem Bildschirm aus. Gegebenenfalls geben wir abschließend eine Gesamtstatistik aus.

Trifft die zeichenorientierte Funktion zaehl() auf ein Trennzeichen wie Leerzeichen, Tabulator, Wagenrücklauf, Zeilen- oder Seitenvorschub, gilt ein eventuell bearbeitetes Wort als beendet, weshalb wir den Wortzähler erhöhen. Liegt hingegen ein anderes Zeichen vor, so befinden wir uns in einem Wort. Bei einem Newline-Zeichen oder Seitenvorschub erhöhen wir zudem die Zeilenzahl, womit die Zählung abgeschlossen wäre. (Frank Mathy/ah)

Directory à la DOS

Da der Atari ST ohne Kommandozeilen-Interpreter geliefert wird, können wir Verzeichnisse nur über den GEM-Desktop betrachten, was im Regelfall völlig ausreicht. Problematisch wird es jedoch, wenn wir die Dateienliste in eine Textdatei leiten wollen. Hier ist TOS mit seinem Latein am Ende.

Um dieses Manko zu beseitigen, wollen wir nun Schritt für Schritt eine leistungsfähige Directory-Funktion realisieren. Das Resultat ist auf der TOS-Diskette in Form der Pure-C-Quelltexte »DIRI.C« bis »DIR4.C« und dem Programm »DIR4.TTP« enthalten. Wir wollen das Programm (»DIRI.C«) zunächst so gestalten, daß als einziger Parameter der Name des gewünschten Verzeichnisses anzugeben ist. Fehlt der Parameter, ist das aktuelle Verzeichnis - im GEMDOS durch den Dateinamen ».« repräsentiert - zu verwenden. Die Hauptfunktion ruft hierzu die »dodir«-Funktion mit dem Verzeichnisnamen als Parameter auf. Ist das zweite Zeichen davon ein Doppelpunkt, ist ein neues aktuelles Laufwerk über »Dsetdrv()« zu wählen. Den neuen Pfad setzen wir mit »Dsetpath()«. Zuvor vergessen wir nicht, uns das alte Laufwerk und Verzeichnis zu merken.

Wurden diese Vorbereitungen ohne Probleme abgeschlossen, sind wir im gewünschten Verzeichnis und können den ersten Eintrag mit »findfirst()« einlesen. Neben dem Suchmuster, das hier stets ».« ist, übergeben wir die Adresse einer »ffblk«-Struktur für den gelesenen Eintrag und den Wert »FA_DIREC«, mit dem wir festlegen, daß auch Unterverzeichnisse gelesen werden sollen. Solange Einträge vorhanden sind, wird nun eine while-Schleife durchlaufen, in der wir die Dateidaten ausgeben. »ff_name« enthält den Dateinamen, »ff_fsize« (Dateigröße), »ff_attrib« (codierte Attribute) und »ff_ftime« (Erstellungsdatum mit Uhrzeit). Anschließend lesen wir über »findnext« den nächsten Verzeichniseintrag, bis keine weiteren Dateien vorzufinden sind. Nach dem Verlassen der while-Schleife wurde das Verzeichnis komplett ausgegeben. Zum Schluß wechseln wir wieder in das ursprüngliche Verzeichnis.

In der zweiten Version des Programmes »DIR2.C« bringen wir etwas Ordnung in das Chaos der bisherigen Verzeichnisausgabe. Wurden bisher Ordner- und Dateieinträge gemischt gezeigt, geben wir nun zunächst alle Verzeichniseinträge und darauf alle Dateieinträge aus. Hierzu geben wir zunächst nur alle Einträge aus, deren Verzeichnis-Attributbit gesetzt ist. In einer zweiten while-Schleife durchlaufen wir das Unterverzeichnis erneut, wobei wir den dritten Parameter des »findfirst«-Aufrufs auf Null setzen, so daß Verzeichniseinträge unbeachtet bleiben.

Bislang bewegten wir uns bei der Verzeichnisanzeige stets in einem Verzeichnis. Um die Übersicht in komplexen Verzeichnisstrukturen zu behalten, ist eine rekursive Anzeige sehr nützlich. Dabei zeigen wir nicht nur den Namen des Ordners an, sondern auch dessen Inhalt. Findet das Programm erneut Unterverzeichnisse, setzt sich der Vorgang fort.

In »DIR3.C« realisieren wir erstmals die rekursive Anzeige, wozu wir als zweiten Parameter »-r« anfügen. »dodir()« erhält als zweiten Parameter den Wert »tiefe«. Ist dieser negativ, so erfolgt die normale Anzeige, andernfalls gibt der Wert die Tiefe des aktuellen Verzeichnisses an (0=Urverzeichnis, 1 =Erste Rekursion etc.).

Zunächst lesen wir nun alle Dateien des Verzeichnisses und geben sie eleganterweise über die Funktion »ausgabe« aus. Der zweite Durchgang pickt die Unterverzeichniseinträge heraus. Liegt keiner der Platzhalter ».« oder »..« vor, zeigt das Programm den Eintrag an. Ist »tiefe« nicht kleiner als Null, ruft sich die Funktion »dodir« rekursiv auf, wobei der gelesene Verzeichnisname und der um 1 erhöhte Wert »tiefe« übergeben werden.

Somit wäre die rekursive Ausgabe erreicht, doch eine Ausgabeumlenkung auf den Drucker oder in eine Datei realisieren wir erst in »DIR4.C/TTP«. Hierzu ist als zusätzlicher Parameter einfach der Datei- bzw. Gerätename - angeführt vom Größerzeichen zur Ausgabeumlenkung (z.B. >PRN:, >DISKA.LST) - erforderlich. Machen wir von dieser Option Gebrauch, öffnet das Programm die entsprechende Datei per fopen(). ausgabe() arbeitet nicht mehr mit »printf()«, sondern mit der Funktion »fprintf()«, die alle Ausgaben in die gewünschte Datei bzw. in den Standardausgabekanal umleitet. Einen Ausdruck aller Dateien auf Laufwerk C: erhalten wir also durch Doppelklick auf DIR4.TTP und Eingabe der Parameter „-r >prn:“. (Frank Mathy/ah)



Aus: TOS 08 / 1992, Seite 84

Links

Copyright-Bestimmungen: siehe Über diese Seite