← ST-Computer 04 / 1987

Zugriff auf die Kommandozeile in Modula-2

Listing

In der Sprache „C“ kann man leicht auf Argumente, die beim Programmaufruf mitgegeben wurden, zugreifen. In Modula-2 fehlt diese Möglichkeit.

Wird in „C“ die Hauptfunktion „main“ mit den Argumenten „(arvc,argv)“ programmiert, so stehen in diesen Variablen beim Programmstart zusĂ€tzliche Optionen. Bei „AS68 -1“ z. B. hat man Zugriff auf die Option 1“. Modula-2 bietet diese Möglichkeit nicht. Deshalb konnte man bis jetzt keine ".TTP“-Programme schreiben.

Das hier vorgestellte Modul „Argv“ exportiert die Funktion „GetArgv“, die den Argumentstring und seine LĂ€nge liefert. Dazu ist ein Zugriff auf die Base-Page des jeweiligen Programms nötig. Diesen Zugriff erlaubt das Modul „GEMX“, das einen Zeiger auf diese Base-Page exportiert (siehe Modula-2-Handbuch).

Im ersten Byte des Strings, auf den „EnvPtr“ zeigt, steht die LĂ€nge des Argumentstrings. Die nĂ€chsten Bytes enthalten diese Zeichenkette, die mit einem Null-Zeichen abgeschlossen wird. Man kann nun bei ".TTP“-Programmen oder bei Programmen, die unter „COMMAND“ gestartet werden, auf zusĂ€tzlich eingegebene Optionen reagieren.

Bei keiner zusĂ€tzlichen Option ergibt „arge eine 0, bei einem Zeichen schon eine 2. Dies liegt daran, daß das Leerzeichen zwischen dem Programmnamen und den Optionen beim Aufruf unter „COMMAND“ (im Gegensatz zu ".TTP“-Programmen aus dem Desk-top) mitgezĂ€hlt wird und auch in „argv“ vorhanden ist. Man muß also immer zunĂ€chst eventuelle Leerzeichen in „argv“ ĂŒberlesen.

Das Beispielprogramm gibt einfach die Argumentzeile und ihre LĂ€nge aus. Sie können damit einmal experimentieren und die Ergebnisse von „GetArgv“ beobachten!

(*----------- Definitionsmodul ----------- *) DEFINITION MODULE Argv; PROCEDURE GetArgv (VAR arge:INTEGER; VAR argv:ARRAY OF CHAR); END Argv (*---------- Implementationsmodul-------------*) IMPLEMENTATION MODULE Argv; FROM GEMX IMPORT BasePageType, BasePageAddress ; (* holt den Argument-String aus dem Base-Page-Table *) PROCEDURE GetArgv(VAR argc:INTEGER; VAR argv:ARRAY OF CHAR); VAR index:INTEGER; BEGIN (* LĂ€nge holen *) argc:=INTEGER( BasePageAddress^ .EnvPtr^ [0] ) ; index:=0; (* Argumentstring kopieren *) REPEAT argv[index]:=^BasePageAddress'' .EnvPtr^[index+1] ; index:=index+1 UNTIL argv[index-1]=0C (* fertig *) END GetArgv; END Argv (*--------------- Demoprogramm ---------------*) MODULE ArgvDemo; FROM Argv IMPORT GetArgv ; FROM InOut IMPORT WriteString, WriteLn, WriteInt ; VAR cmdline : ARRAY [0..79] OF CHAR; cmdlinelength: INTEGER; BEGIN (* LĂ€nge und Inhalt holen *) GetArgv(cmdlinelength,cmdline); (* Argumente ausgeben *) WriteString(cmdline); WriteLn; (* LĂ€nge ausgeben *) WriteString('LĂ€nge : '); WriteInt(cmdlinelength,5); WriteLn END ArgvDemo.
Robert Tolksdorf