AllgemeinWissensilver and black car wheel

Beim Arbeiten in der Shell passiert es gelegentlich, dass man sich bei der Eingabe des Befehls vertippt. Um bei typischen Fehlern für ein wenig Unterhaltung zu sorgen, existieren Programme wie sl oder gti, welche eine Dampflok bzw. einen Golf GTI als ASCII-Art über das Terminal fahren. Leider hat gti bislang nicht unter z/OS funktioniert. Im Folgenden geht es darum wie ich diesen Mangel beseitigt habe.

Betrachten wir zuerst den Ausgangszustand: Das Kompilieren mittels Makefile schlägt aufgrund nicht existierender Compileroptionen fehl, der direkte Aufruf von cc ist hingegen erfolgreich. Es ist zusätzlich notwendig, den Encoding-tag des Quellcodes und die STEPLIB Umgebungsvariable richtig zu setzen.

export STEPLIB="CBC.SCCNCMP"
chtag -t -c ISO8859-1 gti.c
cc -o gti gti.c


Beim Ausführen mit ./gti ist die Ausgabe jedoch fehlerhaft, da die Positionierung des Cursors mittels ANSI-Escapesequenzen scheitert.

Die Ursache hierfür ist der zwichen EBCDIC (verwendet unter z/OS) und UTF-8 (auf anderen Plattformen) unterschiedliche Wert des Escapezeichens. Die Lösung ist also, abhängig von der Plattform das richtige Byte zu schreiben. Das ist durch Prüfen auf die Existenz des __MVS__ Makros möglich:

# ifndef __MVS__
fprintf(TERM_FH, "\033[%dC", x);
# else
fprintf(TERM_FH, "\047[%dC", x);
# endif


Diese Veränderung wurde an zwei Stellen eingebaut und im upstream repository gemerged. Somit funktioniert gti jetzt auch unter z/OS korrekt.

Anbei der Link zu gti auf Github.com: https://github.com/rwos/gti