•  Back 
  •  GEMDOS 
  •  Index 
  •  Tree View 
  •  Cross references 
  •  Help page 
  •  Show info about hypertext 
  •  View a new file 
Topic       : TOS - das Betriebssystem
Author      : 
Version     : tos.hyp (5. März 2013)
Subject     : Programmieren/Atari
Nodes       : 3001
Index Size  : 93602
HCP-Version : 5
Compiled on : Atari
@charset    : atarist
@lang       : 
@default    : Titel
@help       : 
@options    : +g -i -s +x +zz -t4
@width      : 70
View Ref-File5.17  ARGV-Verfahren                                               TOS

Das ARGV-Verfahren dient zur Übergabe erweiterter Kommandozeilen, und 
wurde im Herbst 1989 von Ken Badertscher (Atari-USA) offiziell 
spezifiziert. Das Verfahren arbeitet wie folgt:

Die Environmentvariable ARGV zeigt an, daß dieses Verfahren angewendet 
wird; der Wert der Variablen spielt dabei keine Rolle, allein die 
Anwesenheit ist entscheidend. Die ARGV-Variable muss die letzte 
Environmentvariable sein, damit das aufgerufene Programm den 
"vorderen" Teil als sein normales Environment weiterbenutzen kann.

Die erweiterte Kommandozeile wird nun einfach als Folge von Strings 
(Null-Terminiert !) hinter ARGV in das Environment geschrieben. Der 
erste String enthält dabei den Namen des gestarteten Programms, wie 
man ihn auch bei Pexec übergibt (und entspricht dem bislang nicht 
genutzten argv[0]). Die weiteren Strings enthalten die einzelnen 
Parameter, in denen auch Leerzeichen auftauchen dürfen; das Ende der 
Liste wird wie bei einem normalen Environment durch eine doppelte 0 
gekennzeichnet.

Darüber hinaus übergibt man bei Pexec als Längenbyte (erstes Byte in 
der Kommandozeile) den Wert 127, der wegen der existierenden 
Längenbeschränkung auf 125 Bytes bislang nicht angenommen werden 
konnte. Dies ermöglicht es dem aufgerufenen Programm, sicherzustellen, 
daß die im Environment übergebenen Werte tatsächlich gültig sind und 
nicht etwa von einem Programm, das den ARGV-Standard nicht kennt, 
übriggelassen wurden.

Je nachdem, ob man per ARGV Parameter an andere Programme übergeben, 
oder diese selbst lesen möchte, behandelt man einen der folgenden zwei 
Punkte:

∙ ARGV beim gestarteten Programm

Zunächst stellt man fest, ob die Variable ARGV im Environment 
vorhanden ist. Wenn dies der Fall ist, und das Kommandozeilen- 
Längenbyte den Wert 127 besitzt, dann findet man nach der ersten 0 
nach ARGV (denn diese Variable könnte ja einen Wert haben), die 
einzelnen Kommandozeilenparameter. Zum Schluß sollte man den ersten 
Buchstaben von ARGV auf 0 den Wert 0 setzen, damit das Environment 
wieder die Standardform besitzt.

∙ ARGV beim Aufrufer

Zunächst muß ein neues Environment für das aufzurufende Programm 
erzeugt werden. Dazu berechnet man z.B. die Länge des bereits 
vorhandenen Environments, addiert die Länge der Kommandozeile und 
alloziert entsprechend viele Bytes. Dann wird das bestehende 
Environment kopiert (und dabei eine evtl. bereits bestehende ARGV- 
Variable entfernt), die neue ARGV-Variable und die 
Kommandozeilenparameter nacheinander angehängt (jeweils null- 
terminiert). Eine letzte Null schließt das Environment dann endgültig 
ab. Zu guter letzt übergibt man im Längenbyte der Kommandozeile den 
magischen Wert 127.

∙ Erweiterung des ARGV-Verfahrens

