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