home *** CD-ROM | disk | FTP | other *** search
File List | 1989-04-04 | 3.3 KB | 88 lines |
- ' ----------------------------------------------------------------------------
- ' Beispielprogramm zum Test des Shellaufrufs für GFA Basic 3.0
- '
- DO
- PRINT "Beispielroutine zum Shellaufruf"
- INPUT "Gewünschtes Kommando oder ENDE für Programmstop: ",a$
- EXIT IF a$="ENDE" OR a$="Ende" OR a$="ende"
- RESERVE 2560 ! Minimalspeicher zurückbehalten, den Rest freigeben
- exit_status=@system_call(a$)
- RESERVE ! wieder allen Speicher holen
- PRINT "Systemaufruf mit ";exit_status;" beendet."
- LOOP
- END
- '
- '
- ' Die eigentliche Schnittstelle zur Shell für GFA-BASIC 3.0
- '
- FUNCTION system_call(shell_cmd$)
- ' Eingabe: Ein String mit dem auzuführenden Kommando
- ' Ausgabe: -999 fuer nicht ausgeführte Kommandos oder
- ' der Rückgabewert der aufgerufenen Shell
- '
- '
- LOCAL exit_code% ! Der Rückgabewert
- LOCAL shell_p% ! Adresse der Shell
- LOCAL shelltyp% ! Art der Shell: 0=Keine Shell
- ' 1=Unbekannte Shell
- ' 2=GULAM
- ' 3=MASTER
- '
- ' Zeiger auf die Shell aus der entsprechenden Systemvariablen holen
- shell_p%=LPEEK(&H4F6)
- '
- ' Zunächst die Art der eventuell vorhandenen Shell bestimmen
- IF shell_p%=0 THEN
- shelltyp%=0 ! Keine Shell vorhanden
- ELSE
- shelltyp%=1 ! Irgendeine Shell vorhanden
- IF LPEEK(shell_p%-10)=&H420135 THEN ! dann genauer unterscheiden:
- shelltyp=2 ! Die Shell GULAM
- ELSE
- IF LPEEK(shell_p%-4)=&HCDCEC5D2 OR LPEEK(shell_p%-8)=&H4D415354 THEN
- shelltyp=3 ! Die Shell MASTER
- ENDIF
- ENDIF
- ENDIF
- '
- ' Nur wenn GULAM oder MASTER vorhanden sind, diese aufrufen
- IF shelltyp>1 THEN
- IF shelltyp=2 AND shell_cmd$="-i" THEN ! Interaktive Shell
- shell_cmd$="" ! "" fÜr GULAM "-i" fÜr MASTER
- ENDIF
- shell_cmd$=shell_cmd$+CHR$(0) ! C-String endet mit Nullbyte
- exit_code%=C:shell_p%(L:VARPTR(shell_cmd$)) ! und aufrufen
- ELSE
- exit_code%=-999 ! Kommando NICHT ausgeführt
- ENDIF
- '
- '
- RETURN exit_code
- ENDFUNC
- '
- '
- ' Anmerkung #1: Die Änderungen für die alten Gfa Basic Versionen liegen
- ' nur am dort fehlenden FUNKTION ENDFUNC Befehlspaar. So
- ' kann dort dies z.B. mit PROCEDURE simuliert werden, wenn
- ' exit_code% GLOBAL zugänglich ist:
- '
- ' @system_call(a$)
- ' PRINT "Rückgabe des Shellaufrufs: "; exit_code%
- ' ...
- ' END
- '
- ' PROCEDURE system_call...
- ' ' LOCAL exit_code%
- ' ...
- ' RETURN
- '
- ' Anmerkung #2: Da sich Gfa Basic zunächst allen Speicher grabscht, muss
- ' mit dem RESERVE Befehl zuerst die für den Interpreter not-
- ' wendige Anzahl reserviert werden, sodass der Rest für die
- ' Shell und zu startende Programme nutzbar wird. Anschliessend
- ' muss jedoch dieser Platz mit einem weiteren RESERVE Befehl
- ' wieder zusammengefügt werden, da sonst der Gesamtspeicher
- ' sich immer mehr verkleinert.
- '
- ' ----------------------------------------------------------------------------
-