Ein Problem mit der ursprünglichen Definition des ARGV-Verfahrens 
besteht darin, leere Parameter übergeben zu können (zwei 
aufeinanderfolgende Nullen schließen ja das Environment ab !). Um 
diese dennoch übergeben zu können, wurde das Verfahren wie folgt 
erweitert:

   ∙ leere Parameter werden in der Kommandozeile in einfache 
     Anführungsstriche gesetzt, und tauchen im Environment als genau 
     ein Leerzeichen auf.

   ∙ für die Variable ARGV wird ein Wert definiert: falls diese mit 
     'NULL:' beginnt, enthält der Rest der Zeile (durch Kommata 
     getrennt) die Positionen der leeren Parameter. Beispiel: 
     ARGV=NULL:3,5,9 bedeutet, daß argv[3], argv[5] und argv[9] leer 
     sind. Der Startup-Code sollte sich dann darum kümmern, die 
     entsprechenden Parameter zu löschen.

Hinweis: Um maximale Kompatibilität zu alten Programmen zu 
gewährleisten, sollte das erweiterte ARGV-Verfahren nur dann 
eingesetzt werden, wenn tatsächlich leere Parameter übergeben werden 
müssen. In allen anderen Fällen sollte man stattdessen auf die 
ursprüngliche Definiton zurückgreifen.

∙ ARGV-Verfahren ab MagiC 3.0

Ab MagiC-3 wird das ARGV-Verfahren bereits von Pexec auf drei 
verschiedene Arten unterstützt:

Ist das Längenbyte der Kommandozeile 127, geht Pexec davon aus, 
     daß das aufrufende Programm ARGV unterstützt und das Environment 
     bereits entsprechend manipuliert ist; das Environment wird daher 
     nicht geändert.

Ist das Längenbyte 254, erwartet MagiC direkt dahinter die 
     Zeichenkette "ARGV=", gefolgt von einem Nullbyte und von einer 
     durch zwei Nullbytes abgeschlossenen Liste von Parametern. Durch 
     Übergaben von "ARGV=NULL..." usw. kann man auch das erweiterte 
     ARGV-Verfahren verwenden, das die Übergabe von leeren Parametern 
     ermöglicht (s.o).

     Pexeclöscht ein evntl. vorhandenes ARGV und trägt das neue ins 
     Environment ein. Die Kommandozeile besteht nur aus dem Wert 127 
     als Indikator, daß die Parameter im Environment liegen. Das 
     Verfahren ist geeignet, wenn das aufgerufene Programm mit 
     Sicherheit das ARGV-Verfahren beherrscht.

Ist das Längenbyte 255, erwartet MagiC direkt dahinter eine durch 
     Leerstellen getrennte und durch ein Nullbyte abgeschlossene Liste 
     von Parametern (wie i.a. die Kommandozeile übergeben wird). Pexec 
     löscht ein evntl. vorhandenes ARGV, erstellt aus der 
     Kommandozeile eine Argumentliste und trägt diese als ARGV ins 
     Environment ein. Als argv[0] wird der Programmdatei-Pfad 
     genommen, der Pexec übergeben wurde. Ist dieser Pfad ungültig, 
     gibt es Müll, deshalb sollte man auch bei Modus 5 von Pexec 
     (Basepage erstellen) einen sinnvollen Programmnamen übergeben. 
     Bei Modus 7 heißt argv[0] dann einfach "NONAME", weil hier kein 
     Name übergeben wird.

     Die Kommandozeile hat als Längenbyte 127 als Indikator für das 
     Vorhandensein von ARGV. Ist die Länge der Kommandozeile < 127, 
     wird diese außerdem in die Basepage kopiert, ansonsten besteht 
     die Kommandozeile nur aus dem Wert 127. Das Verfahren ist 
     geeignet, wenn das aufrufende Programm nicht sicher ist, daß das 
     aufgerufene Programm ARGV versteht.