#!/bin/sh
# 64ビットLinuxにおいて dvipdfmxから呼ばれるgsがしばしばSegmentation faultで
# 死ぬので 代替手段を試せるようにするための仕掛け
# 使い方: このコマンドを/usr/local/binに altdistillとdvipdfmxという2つの名で置く


# このコマンドがdvipdfmxとして呼び出された場合
case "$0" in
dvipdfm|dvipdfmx|*/dvipdfm|*/dvipdfmx)
	# 本物のdvipdfmxをexecする その際にDオプションを指定し
	# altdistillが呼び出されるようにする
	exec /usr/bin/dvipdfmx -D 'altdistill -v%v "%i" "%o"' "$@";;
esac

# このコマンドがaltdistillとして呼び出された場合
# 呼び出され方: altdistill [-v level] inPS outPDF
LEVEL=1.3
while getopts v: OPTC; do
	case "$OPTC" in
	v)	LEVEL="$OPTARG";;
	*)	exit 1;;
	esac
done
shift `expr $OPTIND - 1`
[ $# -eq 2 ] || { echo "$0: arg count" >&2; exit 1; }

# Segmentation faultで死んだgsが一時ファイルを残さぬよう TEMPを指定しておく
TEMP=`mktemp -d /tmp/gsXXXXXX` || exit 1
trap 'ST=$?; trap 0; rm -rf $TEMP; exit $ST' 0 1 2 3 13 15
export TEMP

# dvipdfmxから呼ばれた際に最初に実行するコマンド
# 元のdvipdfmx.cfgのDの設定をここに書く(ディストリビューション毎に違うので注意)
# %v, %o, %iをそれぞれ$LEVEL, $2, $1に変更する
# 最後に&&exitを付加
gs -q -dNOPAUSE -dBATCH -sPAPERSIZE=a0 -sDEVICE=pdfwrite \
	-dCompatibilityLevel="$LEVEL" \
	-dAutoFilterGrayImages=false -dGrayImageFilter=/FlateEncode \
	-dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode \
	-sOutputFile="$2" "$1" -c quit && exit

# gsが死んだ場合代替手段を試す
for i in "$LEVEL" 1.2; do
	printf '%s' "(trying $i $1)" >&2
	ps2pdf -r1200 -sPAPERSIZE=a0 -dCompatibilityLevel="$i" "$1" "$2" &&exit
done

# 最終的に失敗
exit 1
