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).
Pexec lö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.