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.