Simple_opts für Trios-Kommandozeilenprogramme

Fragen zu Programmiersprachen und Software für den Hive und die Propellerchips
Antworten
U-Held
Beiträge: 69
Registriert: Mi 14. Dez 2011, 22:05

Simple_opts für Trios-Kommandozeilenprogramme

Beitrag von U-Held »

Für den Eigenbedarf ist eine Bibliothek zum Parsen der Kommandozeile im Trios entstanden. Ich habe Perls Getopt::Std teilweise nachprogrammiert. Die Bibliothek verwendet reg-ios.paranext.

Die Kommandozeile besteht aus 3 Bereichen:

1. der Programmname - den bekommt paranext nie zu sehen

2. die Optionen
  • beginnen UNIX-typisch mit "-"
  • Reihenfolge ist nicht vorgegeben
  • weiteres siehe unten
3. die Parameter
  • Reihenfolge und Bedeutung werden vom Programm vorgegeben
  • sollten sparsam verwendet werden, z.B. für "den" Dateinamen, den das Programm immer braucht
Jede Option darf nur einmal angegeben werden. Es gibt 2 Sorten von Optionen:
  • boolesche Optionen: werden angegeben oder weggelassen, liefern 1 bzw. 0
  • Zeichenkettenoptionrn: erwarten mit Leerzeichen getrennt eine Zeichenkette, die nicht mit "-" beginnt
Die Sonderoption -- beendet das Parsen der Optionen explizit. Normalerweise wird die Grenze zwischen Optionen und Parametern aber erraten: Parameter beginnen, wenn nach einer booleschen Option oder nach dem Wert einer Zeichenkettenoption mit Leerzeichen getrennt kein "-" folgt.

Die Bibliothek simple_opts bietet für den Betrieb 3 Funktionen an:
  • get_opts(opt_str): parst die Kommandozeile nach Vorgabe des opt_str. Der opt_str enthält alle zulässigen Optionen (je 1 Zeichen). Zeichenkettenoptionen wird ein ":" nachgestellt.
  • opt(option): liefert den von Kommandozeile gelesenen Wert der Option. Das ist entweder die Hub-Adresse der Zeichenkette oder bei booleschen Optionen 1 für eine angegebene Option und sonst 0.
  • paranext(para_addr): ruft im Prinzip reg-ios.paranext auf, behandelt aber den Sonderfall, dass der nächste Parameter von get_opts schon gelesen wurde.
Wenn eine Fehlersituation vorliegt, steigen get_opts und opt mit ABORT und negativem Fehlercode aus. Man muss die Fehlercodes also an geeigneter Stelle auffangen und wenigstens noch reg-ios.stop aufrufen.

Weiterhin enthält simple_opts englische Texte zu den Fehlercodes und die Funktion last_errmsg, die den Text (Adresse im Hub-RAM) zum geworfenen Fehler liefert.

get_opts darf man max. 32 verschiedene Optionen übergeben, festgelegt in MAX_OPTS. Wenn im eigenen Programm der Speicher knapp wird, kann man:
  • MAX_OPTS auf die Anzahl Optionen reduzieren, die mit get_opts übergeben wird und
  • die Fehlertexte und zugehörigen Funktionen auskommentieren.
Das bringt aber insgesamt nur wenige longs.

Im Trios gelten 2 Einschränkungen:
  • 1. Eine Kommandozeile darf außer dem Programmnamen selbst noch 63 Zeichen + abschließendes 0-Byte lang sein. Längere Kommandozeilen führen zu Fehlern oder zum Absturz, denn schon reg-ios.paraset begrenzt die Länge nicht.
  • 2. Es gibt keine Möglichkeit, Leerzeichen in einem Parameter zu übergeben. So etwas wie ein Escape-Zeichen ("\") oder Anführungszeichen kennt reg-ios.paranext nicht. Dort müsste es aber eingebaut werden.
Das Testprogramm test_opt.spin versucht einen White-Box-Test. Was dort getestet wird, scheint zu funktionieren. Der erste praktische Einsatz von simple_opts steht aber noch aus.

Grüße vom U-Held
Dateianhänge
simple_opts.zip
Bibliothek und Testprogramm
(6.16 KiB) 870-mal heruntergeladen
Antworten