a2ps-j が動かない

事例としては NetBSD の pkgsrc なんだけど、他の環境でも発生するかもしれない。しらないけど。

a2ps-j のバージョンは 1.45 (pkgsrc としてのバージョンは ja-a2ps-1.45nb4)、perl-5.20.0 (perl-5.20.0nb2) の組み合わせ。2014/12/18 に chechout した pkgsrc で作成している。

症状は、日本語を含むテキストを読ませると、日本語を読んだところで終了する。異常終了ではなく、そこでテキストがなくなったかのような終わり方。

終了している箇所を探すと、a2ps-j の内部で日本語文字コードの変換してるところで発生していた。処理の仕組みがよくわからないので直せない、ってかこれ Perl4 時代のコードじゃね?

対処方法としてはオプション -nc をつける。オプション -nc を指定すると内部変換をしないようにできるので、このバグを回避できる。ただし、受け付ける日本語が ISO2022-JP 限定になってしまうので、iconv か何かを使って事前に変換してやる必要がある。

$ iconv -f utf-8 -t iso-20220-jp hoge.txt | nkf -nc -p > hoge.ps

とかなんとか。

これだとファイル名とかヘッダにつかないのでシェルスクリプト書いて処理させてる。

#! /bin/sh

LANG=

while [ "$#" -gt 0 ]
do
    s=$1
    for i in .c .h .f90 .sh .pl .json; do
        d=${s%$i}.ps
        if [ $d != $s.ps ]; then break; fi
    done
    t=`stat -f "%Sm" -t "%F %T %z" $s`
    iconv -f utf-8 -t iso-2022-jp $s |
    a2ps-j -nc -p -l "$s" -L "$t" -f8 > $d
    shift
done