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.