home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / program / m2posx02 / cmdline.dpp next >
Encoding:
Modula Definition  |  1993-10-23  |  7.3 KB  |  127 lines

  1. DEFINITION MODULE cmdline;
  2.  
  3. (*****************************************************************************)
  4. (* "GEMDOS":                                                                 *)
  5. (* Durch dieses Modul soll zur Kommandozeile und zum Environment eine aehn-  *)
  6. (* liche Schnittstelle bereitgestellt werden, wie sie fuer C-Programme exi-  *)
  7. (* stiert.                                                                   *)
  8. (* Das Modul sollte als allererstes im Hauptmodul importiert werden, und es  *)
  9. (* sollte kein anderes (System)modul, das sich mit Kommandozeile oder Envi-  *)
  10. (* ronment beschaeftigt, importiert werden (auch auf versteckte Importe aus  *)
  11. (* tieferliegenden Modulen achten). Es kann trotzdem nicht garantiert werden,*)
  12. (* dass dieses Modul mit allen M2-Systemen arbeitet.                         *)
  13. (*                                                                           *)
  14. (* Es wird auf drei Arten nach Argumenten der Kommandozeile gesucht, wobei   *)
  15. (* die angegebene Reihenfolge eingehalten wird; nur wenn nach einem Verfahren*)
  16. (* keine Argumente uebergeben wurden, wird nach der naechsten Moeglichkeit   *)
  17. (* der Argumentuebergabe gesucht:                                            *)
  18. (*                                                                           *)
  19. (* 1) ARGV im Environment (Atari-Standard) bzw. MWC                          *)
  20. (* 2) Programmname ueber AES.shell_read, falls die Kommandoparameter mit     *)
  21. (*    denen aus der Basepage uebereinstimmen (auch fuer TOS-Programme).      *)
  22. (*    (Diese Funktion existiert nur, wenn beim Praeprozessieren des Imple-   *)
  23. (*     mentationsmoduls das entsprechende Makro definiert war.)              *)
  24. (* 3) Kommandozeile in der BasePage (Atari-Standard)                         *)
  25. (*                                                                           *)
  26. (*                                                                           *)
  27. (* Ist 'MWCStyle' = TRUE, wird das Laengenbyte der Kommandozeile, das mit    *)
  28. (* dem normalerweise ungueltigen Wert von 127 anzeigt, dass per ARGV Argumen-*)
  29. (* te uebergeben werden, ignoriert. Hierdurch koennen auch aeltere Programme,*)
  30. (* wie z.B. die Shell 'Gulaam' (mit: 'set env_style mw'), die das sehr aehn- *)
  31. (* liche Mark Williams-Verfahren fuer erweiterte Kommandozeile benutzen,     *)
  32. (* Argumente uebergeben.                                                     *)
  33. (*                                                                           *)
  34. (* Die DTA wird auf einen internen Puffer gesetzt, sodass die Kommandozeile  *)
  35. (* in der Basepage nicht dafuer benutzt wird.                                *)
  36. (*                                                                           *)
  37. (* Environment-Variablen duerfen sowohl im ueblichen "UNIX" bzw. "PCDOS"-    *)
  38. (* Format, als auch im "TOS"-Format (Nullbyte zwischen '=' und Variablenwert,*)
  39. (* auch in Gulaam, mit: 'set env_style bm' erreichbar) vorkommen, sie werden,*)
  40. (* falls noetig, auf das "UNIX"-Format korrigiert.                           *)
  41. (*---------------------------------------------------------------------------*)
  42. (* 12-Feb-93, Holger Kleinschmidt                                            *)
  43. (*****************************************************************************)
  44.  
  45. FROM pSTRING IMPORT
  46. (* TYPE *) StrPtr, StrArray, ArrayRange;
  47.  
  48. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  49.  
  50. #if GEMDOS
  51. CONST
  52.   MWCStyle = TRUE;
  53. #endif
  54.  
  55. VAR
  56.   environ : StrArray;
  57.  
  58. (* environ^[i] liefert einen Zeiger auf die i-te Environmentvariable.
  59.  * Das Ende des Environments wird durch einen NULL-Zeiger (NICHT NIL!)
  60.  * gekennzeichnet.
  61.  *
  62.  * ACHTUNG: Die Adressen zeigen direkt in die entsprechenden Strukturen und
  63.  *          duerfen nicht dazu verwendet werden, diese zu veraendern!
  64.  *          Ueberhaupt sollte stattdessen "getenv()" oder "GetEnvVar()"
  65.  *          benutzt werden.
  66.  *
  67.  * ACHTUNG2:Es ist NICHT garantiert, dass die einzelnen Environment-
  68.  *          Strings direkt hintereinander im Speicher abgelegt sind;
  69.  *          lediglich die Adressen der Strings stehen hintereinander im Feld.
  70.  *)
  71.  
  72. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  73.  
  74.  PROCEDURE main ((* -- /AUS *) VAR argc : ArrayRange;
  75.                  (* -- /AUS *) VAR argv : StrArray   );
  76.  
  77. (*--------------------------------------------------------------------------
  78.  | Nach dem Aufruf enthaelt <argc> die Anzahl der Programmargumente ein-    |
  79.  | schliesslich des Programmnamens; <argv>^[i] liefert einen Zeiger auf das |
  80.  | i-te Argument (Programmname: 0-tes Argument). Um das Ende des Zeiger-    |
  81.  | feldes zu kennzeichnen, ist der Zeiger nach dem letzten gueltigen ein    |
  82.  | NULL-Zeiger (nicht: NIL); damit gilt: <argv>^[argc] = NULL.              |
  83.  | Fuer das Abspeichern der Zeigerfelder (einschliesslich des Feldes fuer   |
  84.  | die Environmentvariablen) wird bei Programmstart Speicher vom Betriebs-  |
  85.  | system angefordert; nur wenn kein Speicher mehr frei ist, liefert <argc> |
  86.  | gleich Null, sonst ist <argc> mindestens = eins, wenn auch der Programm- |
  87.  | name nicht immer einwandfrei festgestellt werden kann (dann ist          |
  88.  | <argv>^[0]^ = "").                                                       |
  89.  |                                                                          |
  90.  | Die Prozedur kann beliebig oft und an beliebiger Stelle aufgerufen werden|
  91.  | da saemtliche Initialisierungen schon beim Programmstart vorgenommen     |
  92.  | werden.                                                                  |
  93.  |                                                                          |
  94.  | Achtung: Die Adressen zeigen direkt in die entsprechenden Strukturen und |
  95.  |          duerfen nicht dazu verwendet werden, diese zu veraendern!       |
  96.   --------------------------------------------------------------------------*)
  97.  
  98.  PROCEDURE getenv ((* EIN/ -- *) REF var : ARRAY OF CHAR ): StrPtr;
  99.  
  100. (*--------------------------------------------------------------------------
  101.  | Falls die Environmentvariable <var> existiert, wird als Funktionswert die|
  102.  | Adresse des Wertes der Variablen nach dem '=' geliefert, ansonsten ein   |
  103.  | NULL-Pointer.                                                            |
  104.  |                                                                          |
  105.  | Achtung: Die Adresse zeigt direkt ins Environment und darf nicht dazu    |
  106.  |          benutzt werden, dieses zu veraendern!                           |
  107.   --------------------------------------------------------------------------*)
  108.  
  109.  
  110.  
  111. (*===========================================================================*)
  112. (* Die folgenden Prozeduren sind bequemer als "main()" und "getenv()", haben *)
  113. (* aber den Nachteil, dass die Ergebnisstrings <arg> und <val> in der Laenge *)
  114. (* durch den jeweiligen Parameter begrenzt sind.                             *)
  115. (*===========================================================================*)
  116.  
  117.  
  118.  PROCEDURE ArgCount ( ): CARDINAL;
  119.  
  120.  PROCEDURE GetArg ((* EIN/ -- *)     i   : CARDINAL;
  121.                    (* -- /AUS *) VAR arg : ARRAY OF CHAR );
  122.  
  123.  PROCEDURE GetEnvVar ((* EIN/ -- *) REF var : ARRAY OF CHAR;
  124.                       (* -- /AUS *) VAR val : ARRAY OF CHAR ): BOOLEAN;
  125.  
  126. END cmdline.
  127.