' Routinen zum Auslesen des Environments und ARGV-bergabe
'
' von Gregi Duchalski, Baueracker 15a, 4690 Herne 1
' eMail an GREGOR DUCHALSKI @ DO im MausNet
'
' last change 30.06.92
' ------------------------------------------------------------------------------
' Jedes Programm bekommt bei seinem Start eine Kommandozeile und ein Environment
' bergeben. Mit den folgenden Routinen knnen Sie diese Daten auswerten.
'
' Beispiel fr die Kommandozeile: Sie legen das Programm WUTZ auf dem Desktop
' ab. Auf dieses Icon ziehen Sie nun die Datei 'NASE.DAT' und wollen damit er-
' reichen, da 'WUTZ' gestartet und dann die 'NASE.DAT'-Datei nachgeladen wird.
' WUTZ wrde in der Kommandozeile dann z.B. 'D:\NASE.DAT' finden und knnte dann
' diese Datei laden. Alles klar?
' Bei der bergabe der Kommandozeile haben sich 2 Methoden eingebrgert: Die
' normale, die max. 127 Zeichen lange Eintrge erlaubt, und die ARGV-bergabe,
' die eine nahezu beliebige Lnge haben darf.
' ACHTUNG: Eine sinnvolle Kommandozeile gibt es nur in compilierten Programmen!
'
' Beispiel fr das Environment: Das E. ist eine Liste von Variablen und ihren
' Werten. Ein E.-Eintrag sieht z.B. so aus: 'PATH=A:\". Das heit, zuerst kommt
' der Name der Variablen, dann ein Gleichheitszeichen und dann der Wert. Abge-
' schlossen wird ein Eintrag von einem Nullbyte.
' Um alle Eintrge im E. zu erhalten, knnen Sie z.B so vorgehen:
' env$=@env$                                    ! Kopiert das E. nach env$
' eintrag$=CHAR{v:env$}                         ! Liest den 1. Eintrag aus
' next_eintrag$=CHAR{v:env$+LEN(eintrag$)+1}    ! Liest den 2. Eintrag aus
' usw.
' Der Shareware-Desktop GEMINI macht brigens ausgiebig Gebrauch vom E.
'
' Nheres entnehmen Sie bitte entsprechender Fachliteratur!
' ------------------------------------------------------------------------------
'
' Die bergebene Kommandozeile wird zurckgegeben...
a$=@getcmd$
'
' Das ist sie...
PRINT a$
PRINT
'
' Nun geht's an die Auswertung...
a%=V:a$                 ! Adresse der Kommandozeile
DO
  b$=CHAR{a%}           ! Eintrag lesen
  '
  EXIT IF b$=""         ! ...Liste zu Ende
  '
  PRINT b$              ! Das ist der Eintrag
  '
  ' Hier kann jetzt was damit geschehen
  '
  ADD a%,SUCC(LEN(b$))  ! ...Zeiger auf nchsten Eintrag
  '
LOOP
'
> FUNCTION getcmd$
LOCAL a|,a&,a%,b%,a$,b$
'
' Liefert die dem Programm bergebene Kommandozeile zurck. Es wird die
' normale K. ausgewertet (max. 127 Bytes) oder die ARGV-bergabe ber das
' Environment. Unterschied: Bei der normalen bergabe sind die Eintrge durch
' Spaces getrennt, bei ARGV durh CHR$(0).
'
a|=BYTE{ADD(BASEPAGE,128)}       ! Lngenangabe...
'
IF a|=0                          ! Keine Kommandozeile...
  RETURN ""
ENDIF
' ----------------------------------------------------------------------
IF a|=127                        ! ARGV-Methode...
  a%=@getenv("ARGV")             ! 'ARGV' im Environment suchen
  '
  IF a%                          ! ARGV auswerten...
    '
    b%=a%                        ! ...Adresse merken
    b$=CHAR{a%}                  ! ...Wert von ARGV, uninteressant
    ADD a%,SUCC(LEN(b$))
    b$=CHAR{a%}                  ! ...Programmname, uninteressant?
    ADD a%,SUCC(LEN(b$))
    '
    DO
      '
      b$=CHAR{a%}                ! ...Variable auslesen
      ADD a%,SUCC(LEN(b$))       ! ...Zeiger erhhen
      '
      EXIT IF b$=""              ! ...NIL => Schlu
      '
      a$=a$+b$+CHR$(0)
      '
    LOOP
    '
    a$=a$+CHR$(0)                ! ...Endemarkierung
    BYTE{b%}=0                   ! ...ARGV 'entfernen'
    '
  ENDIF
  '
  RETURN a$
  '
ENDIF
' ----------------------------------------------------------------------
a$=CHAR{ADD(BASEPAGE,129)}       ! Normale Kommandozeile...
'
a&=INSTR(a$," ")
'
WHILE a&                         ! ...alle Spaces durch CHR$(0) ersetzen
  MID$(a$,a&,1)=CHR$(0)          ! ...(ntig, um normale und ARGV-bergabe
  a&=INSTR(a$," ",SUCC(a&))      ! ...auf die gleiche Art auswerten zu knnen)
WEND
'
a$=a$+CHR$(0)+CHR$(0)            ! ...Endemarkierung
'
RETURN a$
ENDFUNC
> FUNCTION getenv(a$)
LOCAL a!,l&,a%,b$
'
' Sucht die Variable a$ im Environment
' Rckgabe: Variablenadresse oder 0
'
l&=LEN(a$)
a%={ADD(BASEPAGE,44)}           ! Environment-Beginn
'
REPEAT                          ! Env. durchsuchen...
'
ADD a%,SUCC(LEN(b$))          ! ...Zeiger erhhen
b$=CHAR{a%}                   ! ...Variable auslesen
'
a!=LEFT$(b$,l&)=a$            ! ...Ist es die gesuchte?
'
UNTIL b$="" OR a!               ! ...bis zu Ende oder gefunden
'
IF a!                           ! Gefunden...
RETURN a%
ENDIF
'
RETURN 0                        ! Nicht vorhanden
ENDFUNC
'
' Diese Routine wird hier nicht bentigt, kann aber sinnvoll sein:
> FUNCTION env$
LOCAL l&,a%,b%,env$
'
' Kopiert das gesamte Environment in einen String
' Rckgabe: Environment inkl. 00 am Ende
'
a%={ADD(BASEPAGE,44)}            ! Environment-Beginn...
b%=a%                            ! ...merken
'
REPEAT
INC a%
UNTIL WORD{a%}=0                 ! ...bis Ende (00) erreicht
'
l&=ADD(SUB(a%,b%),2)
env$=SPACE$(l&)
'
BMOVE b%,V:env$,l&               ! Environment kopieren
'
RETURN env$                      ! Und zurckgeben
ENDFUNC
