Home GEMDOSGEMDOS NetzwerkNetzwerk C'Task RoyalC'Task Royal

5.18 ARGV-Verfahren

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:

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:


Home GEMDOSGEMDOS NetzwerkNetzwerk C'Task RoyalC'Task Royal