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.