Zugriff auf die Kommandozeile in Modula-2

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
Aus: ST-Computer 04 / 1987, Seite 98

Links

Copyright-Bestimmungen: siehe Über diese Seite