home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1993-10-23 | 7.3 KB | 127 lines |
- DEFINITION MODULE cmdline;
-
- (*****************************************************************************)
- (* "GEMDOS": *)
- (* Durch dieses Modul soll zur Kommandozeile und zum Environment eine aehn- *)
- (* liche Schnittstelle bereitgestellt werden, wie sie fuer C-Programme exi- *)
- (* stiert. *)
- (* Das Modul sollte als allererstes im Hauptmodul importiert werden, und es *)
- (* sollte kein anderes (System)modul, das sich mit Kommandozeile oder Envi- *)
- (* ronment beschaeftigt, importiert werden (auch auf versteckte Importe aus *)
- (* tieferliegenden Modulen achten). Es kann trotzdem nicht garantiert werden,*)
- (* dass dieses Modul mit allen M2-Systemen arbeitet. *)
- (* *)
- (* Es wird auf drei Arten nach Argumenten der Kommandozeile gesucht, wobei *)
- (* die angegebene Reihenfolge eingehalten wird; nur wenn nach einem Verfahren*)
- (* keine Argumente uebergeben wurden, wird nach der naechsten Moeglichkeit *)
- (* der Argumentuebergabe gesucht: *)
- (* *)
- (* 1) ARGV im Environment (Atari-Standard) bzw. MWC *)
- (* 2) Programmname ueber AES.shell_read, falls die Kommandoparameter mit *)
- (* denen aus der Basepage uebereinstimmen (auch fuer TOS-Programme). *)
- (* (Diese Funktion existiert nur, wenn beim Praeprozessieren des Imple- *)
- (* mentationsmoduls das entsprechende Makro definiert war.) *)
- (* 3) Kommandozeile in der BasePage (Atari-Standard) *)
- (* *)
- (* *)
- (* Ist 'MWCStyle' = TRUE, wird das Laengenbyte der Kommandozeile, das mit *)
- (* dem normalerweise ungueltigen Wert von 127 anzeigt, dass per ARGV Argumen-*)
- (* te uebergeben werden, ignoriert. Hierdurch koennen auch aeltere Programme,*)
- (* wie z.B. die Shell 'Gulaam' (mit: 'set env_style mw'), die das sehr aehn- *)
- (* liche Mark Williams-Verfahren fuer erweiterte Kommandozeile benutzen, *)
- (* Argumente uebergeben. *)
- (* *)
- (* Die DTA wird auf einen internen Puffer gesetzt, sodass die Kommandozeile *)
- (* in der Basepage nicht dafuer benutzt wird. *)
- (* *)
- (* Environment-Variablen duerfen sowohl im ueblichen "UNIX" bzw. "PCDOS"- *)
- (* Format, als auch im "TOS"-Format (Nullbyte zwischen '=' und Variablenwert,*)
- (* auch in Gulaam, mit: 'set env_style bm' erreichbar) vorkommen, sie werden,*)
- (* falls noetig, auf das "UNIX"-Format korrigiert. *)
- (*---------------------------------------------------------------------------*)
- (* 12-Feb-93, Holger Kleinschmidt *)
- (*****************************************************************************)
-
- FROM pSTRING IMPORT
- (* TYPE *) StrPtr, StrArray, ArrayRange;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- #if GEMDOS
- CONST
- MWCStyle = TRUE;
- #endif
-
- VAR
- environ : StrArray;
-
- (* environ^[i] liefert einen Zeiger auf die i-te Environmentvariable.
- * Das Ende des Environments wird durch einen NULL-Zeiger (NICHT NIL!)
- * gekennzeichnet.
- *
- * ACHTUNG: Die Adressen zeigen direkt in die entsprechenden Strukturen und
- * duerfen nicht dazu verwendet werden, diese zu veraendern!
- * Ueberhaupt sollte stattdessen "getenv()" oder "GetEnvVar()"
- * benutzt werden.
- *
- * ACHTUNG2:Es ist NICHT garantiert, dass die einzelnen Environment-
- * Strings direkt hintereinander im Speicher abgelegt sind;
- * lediglich die Adressen der Strings stehen hintereinander im Feld.
- *)
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- PROCEDURE main ((* -- /AUS *) VAR argc : ArrayRange;
- (* -- /AUS *) VAR argv : StrArray );
-
- (*--------------------------------------------------------------------------
- | Nach dem Aufruf enthaelt <argc> die Anzahl der Programmargumente ein- |
- | schliesslich des Programmnamens; <argv>^[i] liefert einen Zeiger auf das |
- | i-te Argument (Programmname: 0-tes Argument). Um das Ende des Zeiger- |
- | feldes zu kennzeichnen, ist der Zeiger nach dem letzten gueltigen ein |
- | NULL-Zeiger (nicht: NIL); damit gilt: <argv>^[argc] = NULL. |
- | Fuer das Abspeichern der Zeigerfelder (einschliesslich des Feldes fuer |
- | die Environmentvariablen) wird bei Programmstart Speicher vom Betriebs- |
- | system angefordert; nur wenn kein Speicher mehr frei ist, liefert <argc> |
- | gleich Null, sonst ist <argc> mindestens = eins, wenn auch der Programm- |
- | name nicht immer einwandfrei festgestellt werden kann (dann ist |
- | <argv>^[0]^ = ""). |
- | |
- | Die Prozedur kann beliebig oft und an beliebiger Stelle aufgerufen werden|
- | da saemtliche Initialisierungen schon beim Programmstart vorgenommen |
- | werden. |
- | |
- | Achtung: Die Adressen zeigen direkt in die entsprechenden Strukturen und |
- | duerfen nicht dazu verwendet werden, diese zu veraendern! |
- --------------------------------------------------------------------------*)
-
- PROCEDURE getenv ((* EIN/ -- *) REF var : ARRAY OF CHAR ): StrPtr;
-
- (*--------------------------------------------------------------------------
- | Falls die Environmentvariable <var> existiert, wird als Funktionswert die|
- | Adresse des Wertes der Variablen nach dem '=' geliefert, ansonsten ein |
- | NULL-Pointer. |
- | |
- | Achtung: Die Adresse zeigt direkt ins Environment und darf nicht dazu |
- | benutzt werden, dieses zu veraendern! |
- --------------------------------------------------------------------------*)
-
-
-
- (*===========================================================================*)
- (* Die folgenden Prozeduren sind bequemer als "main()" und "getenv()", haben *)
- (* aber den Nachteil, dass die Ergebnisstrings <arg> und <val> in der Laenge *)
- (* durch den jeweiligen Parameter begrenzt sind. *)
- (*===========================================================================*)
-
-
- PROCEDURE ArgCount ( ): CARDINAL;
-
- PROCEDURE GetArg ((* EIN/ -- *) i : CARDINAL;
- (* -- /AUS *) VAR arg : ARRAY OF CHAR );
-
- PROCEDURE GetEnvVar ((* EIN/ -- *) REF var : ARRAY OF CHAR;
- (* -- /AUS *) VAR val : ARRAY OF CHAR ): BOOLEAN;
-
- END cmdline.
-