asaはキャリッジ制御文字を解釈する。
asaは引数に指定したファイルを標準出力に出力する。その時、キャリッジ制御文字を実装依存のラインプリンター制御シークエンスに変換する。
これだけなら、まだ改行文字を出力する環境に合わせて適切に変換するツールだと言える。しかし、asaはこれだけではなく、もっと奇妙な処理もする。続きを読んでいこう。
入力の各行の最初の文字が除去され、その文字に応じて以下の処理を行う。
- 空白文字の場合、行の残りが変更なく出力される
- 0の場合、改行が出力され、行の残りが出力される
- 1、あるいはそれ以上の実装依存の文字の場合、次ページが出力され、行の残りが出力される
- +の場合、前行の改行文字は印刷を1文字目に戻す実装依存の文字に置き換わり、行の残りが出力される。もし+が入力最初の文字であった場合は空白と同じ。
例えば以下のような入力ファイルがあった場合
abc
0def
+---
出力される結果は以下のようになる。
abc
def
ただしdefはdefのようになっているだろう。キャリッジが1文字目に戻って上書きされるためだ。
なぜこのような奇妙な挙動をするのかというと、asaはFORTRAN 77で書かれたプログラムの出力を印刷するのに使われていたのだ。例えば以下のように、
$ a.out | asa | lp
a.outはFORTRAN77で書かれたソフトウェアで、その出力をasaで適切に加工して、プリンターに出力する。
FORTRAN77以外では使われることはなく、今のOSにはまず存在しない。
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/asa.html