#!/bin/sh
# This is a shell archive (produced by GNU sharutils 4.2).
# To extract the files from this archive, save it to some FILE, remove
# everything before the `!/bin/sh' line above, then type `sh FILE'.
#
# Made on 1998-11-16 19:21 GMT+0900 by <kono@rananim.ie.u-ryukyu.ac.jp>.
# Source directory was `/private/tmp/nkf17/nkf17'.
#
# Existing files will *not* be overwritten unless `-c' is specified.
#
# This shar contains:
# length mode       name
# ------ ---------- ------------------------------------------
#  15066 -rw-r--r-- nkf.doc
#    143 -rw-r--r-- MANIFEST
#    434 -rw-r--r-- Makefile
#   3333 -rw-r--r-- nkf.1
#   8015 -rw-r--r-- nkf.1j
#  56296 -rw-r--r-- nkf.c
#  12697 -rw-r--r-- nkf_test.pl
#    115 -rw-r--r-- NKF/Changes
#     51 -rw-r--r-- NKF/MANIFEST
#    367 -rw-r--r-- NKF/Makefile.PL
#   1957 -rw-r--r-- NKF/NKF.pm
#   1689 -rw-r--r-- NKF/NKF.xs
#    423 -rw-r--r-- NKF/README
#  12693 -rw-r--r-- NKF/test.pl
#
save_IFS="${IFS}"
IFS="${IFS}:"
gettext_dir=FAILED
locale_dir=FAILED
first_param="$1"
for dir in $PATH
do
  if test "$gettext_dir" = FAILED && test -f $dir/gettext \
     && ($dir/gettext --version >/dev/null 2>&1)
  then
    set `$dir/gettext --version 2>&1`
    if test "$3" = GNU
    then
      gettext_dir=$dir
    fi
  fi
  if test "$locale_dir" = FAILED && test -f $dir/shar \
     && ($dir/shar --print-text-domain-dir >/dev/null 2>&1)
  then
    locale_dir=`$dir/shar --print-text-domain-dir`
  fi
done
IFS="$save_IFS"
if test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED
then
  echo=echo
else
  TEXTDOMAINDIR=$locale_dir
  export TEXTDOMAINDIR
  TEXTDOMAIN=sharutils
  export TEXTDOMAIN
  echo="$gettext_dir/gettext -s"
fi
touch -am 1231235999 $$.touch >/dev/null 2>&1
if test ! -f 1231235999 && test -f $$.touch; then
  shar_touch=touch
else
  shar_touch=:
  echo
  $echo 'WARNING: not restoring timestamps.  Consider getting and'
  $echo "installing GNU \`touch', distributed in GNU File Utilities..."
  echo
fi
rm -f 1231235999 $$.touch
#
if mkdir _sh18783; then
  $echo 'x -' 'creating lock directory'
else
  $echo 'failed to create lock directory'
  exit 1
fi
# ============= nkf.doc ==============
if test -f 'nkf.doc' && test "$first_param" != -c; then
  $echo 'x -' SKIPPING 'nkf.doc' '(file already exists)'
else
  $echo 'x -' extracting 'nkf.doc' '(text)'
  sed 's/^X//' << 'SHAR_EOF' > 'nkf.doc' &&
NAME
X        nkf - ネットワーク用漢字コード変換フィルタ v1.7
X
SYNOPSIS
X	nkf [options] [in_file]                   ...Unix版
X	nkf [options] [in_file] [out_file for -O] ...DOS版
X	wnkf [options] [in_file] [outfile for -O] ...Windows16bit(3.x)版
X	nkf32 [options] [in_file] [outfile for -O]...Windows32bit(95/NT)版
X	nkf2 [options] [in_file] [outfile for -O] ...OS/2版
X
X	（名称は、同じPath上にあっても区別できるように変更している。）
X
DESCRIPTION
X
nkfはネットワークでメールやニュースの読み書きをするために作られた、漢
X字コードの変換フィルタである。
X
Xこのnkfの特徴としては、入力漢字コード系の統計的な自動認識機能がある。
Xこのため、利用者は、入力漢字コード系が何であるかを知らなくても、出力漢字
Xコード系のみ指定すれば良いことになる。ただ、この判定機構は、理論的には完
X全ではないが、通常のニュースやメールのメッセージについては確実に動作する
X安全なものにはなっている。
X
X現在、nkfが認識できる入力の漢字コード系は、いわゆる「JISコード」(ISO-
2022-JPに基づくもの)、MS漢字コード(シフトJIS)、日本語EUC(AT&Tコード)のい
Xずれかである。出力する漢字コード系も、この3種類である。
X
X入力は、ファイルを指定しなければ、標準入力となる。出力は標準出力である。
X
X指定できるオプションは、以下の通り。-mu のように続けることができる。
X
X        -b      バッファリング出力を行う。(デフォルト)
X        -u      出力時に、バッファリングしない。
X                rsh localhost | nkf -u というように使う。
X
X        -t      何もしない。
X
X        -j      JISコードを出力する。(デフォルト)
X
X        -e      EUCコードを出力する。
X
X        -s      シフトJISコードを出力する。
X
X        -i?     JIS漢字を指示するシーケンスとして ESC-'$'-?を使用する。
X                (デフォルトは、ESC-'$'-'B')
X
X        -o?     1バイト英数文字セットを指示するシーケンスとして、ESC-
X                '('-?を使用する。(デフォルトは、ESC-'('-'B')
X
X        -r      ROT13/47の変換をする。
X
X        -v      バージョンを表示する。
X
X        -T      テキストモードで出力する。(MS-DOS上でのみ効力を持つ)
X
X        -m      MIME を解読する。(defalut on)
X		ISO-2022-JP(base64)とISO-8859-1(Q encode)
X                のみを解読する。ISO-8859-1 (Latin-1) を解読する時は、
X                -lフラグも必要である。
X                -mB   MIME base64 stream を解読する。ヘッダなどは取り除くこと。
X                -mQ   MIME quoted stream を解読する。
X                -m0   MIME を解読しない。
X
X        -l      0x80-0xfeのコードをISO-8859-1 (Latin-1)として扱う。
X                JISコードアウトプットとの組合せみのみ有効。
X                -s, -e, -xとは両立しない。
X
X        -f?    一行?文字になるように簡単な整形をおこなう。デフォルトは
X                60文字である。
X
X        -Z      X0208中の英数字と若干の記号をASCIIに変換する。
X                -Z1 はX0208間隔をASCII spaceに変換する。
X                -Z2 はX0208間隔をASCII space 二つに変換する。
X
X
X        -J -E -S -X -B
X                期待される入力コードの性質を指定する。
X                -J     ISO-2022-JPを仮定する。
X                -E     日本語EUC(AT&T)を仮定する。
X                -S     MS漢字を仮定する。X0201仮名も仮定される。
X                -X     MS漢字中にX0201仮名があると仮定する。
X                -B     壊れた(Broken)JISコード。ESCがなくなったと仮定する。
X                    -B1  ESC-(, ESC-$ のあとのコードを問わない
X                    -B2  改行のあとに強制的にASCIIに戻す
X
X        -x      通常おこなわれるX0201仮名->X0208の仮名変換をしないで、
X                X0201仮名を保存する。入力は、MS-Kanjiの1byte仮名、SO/SI、
X                ESC-(-I, SSOを受け付ける。出力は、日本語EUC中ではSSO、
X                JISでは ESC-'('-I を使う。
X
X	-O	ファイル out_file に出力が保存されます。ファイル名が指定され
X		ていない場合は、'nkf.out'又は'wnkf.out'に出力する。
X
X	-c	行末にCRコード(0D)を追加(拡張機能 -T と併用不可)
X	
X	-d	行末からCRコード(0D)を削除(拡張機能 -T と併用不可)
X
X
AUTHOR
X
X市川  至        ichikawa@flab.fujitsu.co.jp     (was ichikawa@fujitsu.JUNET)
X
ACKNOWLEDGE
X
X    morb@fujitsu, kiss@ayumi.stars.flab.fujitsu, cen122@flab.fujitsu,
X    yuki@flab.fujitsu 他、fujitsu & flab.fujitsuの皆さんの協力に感謝。
X    shinoda@cs.titech, kato@cs.titech, uematsu@cs.titech  TNX
X    kono@ie.u-ryukyu.ac.jp, GHG00637@niftyserve.or.jp
X
BUGS
X
X実は、入力のコード系の判定は、EUCとシフトJISとの自動判定であり、最初に
X特定できる文字が来た時点で確定してしまう。そして、特定不能の間は保留バッ
Xファにためておかれ、確定後に処理される。このため、
X
X        1)7ビットJISは常に認識される。シフトJIS、EUC混合もほとんどの
X          場合は問題がない。ただし、
X
X        2)シフトJISのX0201仮名とEUCが識別できない。したがって、
X          デフォルトではシフトJISのX0201仮名はないと仮定している。
X
X        3)ちょっと、のろい。(初期の版よりは改良されている)
X
JIS漢字の新旧版の区別とか、ASCIIとJISローマ字の区別などについては保存さ
Xれない。
X
Xこのフィルタの変換は、コード系に対応した一括写像を施すだけなので、外字
Xや特殊記号や罫線素片など、JIS第一、第二水準表において定義されていないコー
Xドに各社により割り当てられた文字がどうなるかまでは関知しない。そして、第
X二水準がないとかあるとかによる問題は、このフィルタの範囲外と思える。それ
Xらは、書き手の責任でなんとかしてもらいたい。
X
Xいずれにせよ、通常のニュースの記事については問題はなく変換できるはずで
Xある。(と思うのだが、今ひとつ自信はない)
X
kono@csl.sony.co.jp (Shinji Kono) による変更。
X
nkf 1.4 の冗長だけど昔は便利だったオプションのいくつかは削除されている。
-n -Bなど。
X
XX0201仮名はデフォルトでX0208に変換される。ただし、シフトJISのX0201仮名
XはデフォルトではEUCだと解釈されてしまう。これが望ましくない時には -S や
-X などのフラグを使えば良い。-Xを指定すると一旦確定したシフトJISから 
EUCに移行することはない。ESC-(-Iによる X0201は常に認識される。SI/SO
SSOは、-lが指定されていなければX0201と解釈する。
X
MIME decodeは、ISO-2022-JPのbase64と、ISO-8859-1の16進encodeのみ
decodeする。 MIME decodeは、単純な改行や空白は安全に読み飛ばされる。
Xということは、 MIME decode中の空白は保存されない。lessやrnで行が分割
Xされた時は、 Terminalによって異なる ESC-[-K などが挿入されるので、
X完全にはdecode できない。ISO-8859-1 出力はJIS コード出力としか両立しない。
X
Fold 機能はfmtと異なり行頭の空白を無視する。禁則処理はあるが指定された
X長さ+5で強制改行する。
X
XX0201仮名はrot47されない。
X
nkf 1.6
X
kono@ie.u-ryukyu.ac.jp (Shinji Kono) による変更。
X
MIME のチェックをきびしくして(遅くなった分)安全になった。
Xしたがって複数行にまたがるMIMEはdecodeされない。
MIME の直後の空白は読み飛ばす。Q-Encding の_は空白に変換される。
X -B のlevelを0,1,2 に増やした。MIMEのbase64, Q-Encodingを解読する
X機能を付けた。ヘッダなどは解読しないので、Encodeされた部分だけを
X通す必要がある。 -mB は、nkf1.5と違う動きをするので、-B -m とすること。
X
nkf 1.6.1
X
X -Z で〜 -> ~の変換を止めた。
X -Z1 でX0208間隔->ASCII spaceの変換をおこなう。
X -Z2 でX0208間隔->ASCII space 2個の変換をおこなう。
X
X kabe@dais.is.tohoku.ac.jp (Taketo Kabe) による日本語roff のソースが
X つきました。
X
========
nkf 1.62
X
GHG00637@niftyserve.or.jp (COW) による変更
X
X　市川氏のnkfは、UNIX用のツールであるので、出力のデフォルトの設定が7bit
XのJISコードであったものを、DOS,Windows版では、S-JISコードを出力デフォル
Xトに設定した。これにより、UNIXで作成されたファイルを、DOS,Windows上で閲
X覧することができる。その他の機能追加としてバージョン情報と使用方法を表示
Xするようにし、ファイル出力機能を追加した。（再コンパイルで変更可能）
X
Windows16bit版のみの拡張について
X
X　Windows16bit版については、リダイレクトやパイプ機能が使えません。よってこの
X場合には-Oオプションを利用してファイル出力されたものを利用してもらいたい。
X
X例：　wnkf -e -O nkf.in nkf.out ...nkf.inをEUCコードでnkf,outに出力する。
X
X　Windows16bit版では、標準出力及びエラー出力がウインドウ画面になります。標準
X出力の場合はスクロール動作が追加されており、画面が流れないようになっている。
Xだだし、-Oオプションを指定した場合にはファイルに出力されるため、画面に
Xは何も表示されない。
Xまた、EasyWinのバージョンアップで、400行までのクリップボード転送と印刷も
X可能となった。また、ドラッグ・アンド・ドロップにも対応している。
X
X　UNIXファイルのViewerとして使うには、以下のように使用する。これは拡張子
Xを関連づけしても使用可能と思われる。
X
X例：　wnkf in.euc ...EUCコードのファイルをS-JISで閲覧
X　　　wnkf in.jis ...JISコードのファイルをS-JISで閲覧
X
Xなお、このwnkf.exeはDOS窓上では起動できないので、コマンドラインで、
Windows16bitソフトが動作できる環境であるComWin,ComRun等を利用してほしい。
(Windows95/NTであれば、コンソールから実行が可能である。)
X
DOS,OS/2,Windows32bit版について
X
X　DOS,OS/2,Windows32bit版はUNIXと同じようにパイプ及びリダイレクトが可能
Xである。よって、以下のようにしてもファイル出力可能である。
X
X例：　nkf -e nkf.in > nkf.out ...nkf.inをEUCコードでnkf,outに出力する。
X
X　Viewerとして使用する場合は以下のようにする。
X
X例：　nkf in.euc | more ...EUCコードのファイルをS-JISで閲覧
X　　　nkf in.jis | more ...JISコードのファイルをS-JISで閲覧
X
X  DOS,WindowsとUNIX間のデータ変換機能については、改行コードのCR(0D)を削除
Xしたり追加したりする機能を追加した。(UNIXのアーカイブを展開した時に便利)
X
X例： nkf -j -d nkf.man > nkf.jis ...nkf.manをCRを削除してJISコードに
X                                       変換し、nkf.jisに書き込む。
X
X　-Oオプションも使えるように変更したので、上記の例は次のように使用可能
X　このコマンドラインでアプリの中から直接起動できて便利のはずですが・・
X
X例： nkf -j -d -O nkf.man nkf.jis
X
X追加オプションの利用について、
X
X  追加された-c,-dオプションは、ftpで転送されたバイナリ圧縮解凍後のテキスト
XをUNIXとDOS Windows間で使用できるように改行コードを変換するのに利用できる
Xと思う。通常は-Tオプションだけでも十分であろう。
X
X新OS/2版使用における注意
X
X　この新OS/2版を利用するには、GNUによるemx 0.8h以降の環境は不要です。
X　以下にIBM VisualAge C++3.0での実行ファイル作成手順を示す。
X   icc /Fe nkf2.exe nkf.c
X
X変更履歴
X
Xこのnkfは、1995年3月1日版からの差分パッチ1.5をベースに機能拡張したものである。
Xこのため、前回公開したVersion 1.43より-OオプションがWindows16bitだけに変更さ
Xれ、Windows16bit版は、画面スクロールとクリックボード転送と印刷機能が追加され
Xた。
X以前のバージョンでは、JIS変換時に障害があり、-Oオプションのストリームの使用方
X法を変更した。また、私COWは、最近インターネットに接続したが、Newsに参加してい
Xないため、最新でないかもしれないのは、勘弁していただきたい。
X
Ver1.52において変換のデフォルト表示の間違い等を修正した。申し訳ない。
Ver1.53においてnkf,nkf32,nkf2の-Oオプションを復活した。(方針が気まぐれだ)
(コマンドシェルをアプリから実行するのに>や|が認識されない問題があるため)
Xまた、OS/2における-c,-dオプション指定時にバイナリモ−ドにならなかった
Xため、改行コ−ド変換ができないバグを修正した。(iccの仕様が特殊であった。)
Xそれに付随して、その他-c,-dオプションのJIS,EUCモードでの不具合も修正した。
Ver1.54において-mオプションでMIMEエンコードされた文字列の扱いのヘッダー部分が、
X  かずやん
Xまたは、
X  かずやん
Xの場合でも正常に変換できるように修正した。
Ver1.62においてkono氏のVer1.6の-Z,-B levelオプション追加機能に対処した。
Xそれ以外に-cオプションのバグ修正をおこなった。
Xデフォルトの出力コードを選択できるようにソースを変更した。
X
Xパッチについて
X
nkf には数多くの非公式パッチが存在する。今までそれらを編集して
Xきたわけだが、今回「決定版」としてオリジナルからのパッチ一本に
X集約した。もちろん、採用したパッチの出典は明記してある。パッチ
Xやドキュメントを書いた人のうち、本パッケージに関わっているのは
X以下に示す通りである。(順不同、敬称略)
X
X    void@merope.pleiades.or.jp (Kusakabe Youichi)
X    nide@ics.nara-wu.ac.jp (NIDE Naoyuki)
X    ohta@src.ricoh.co.jp (Junn Ohta)
X    inouet@strl.nhk.or.jp (Tomoyuki Inoue)
X    a_kuroe@hoffman.cc.sophia.ac.jp (Akihiko Kuroe)
X    kono@ie.u-ryukyu.ac.jp(Shinji Kono)
X
X最後に
X
nkfをGUI化したEasy nkfを公開しています。(http://www.mirai.or.jp/~cow/)
X他のソフトもころがっていますので、暇な人は覗いてみてください。
X
nkf 1.7
X
ESC-$-(-B などにも対応するようにしました。
X
MIMEのチェックが厳しすぎるように思うので、STRICT_MIME をdefine
Xした時にのみに厳しいチェックを行う用にしました。
X
nkf は、本来、network 上に出して安全なコードをデフォルトで出力すべき
Xであるので、デフォルトの出力コードをShift JIS, EUC などにするのは
X望ましくないでしょう。
X
X他の人と少し話して、copy right の非営利の条件を緩めました。
X
Perl Extension として使えるようになりました。
X
X    % time perl5 nkf_test.pl
X    0.609u 2.264s 0:03.24 88.2%     0+0k 6+96io 0pf+0w
X    % time perl5 test.pl
X    0.494u 0.178s 0:01.17 56.4%     0+0k 0+0io 0pf+0w
X
X速い!
X
patch 1 for 1.7
X
version が間違ってました。
X
MIME decode をデフォルトにしたのに、MIME の条件を緩めたのが
X少し緩め過ぎのようですね。uuencode とかがひっかかってしまう。
STRICT_MIME を define すればいいのですが、ちょっと syntax error
Xいれてしまいました。
X
define STRICT_MIME をデフォルトに直しました。まぁ、仕方ないかなぁ。
X
X次の nkf 1.9 では、command option で切り替えられるようになります。
X
Xあと NKF.xs で 
X    argc = items - 1;
Xを使うようにしました。(by 木村 巌 <iwao@math.tsukuba.ac.jp>)
X
SHAR_EOF
  $shar_touch -am 1116192198 'nkf.doc' &&
  chmod 0644 'nkf.doc' ||
  $echo 'restore of' 'nkf.doc' 'failed'
  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
    || $echo 'nkf.doc:' 'MD5 check failed'
43071937eb976e18fe2bdf720a9f79a2  nkf.doc
SHAR_EOF
  else
    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'nkf.doc'`"
    test 15066 -eq "$shar_count" ||
    $echo 'nkf.doc:' 'original size' '15066,' 'current size' "$shar_count!"
  fi
fi
# ============= MANIFEST ==============
if test -f 'MANIFEST' && test "$first_param" != -c; then
  $echo 'x -' SKIPPING 'MANIFEST' '(file already exists)'
else
  $echo 'x -' extracting 'MANIFEST' '(text)'
  sed 's/^X//' << 'SHAR_EOF' > 'MANIFEST' &&
nkf.doc
MANIFEST
Makefile
nkf.1
nkf.1j
nkf.c
nkf_test.pl
NKF/Changes
NKF/MANIFEST
NKF/Makefile.PL
NKF/NKF.pm
NKF/NKF.xs
NKF/README
NKF/test.pl
SHAR_EOF
  $shar_touch -am 1116192198 'MANIFEST' &&
  chmod 0644 'MANIFEST' ||
  $echo 'restore of' 'MANIFEST' 'failed'
  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
    || $echo 'MANIFEST:' 'MD5 check failed'
f575e0db3d3af4e644eaae4b4fa364fd  MANIFEST
SHAR_EOF
  else
    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MANIFEST'`"
    test 143 -eq "$shar_count" ||
    $echo 'MANIFEST:' 'original size' '143,' 'current size' "$shar_count!"
  fi
fi
# ============= Makefile ==============
if test -f 'Makefile' && test "$first_param" != -c; then
  $echo 'x -' SKIPPING 'Makefile' '(file already exists)'
else
  $echo 'x -' extracting 'Makefile' '(text)'
  sed 's/^X//' << 'SHAR_EOF' > 'Makefile' &&
CC = cc
CFLAGS = -O
SHAR = shar -T
# SHAR = shar 
PERL = perl5
X
nkf : nkf.c
X	$(CC) $(CFLAGS) -o nkf nkf.c
X
clean:
X	rm -fr nkf.o nkf nkf.in nkf.out nkf17 *~
test:	nkf
X	perl nkf_test.pl
X
perl:
X	( cd NKF ; \
X	$(PERL) Makefile.PL  ; \
X	make ; \
X	make test )
X
shar:
X	-mkdir nkf17
X	-mkdir nkf17/NKF
X	for file in  `cat MANIFEST`;  \
X	do  \
X	    nkf -j $$file > nkf17/$$file ; \
X	done 
X	( cd nkf17 ; $(SHAR)  `cat ../MANIFEST` ) > nkf17.shar
SHAR_EOF
  $shar_touch -am 1116192198 'Makefile' &&
  chmod 0644 'Makefile' ||
  $echo 'restore of' 'Makefile' 'failed'
  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
    || $echo 'Makefile:' 'MD5 check failed'
fe6ea72e60f25f8149351f8a5f5105cb  Makefile
SHAR_EOF
  else
    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'Makefile'`"
    test 434 -eq "$shar_count" ||
    $echo 'Makefile:' 'original size' '434,' 'current size' "$shar_count!"
  fi
fi
# ============= nkf.1 ==============
if test -f 'nkf.1' && test "$first_param" != -c; then
  $echo 'x -' SKIPPING 'nkf.1' '(file already exists)'
else
  $echo 'x -' extracting 'nkf.1' '(text)'
  sed 's/^X//' << 'SHAR_EOF' > 'nkf.1' &&
X.TH NKF 1L 8/NOV/97
X.SH NAME
nkf \- Network Kanji code conversion Filter v1.7
X.SH SYNOPSIS
X.B nkf
[
X.B options
] [
X.B file
]
X.SH DESCRIPTION
X.PP
X.B Nkf
is a yet another kanji code converter among networks, hosts and terminals.
It converts input kanji code to designated kanji code
such as 7-bit JIS, MS-kanji (shifted-JIS) or EUC.
X.PP
One of the most unique facicility of 
X.B nkf
is the guess of the input kanji code.
It currently recognizes 7-bit JIS, MS-kanji (shifted-JIS) and EUC.
So users needn't the input kanji code specification.
X
By default X0201 kana is converted into X0208 kana. For
XX0201 kana, SO/SI, SSO and
ESC-(-I methods are supported. For automatic code detection, nkf assumes
no X0201 kana in MS-Kanji. To accept X0201 in MS-Kanji, use \-X, \-x or
\-S.
X.PP
Options are bellow:
X.TP
X.B \-b
bufferd output.
This is a default.
X.TP
X.B \-u
unbufferd output.
X.TP
X.B \-t
no operations.
X.TP
X.B \-j
output 7-bit JIS code.
This is a default.
X.TP
X.B \-s
output MS-kanji (shifted-JIS) code.
X.TP
X.B \-e
output EUC (AT&T) code.
X.TP
X.BI \-i c
output 
X.BI ESC\-$\- c
as sequence to designate JIS-kanji
(Default is
X.BR B .)
X.TP
X.BI \-o c
output 
X.BI ESC\-(\- c
as sequence to designate single-byte roman characters
(Default is
X.BR B .)
X.TP
X.B \-r
{de/en}crypt ROT13/47
X.TP
X.B \-v
display Version
X.TP
X.B \-T
Text mode output (MS-DOS)
X.TP
X.B \-m
MIME ISO-2022-JP/ISO8859-1 decode. (default) To see ISO8859-1 (Latin-1)
\-l is necessary. 
X.TP
X.B \-mB
Decode MIME base64 encoded stream. Remove header or other part before
conversion.
X.TP
X.B \-mQ
Decode MIME quoted stream. '_' in quoted is converted to space.
X.TP
X.B \-m0
No MIME decode.
X.TP
X.B \-l
Input and output code is ISO8859-1 (Latin-1) and ISO-2022-JP.
\-s, \-e and \-x are not compatible with this option.
X.TP
X.BI \-f n
Folding on 
X.BI n 
length in a line. Default 60.
X.TP
X.B \-X
Allow X0201 kana in MS-Kanji.  
XX0201 is converted into X0208 by default.
This is default in MSDOS.
X.TP
X.B \-x
Try to preseve X0208 kana.
Assume X0201 kana in MS-Kanji. And
do not convert X0201 kana to X0208. 
In JIS output, ESC-(-I is used. In EUC output, SSO is used.
X.TP
X.B \-Z
Convert X0208 alphabet to ASCII. \-Z1 converts X0208 kankaku to one 
ASCII space. \-Z2 converts X0208 kankaku to two ASCII spaces.
X.TP
X.B \-S
Assume MS-Kanji and X0201 kana input. It also accpet JIS.
AT&T EUC is recognized as X0201 kana. Without \-x flag,
XX0201 kana is converted into X0208.
X.TP
X.B \-J
Assume  JIS input. It also accepts Japanese EUC.
This is the default. This flag does not excludde MS-Kanji.
X.TP
X.B \-E
Assume AT&T EUC input. It also accpet JIS.
Same as \-J.
X.TP
X.B \-B
Assume broken JIS-Kanji, which lost ESC.  Usefull when your site is 
using old B-News Nihongo patch. \-B1 allows any char after ESC-( or
ESC-$. \-B2 forces ASCII after NL.
X.TP
X.B \-O
Output result to file. The first name in arguments becomes output.
Please be careful. If there are no file arguments, nkf.out is chosen.
X.TP
X.B \-c
add CR after NL.
X.TP
X.B \-d
delete CR after NL.
X.SH "FILES"
nkf - binary
X.SH AUTHOR
Itaru Ichikawa <ichikawa@flab.fujitsu.co.jp>
(was ichikawa@fujitsu.JUNET)
X.SH EDITOR
a_kuroe@hoffman.cc.sophia.ac.jp (Akihiko Kuroe)
kono@ie.u-ryukyu.ac.jp (Shinji KONO)
X.SH BUGS
X.B Nkf
cannot handle some input that contains mixed kanji codes.
Automatic code detection 
becomes very weak with \-x, \-X and \-S. 
X
SHAR_EOF
  $shar_touch -am 1116192198 'nkf.1' &&
  chmod 0644 'nkf.1' ||
  $echo 'restore of' 'nkf.1' 'failed'
  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
    || $echo 'nkf.1:' 'MD5 check failed'
409579eec415c1b9c439e3e109099253  nkf.1
SHAR_EOF
  else
    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'nkf.1'`"
    test 3333 -eq "$shar_count" ||
    $echo 'nkf.1:' 'original size' '3333,' 'current size' "$shar_count!"
  fi
fi
# ============= nkf.1j ==============
if test -f 'nkf.1j' && test "$first_param" != -c; then
  $echo 'x -' SKIPPING 'nkf.1j' '(file already exists)'
else
  $echo 'x -' extracting 'nkf.1j' '(text)'
  sed 's/^X//' << 'SHAR_EOF' > 'nkf.1j' &&
X.TH NKF 1
X.SH NAME
nkf \- ネットワーク用漢字コード変換フィルタ v1.7
X.SH SYNOPSIS
X.B nkf
X.RI [ options ]
X.RI [ file ]
X.SH DESCRIPTION
\fInkf\fPはネットワークでメールやニュースの読み書きをするために作られた、漢
X字コードの変換フィルタである。
X.PP
Xこの\fInkf\fPの特徴としては、入力漢字コード系の統計的な自動認識機能がある。
Xこのため、利用者は、入力漢字コード系が何であるかを知らなくても、出力漢字
Xコード系のみ指定すれば良いことになる。ただ、この判定機構は、理論的には完
X全ではないが、通常のニュースやメールのメッセージについては確実に動作する
X安全なものにはなっている。
X.PP
X現在、\fInkf\fPが認識できる入力の漢字コード系は、いわゆる「JISコード」(ISO-
2022-JPに基づくもの)、MS漢字コード(シフトJIS)、日本語EUC(AT&Tコード)のい
Xずれかである。出力する漢字コード系も、この3種類である。
X.PP
X入力は、ファイルを指定しなければ、標準入力となる。出力は標準出力である。
X.PP
X指定できるオプションは、以下の通り。\fB\-mu\fP のように続けることができる。
X.TP
X.B \-b
Xバッファリング出力を行う。(デフォルト)
X.TP
X.B \-u
X出力時に、バッファリングしない。
rsh localhost | nkf \-u というように使う。
X.TP
X.B \-t
X何もしない。
X.TP
X.B \-j
JISコードを出力する。(デフォルト)
X.TP
X.B \-e
EUCコードを出力する。
X.TP
X.B \-s
XシフトJISコードを出力する。
X.TP
X.BI \-i ?
JIS漢字を指示するシーケンスとして \fBESC-'$'-\fP\fI?\fPを使用する。
(デフォルトは、ESC-'$'-'B')
X.TP
X.BI \-o ?
1バイト英数文字セットを指示するシーケンスとして、\fBESC-'('-\fP\fI?\fPを使用す
Xる。
(デフォルトは、ESC-'('-'B')
X.TP
X.B \-r
ROT13/47の変換をする。
X.TP
X.B \-v
Xバージョンを表示する。
X.TP
X.B \-T
Xテキストモードで出力する。(MS-DOS上でのみ効力を持つ)
X.TP
X.B \-m[QB0]
MIME を解読する。(デフォルト) ISO-2022-JP(base64)とISO-8859-1(Q encode)
Xのみを解読する。ISO-8859-1 (Latin-1) を解読する時は、
-lフラグも必要である。\-m0 ではMIMEを解読しない。\-mQ, \-mBでは、
Q encode, B encode されているものとして処理する。
X.TP
X.B \-l
0x80-0xfeのコードをISO-8859-1 (Latin-1)として扱う。
JISコードアウトプットとの組合せみのみ有効。
\-s, \-e, \-xとは両立しない。
X.TP
X.BI \-f ?
X一行\fI?\fP文字になるように簡単な整形をおこなう。デフォルトは
60文字である。
X.TP
X.B \-Z
XX0208中の英数字と若干の記号をASCIIに変換する。\-Z1 はX0208間隔をASCII
spaceに変換する。\-Z2はX0208間隔をASCII space 二つに変換する。趣味によって
X使い分けてほしい。
X.TP
X.B "\-J \-E \-S \-X \-B"
X期待される入力コードの性質を指定する。
X.RS
X.IP \fB\-J\fP
ISO-2022-JPを仮定する。
X.IP \fB\-E\fP
X日本語EUC(AT&T)を仮定する。
X.IP \fB\-S\fP
MS漢字を仮定する。X0201仮名も仮定される。
X.IP \fB\-X\fP
MS漢字中にX0201仮名があると仮定する。
X.IP \fB\-B\fP
X壊れた(Broken)JISコード。ESCがなくなったと仮定する。
X.RS
X.IP \fB\-B1\fP
X \fBESC-(\fP, \fBESC-$\fP のあとのコードを問わない
X.IP \fB\-B2\fP
X改行のあとに強制的にASCIIの戻す
X.RE
X.RE
X.TP
X.B \-x
X通常おこなわれるX0201仮名->X0208の仮名変換をしないで、
X X0201仮名を保存する。入力は、MS-Kanjiの1byte仮名、SO/SI、
ESC-(-I, SSOを受け付ける。出力は、日本語EUC中ではSSO、
JISでは ESC-'('-I を使う。
X.TP
X.B \-O
Xファイルに出力する。Unixでは不要な機能だがWindowsやMSDOSでは
X必要らしい。直後の引き数でなく、最後のファイル名が出力ファイ
Xル名となり上書きされてしまうので注意。ファイル名がない場合は、
X適当に決められる(nkf.outなど)。
X.TP
X.B \-c
NLあとにCRを付加する。
X.TP
X.B \-d
NLあとのCRを削除する。
X
X.SH AUTHOR
X
X市川  至	ichikawa@flab.fujitsu.co.jp	(was ichikawa@fujitsu.JUNET)
X
X.SH ACKNOWLEDGE
X
morb@fujitsu, kiss@ayumi.stars.flab.fujitsu, cen122@flab.fujitsu,
yuki@flab.fujitsu 他、fujitsu & flab.fujitsuの皆さんの協力に感謝。
shinoda@cs.titech, kato@cs.titech, uematsu@cs.titech  TNX
kono@ie.u-ryukyu.ac.jp
X
X.SH BUGS
X
X実は、入力のコード系の判定は、EUCとシフトJISとの自動判定であり、最初に
X特定できる文字が来た時点で確定してしまう。そして、特定不能の間は保留バッ
Xファにためておかれ、確定後に処理される。このため、
X.IP 1)
7ビットJISは常に認識される。シフトJIS、EUC混合もほとんどの
X場合は問題がない。ただし、
X.IP 2)
XシフトJISのX0201仮名とEUCが識別できない。したがって、
XデフォルトではシフトJISのX0201仮名はないと仮定している。
X.IP 3)
Xちょっと、のろい。(初期の版よりは改良されている)
X.PP
JIS漢字の新旧版の区別とか、ASCIIとJISローマ字の区別などについては保存さ
Xれない。
X.PP
Xこのフィルタの変換は、コード系に対応した一括写像を施すだけなので、外字
Xや特殊記号や罫線素片など、JIS第一、第二水準表において定義されていないコー
Xドに各社により割り当てられた文字がどうなるかまでは関知しない。そして、第
X二水準がないとかあるとかによる問題は、このフィルタの範囲外と思える。それ
Xらは、書き手の責任でなんとかしてもらいたい。
X.PP
Xいずれにせよ、通常のニュースの記事については問題はなく変換できるはずで
Xある。(と思うのだが、今ひとつ自信はない)
X
X.SH "kono@csl.sony.co.jp (Shinji Kono) による変更。"
X
nkf 1.4 の冗長だけど昔は便利だったオプションのいくつかは削除されている。
\- \-n \-Bなど。
X.PP
XX0201仮名はデフォルトでX0208に変換される。ただし、シフトJISのX0201仮名
XはデフォルトではEUCだと解釈されてしまう。これが望ましくない時には \-S や
\- \-X などのフラグを使えば良い。\-Xを指定すると一旦確定したシフトJISから 
EUCに移行することはない。ESC-(-Iによる X0201は常に認識される。SI/SO
SSOは、\-lが指定されていなければX0201と解釈する。
X.PP
MIME decodeは、ISO-2022-JPのbase64と、ISO-8859-1の16進encodeのみ
decodeする。 MIME decodeは、単純な改行や空白は安全に読み飛ばされる。
Xということは、 MIME decode中の空白は保存されない。lessやrnで行が分割
Xされた時は、 Terminalによって異なる ESC-[-K などが挿入されるので、
X完全にはdecode できない。ISO-8859-1 出力はJIS コード出力としか両立しない。
X.PP
Fold 機能はfmtと異なり行頭の空白を無視する。禁則処理はあるが指定された
X長さ+5で強制改行する。
X.PP
XX0201仮名はrot47されない。
X
X.SH nkf 1.6 "kono@ie.u-ryukyu.ac.jp (Shinji Kono) による変更。"
X
MIME のチェックをきびしくして(遅くなった分)安全になった。
Xしたがって複数行にまたがるMIMEはdecodeされない。
MIME の直後の空白は読み飛ばす。Q-Encding の_は空白に変換される。
X -B のlevelを0,1,2 に増やした。MIMEのbase64, Q-Encodingを解読する
X機能を付けた。ヘッダなどは解読しないので、Encodeされた部分だけを
X通す必要がある。 -mB は、nkf1.5と違う動きをするので、-B -m とすること。
X
X.SH nkf 1.6.1
X
\-Z で〜 \-> ~の変換を止めた。
\-Z1 でX0208間隔\->ASCII spaceの変換をおこなう。
\-Z2 でX0208間隔\->ASCII space 2個の変換をおこなう。
X.PP
kabe@dais.is.tohoku.ac.jp (Taketo Kabe) による日本語roff のソースが
Xできました。
X
X.SH nkf 1.7
X.PP
ESC-$-(-B などにも対応するようにしました。
X.PP
MIMEのチェックが厳しすぎるように思うので、STRICT_MIME をdefine
Xした時にのみに厳しいチェックを行う用にしました。
X.PP
nkf は、本来、network 上に出して安全なコードをデフォルトで出力すべき
Xであるので、デフォルトの出力コードをShift JIS, EUC などにするのは
X望ましくないでしょう。
X.PP
X他の人と少し話して、copy right の非営利の条件を緩めました。
X.PP
Perl Extension として使えるようになりました。
X
SHAR_EOF
  $shar_touch -am 1116192198 'nkf.1j' &&
  chmod 0644 'nkf.1j' ||
  $echo 'restore of' 'nkf.1j' 'failed'
  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
    || $echo 'nkf.1j:' 'MD5 check failed'
64a33d755e31a97df9c7a76d6df45567  nkf.1j
SHAR_EOF
  else
    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'nkf.1j'`"
    test 8015 -eq "$shar_count" ||
    $echo 'nkf.1j:' 'original size' '8015,' 'current size' "$shar_count!"
  fi
fi
# ============= nkf.c ==============
if test -f 'nkf.c' && test "$first_param" != -c; then
  $echo 'x -' SKIPPING 'nkf.c' '(file already exists)'
else
  $echo 'x -' extracting 'nkf.c' '(text)'
  sed 's/^X//' << 'SHAR_EOF' > 'nkf.c' &&
/** Network Kanji Filter. (PDS Version)
************************************************************************
** Copyright (C) 1987, Fujitsu LTD. (Itaru ICHIKAWA)
** 連絡先： （株）富士通研究所　ソフト３研　市川　至 
** （E-Mail Address: ichikawa@flab.fujitsu.co.jp）
** Copyright (C) 1996,1998
** 連絡先： 琉球大学情報工学科 河野 真治  mine/X0208 support
** （E-Mail Address: kono@ie.u-ryukyu.ac.jp）
** 連絡先： COW for DOS & Win16 & Win32 & OS/2
** （E-Mail Address: GHG00637@niftyserve.or.p）
**    このソースのいかなる複写，改変，修正も許諾します。ただし、
**    その際には、誰が貢献したを示すこの部分を残すこと。
**    再配布や雑誌の付録などの問い合わせも必要ありません。
**    このプログラムについては特に何の保証もしない、悪しからず。
**    Everyone is permitted to do anything on this program 
**    including copying, modifying, improving.
**    as long as you don't try to pretend that you wrote it.
**    i.e., the above copyright notice has to appear in all copies.
**    You don't have to ask before copying or publishing.
**    THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE.
***********************************************************************/
X
static char *CopyRight =
X      "Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa),1998 S. Kono, COW";
static char *Version =
X      "1.7";
static char *Patchlevel =
X      "1/9811/Shinji Kono";
X
/*
**
**
**
** USAGE:       nkf [flags] [file] 
**
** Flags:
** b    Output is bufferred             (DEFAULT)
** u    Output is unbufferred
**
** t    no operation
**
** j    Outout code is JIS 7 bit        (DEFAULT SELECT) 
** s    Output code is MS Kanji         (DEFAULT SELECT) 
** e    Output code is AT&T JIS         (DEFAULT SELECT) 
** l    Output code is JIS 7bit and ISO8859-1 Latin-1
**
** m    MIME conversion for ISO-2022-JP
** i_ Output sequence to designate JIS-kanji (DEFAULT_J)
** o_ Output sequence to designate single-byte roman characters (DEFAULT_R)
**
** r  {de/en}crypt ROT13/47
**
** v  display Version
**
** T  Text mode output        (for MS-DOS)
**
** x    Do not convert X0201 kana into X0208
** Z    Convert X0208 alphabet to ASCII
**
** f60  fold option
**
** m    MIME decode
** B    try to fix broken JIS, missing Escape
** B[1-9]  broken level
**
** O   Output to 'nkf.out' file 
** d   Delete \r in line feed 
** c   Add \r in line feed 
**/
/******************************/
/* デフォルトの出力コード選択 */
/* Select DEFAULT_CODE */
#define DEFAULT_CODE_JIS
/* #define DEFAULT_CODE_SJIS */
/* #define DEFAULT_CODE_EUC */
/******************************/
X
#if (defined(__TURBOC__) || defined(LSI_C)) && !defined(MSDOS)
#define MSDOS
#endif
X
#ifndef PERL_XS
#include <stdio.h>
#endif
X
#if defined(MSDOS) || defined(__OS2__) 
#include <stdlib.h>
#include <fcntl.h>
#include <io.h>
#endif
X
#ifdef MSDOS
#ifdef LSI_C
#define setbinmode(fp) fsetbin(fp)
#else /* Microsoft C, Turbo C */
#define setbinmode(fp) setmode(fileno(fp), O_BINARY)
#endif
#else /* UNIX,OS/2 */
#define setbinmode(fp)
#endif
X
#ifdef _IOFBF /* SysV and MSDOS */
#define       setvbuffer(fp, buf, size)       setvbuf(fp, buf, _IOFBF, size)
#else /* BSD */
#define       setvbuffer(fp, buf, size)       setbuffer(fp, buf, size)
#endif
X
/*Borland C++ 4.5 EasyWin*/
#if defined(__TURBOC__) && defined(_Windows) && !defined(__WIN32__) /*Easy Win */
#define         EASYWIN
#include <windows.h>
#endif
X
#define         FALSE   0
#define         TRUE    1
X
/* state of output_mode and input_mode  */
X
#define         ASCII           0
#define         X0208           1
#define         X0201           2
#define         NO_X0201        3
#define         JIS_INPUT       4
#define         SJIS_INPUT      5
#define         LATIN1_INPUT    6
#define         FIXED_MIME      7
#define         DOUBLE_SPACE    -2
X
#define         NL      0x0a
#define         ESC     0x1b
#define         SPACE      0x20
#define         AT      0x40
#define         SSP     0xa0
#define         DEL     0x7f
#define         SI      0x0f
#define         SO      0x0e
#define         SSO     0x8e
X
#define         HOLD_SIZE       32
#define         IOBUF_SIZE      16384
X
#define         DEFAULT_J       'B'
#define         DEFAULT_R       'B'
X
#define         SJ0162  0x00e1          /* 01 - 62 ku offset */
#define         SJ6394  0x0161          /* 63 - 94 ku offset */
X
X
/* MIME preprocessor */
X
#define STRICT_MIME       /* do stupid strict mime integrity check */
#define GETC(p) ((!mime_mode)?getc(p):mime_getc(p))
#define UNGETC(c,p)     ((!mime_mode)?ungetc(c,p):mime_ungetc(c))
X
X
#ifdef EASYWIN /*Easy Win */
extern POINT _BufferSize;
#endif
X
/*      function prototype  */
X
static  int     noconvert(FILE *f);
static  int     kanji_convert(FILE *f);
static  int     h_conv(FILE *f,int c2,int c1);
static  int     push_hold_buf(int c2,int c1);
static  int     s_iconv(int c2,int c1);
static  int     e_oconv(int c2,int c1);
static  int     s_oconv(int c2,int c1);
static  int     j_oconv(int c2,int c1);
static  int     line_fold(int c2,int c1);
static  int     pre_convert(int c1,int c2);
static  int     mime_begin(FILE *f);
static  int     mime_getc(FILE *f);
static  int     mime_ungetc(unsigned int c);
static  int     mime_integrity(FILE *f,unsigned char *p);
static  int     base64decode(int c);
static  int     usage(void);
static  void    arguments(char *c);
static  void    reinit();
X
/* buffers */
X
static char            stdibuf[IOBUF_SIZE];
static char            stdobuf[IOBUF_SIZE];
static unsigned char   hold_buf[HOLD_SIZE*2];
static int             hold_count;
X
/* MIME preprocessor fifo */
X
#define MIME_BUF_SIZE   (1024)    /* 2^n ring buffer */
#define MIME_BUF_MASK   (MIME_BUF_SIZE-1)   
#define Fifo(n)         mime_buf[(n)&MIME_BUF_MASK]
static unsigned char           mime_buf[MIME_BUF_SIZE];
static unsigned int            mime_top = 0;
static unsigned int            mime_last = 0;  /* decoded */
static unsigned int            mime_input = 0; /* undecoded */
X
/* flags */
static int             unbuf_f = FALSE;
static int             estab_f = FALSE;
static int             nop_f = FALSE;
static int             binmode_f = TRUE;       /* binary mode */
static int             rot_f = FALSE;          /* rot14/43 mode */
static int             input_f = FALSE;        /* non fixed input code  */
static int             alpha_f = FALSE;        /* convert JIx0208 alphbet to ASCII */
static int             mime_f = TRUE;         /* convert MIME B base64 or Q */
static int             mimebuf_f = FALSE;      /* MIME buffered input */
static int             broken_f = FALSE;       /* convert ESC-less broken JIS */
static int             iso8859_f = FALSE;      /* ISO8859 through */
#if defined(MSDOS) || defined(__OS2__) 
static int             x0201_f = TRUE;         /* Assume JISX0201 kana */
#else
static int             x0201_f = NO_X0201;     /* Assume NO JISX0201 */
#endif
X
/* X0208 -> ASCII converter */
X
static int             c1_return;
X
/* fold parameter */
static int line = 0;    /* chars in line */
static int prev = 0;
static int             fold_f  = FALSE;
static int             fold_len  = 0;
X
/* options */
static char            kanji_intro = DEFAULT_J,
X                ascii_intro = DEFAULT_R;
X
/* Folding */
X
int line_fold();
#define FOLD_MARGIN  10
#define DEFAULT_FOLD 60
X
/* converters */
X
#ifdef DEFAULT_CODE_JIS
#   define  DEFAULT_CONV j_oconv
#endif
#ifdef DEFAULT_CODE_SJIS
#   define  DEFAULT_CONV s_oconv
#endif
#ifdef DEFAULT_CODE_EUC
#   define  DEFAULT_CONV e_oconv
#endif
X
static int             (*iconv)(int c2,int c1);   
X					/* s_iconv or oconv */
static int             (*oconv)(int c2,int c1) = DEFAULT_CONV; 
X					  /* [ejs]_oconv */
X
/* Global states */
static int             output_mode = ASCII,    /* output kanji mode */
X                input_mode =  ASCII,    /* input kanji mode */
X                shift_mode =  FALSE;    /* TRUE shift out, or X0201  */
static int             mime_mode =   FALSE;    /* MIME mode B base64, Q hex */
X
/* X0201 / X0208 conversion tables */
X
/* X0201 kana conversion table */
/* 90-9F A0-DF */
unsigned char cv[]= {
0x21,0x21,0x21,0x23,0x21,0x56,0x21,0x57,
0x21,0x22,0x21,0x26,0x25,0x72,0x25,0x21,
0x25,0x23,0x25,0x25,0x25,0x27,0x25,0x29,
0x25,0x63,0x25,0x65,0x25,0x67,0x25,0x43,
0x21,0x3c,0x25,0x22,0x25,0x24,0x25,0x26,
0x25,0x28,0x25,0x2a,0x25,0x2b,0x25,0x2d,
0x25,0x2f,0x25,0x31,0x25,0x33,0x25,0x35,
0x25,0x37,0x25,0x39,0x25,0x3b,0x25,0x3d,
0x25,0x3f,0x25,0x41,0x25,0x44,0x25,0x46,
0x25,0x48,0x25,0x4a,0x25,0x4b,0x25,0x4c,
0x25,0x4d,0x25,0x4e,0x25,0x4f,0x25,0x52,
0x25,0x55,0x25,0x58,0x25,0x5b,0x25,0x5e,
0x25,0x5f,0x25,0x60,0x25,0x61,0x25,0x62,
0x25,0x64,0x25,0x66,0x25,0x68,0x25,0x69,
0x25,0x6a,0x25,0x6b,0x25,0x6c,0x25,0x6d,
0x25,0x6f,0x25,0x73,0x21,0x2b,0x21,0x2c,
0x00,0x00};
X
X
/* X0201 kana conversion table for daguten */
/* 90-9F A0-DF */
unsigned char dv[]= { 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x25,0x2c,0x25,0x2e,
0x25,0x30,0x25,0x32,0x25,0x34,0x25,0x36,
0x25,0x38,0x25,0x3a,0x25,0x3c,0x25,0x3e,
0x25,0x40,0x25,0x42,0x25,0x45,0x25,0x47,
0x25,0x49,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x25,0x50,0x25,0x53,
0x25,0x56,0x25,0x59,0x25,0x5c,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00};
X
/* X0201 kana conversion table for han-daguten */
/* 90-9F A0-DF */
unsigned char ev[]= { 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x25,0x51,0x25,0x54,
0x25,0x57,0x25,0x5a,0x25,0x5d,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00};
X
X
/* X0208 kigou conversion table */
/* 0x8140 - 0x819e */
unsigned char fv[] = {
X
0x00,0x00,0x00,0x00,0x2c,0x2e,0x00,0x3a,
0x3b,0x3f,0x21,0x00,0x00,0x27,0x60,0x00,
0x5e,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x2f,
0x5c,0x00,0x00,0x7c,0x00,0x00,0x60,0x27,
0x22,0x22,0x28,0x29,0x00,0x00,0x5b,0x5d,
0x7b,0x7d,0x3c,0x3e,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x2b,0x2d,0x00,0x00,
0x00,0x3d,0x00,0x3c,0x3e,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x24,0x00,0x00,0x25,0x23,0x26,0x2a,0x40,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
} ;
X
X
static int             file_out = FALSE;
static int             add_cr = FALSE;
static int             del_cr = FALSE;
static int             end_check;
X
#ifndef PERL_XS
int
main(argc, argv)
X    int             argc;
X    char          **argv;
{
X    FILE  *fin;
X    char  *cp;
X
#ifdef EASYWIN /*Easy Win */
X    _BufferSize.y = 400;/*Set Scroll Buffer Size*/
#endif
X
X    for (argc--,argv++; (argc > 0) && **argv == '-'; argc--, argv++) {
X        cp = *argv;
X	arguments(cp);
X    }
X
X    if(iso8859_f && (oconv != j_oconv || !x0201_f )) {
X        fprintf(stderr,"Mixed ISO8859/JISX0201/SJIS/EUC output is not allowed.\n");
X        exit(1);
X    }
X
X    if(binmode_f == TRUE)
#ifdef __OS2__
X    if(freopen("","wb",stdout) == NULL) 
X        return (-1);
#else
X    setbinmode(stdout);
#endif
X
X    if(unbuf_f)
X      setbuf(stdout, (char *) NULL);
X    else
X      setvbuffer(stdout, stdobuf, IOBUF_SIZE);
X
X    if(argc == 0) {
X      if(binmode_f == TRUE)
#ifdef __OS2__
X      if(freopen("","rb",stdin) == NULL) return (-1);
#else
X      setbinmode(stdin);
#endif
X      setvbuffer(stdin, stdibuf, IOBUF_SIZE);
X      if(nop_f)
X          noconvert(stdin);
X      else
X          kanji_convert(stdin);
X    } else {
X      while (argc--) {
X          if((fin = fopen(*argv++, "r")) == NULL) {
X              perror(*--argv);
X              return(-1);
X          } else {
/* reopen file for stdout */
X              if(file_out == TRUE){ 
X                  if(argc == 1 ) {
X                      if(freopen(*argv++, "w", stdout) == NULL) {
X                          perror(*--argv);
X                          return (-1);
X                      }
X                      argc--;
X                  } else {
X                      if(freopen("nkf.out", "w", stdout) == NULL) {
X                         perror(*--argv);
X                         return (-1);
X                      }
X                  }
X                  if(binmode_f == TRUE) {
#ifdef __OS2__
X                      if(freopen("","wb",stdout) == NULL) 
X                           return (-1);
#else
X                      setbinmode(stdout);
#endif
X                  }
X              }
X              if(binmode_f == TRUE)
#ifdef __OS2__
X                 if(freopen("","rb",fin) == NULL) 
X                    return (-1);
#else
X                 setbinmode(fin);
#endif 
X              setvbuffer(fin, stdibuf, IOBUF_SIZE);
X              if(nop_f)
X                  noconvert(fin);
X              else
X                  kanji_convert(fin);
X              fclose(fin);
X          }
X      }
X    }
#ifdef EASYWIN /*Easy Win */
X    if(file_out == FALSE) 
X        scanf("%d",&end_check);
X    else 
X        fclose(stdout);
#else /* for Other OS */
X    if(file_out == TRUE) 
X        fclose(stdout);
#endif 
X    return (0);
}
#endif
X
void
arguments(char *cp) 
{
X    while (*cp) {
X	switch (*cp++) {
X	case 'b':           /* buffered mode */
X	    unbuf_f = FALSE;
X	    continue;
X	case 'u':           /* non bufferd mode */
X	    unbuf_f = TRUE;
X	    continue;
X	case 't':           /* transparent mode */
X	    nop_f = TRUE;
X	    continue;
X	case 'j':           /* JIS output */
X	case 'n':
X	    oconv = j_oconv;
X	    continue;
X	case 'e':           /* AT&T EUC output */
X	    oconv = e_oconv;
X	    continue;
X	case 's':           /* SJIS output */
X	    oconv = s_oconv;
X	    continue;
X	case 'l':           /* ISO8859 Latin-1 support, no conversion */
X	    iso8859_f = TRUE;  /* Only compatible with ISO-2022-JP */
X	    input_f = LATIN1_INPUT;
X	    continue;
X	case 'i':           /* Kanji IN ESC-$-@/B */
X	    if(*cp=='@'||*cp=='B') 
X		kanji_intro = *cp++;
X	    continue;
X	case 'o':           /* ASCII IN ESC-(-J/B */
X	    if(*cp=='J'||*cp=='B'||*cp=='H') 
X		ascii_intro = *cp++;
X	    continue;
X	case 'r':
X	    rot_f = TRUE;
X	    continue;
#if defined(MSDOS) || defined(__OS2__) 
X	case 'T':
X	    binmode_f = FALSE;
X	    continue;
#endif
#ifndef PERL_XS
X	case 'v':
X	    usage();
X	    exit(1);
X	    break;
#endif
X	/* Input code assumption */
X	case 'J':   /* JIS input */
X	case 'E':   /* AT&T EUC input */
X	    input_f = JIS_INPUT;
X	    continue;
X	case 'S':   /* MS Kanji input */
X	    input_f = SJIS_INPUT;
X	    if(x0201_f==NO_X0201) x0201_f=TRUE;
X	    continue;
X	case 'Z':   /* Convert X0208 alphabet to asii */
X	    /*  bit:0   Convert X0208
X		bit:1   Convert Kankaku to one space
X		bit:2   Convert Kankaku to two spaces
X	    */
X	    if('9'>= *cp && *cp>='0') 
X		alpha_f |= 1<<(*cp++ -'0');
X	    else 
X		alpha_f |= TRUE;
X	    continue;
X	case 'x':   /* Convert X0201 kana to X0208 or X0201 Conversion */
X	    x0201_f = FALSE;    /* No X0201->X0208 conversion */
X	    /* accept  X0201
X		    ESC-(-I     in JIS, EUC, MS Kanji
X		    SI/SO       in JIS, EUC, MS Kanji
X		    SSO         in EUC, JIS, not in MS Kanji
X		    MS Kanji (0xa0-0xdf) 
X	       output  X0201
X		    ESC-(-I     in JIS (0x20-0x5f)
X		    SSO         in EUC (0xa0-0xdf)
X		    0xa0-0xd    in MS Kanji (0xa0-0xdf) 
X	    */
X	    continue;
X	case 'X':   /* Assume X0201 kana */
X	    /* Default value is NO_X0201 for EUC/MS-Kanji mix */
X	    x0201_f = TRUE;
X	    continue;
X	case 'f':   /* folding -f60 or -f */
X	    fold_f = TRUE;
X	    fold_len = atoi(cp);
X	    if(!(0<fold_len && fold_len<BUFSIZ)) 
X		fold_len = DEFAULT_FOLD;
X	    while('0'<= *cp && *cp <='9') cp++;
X	    continue;
X	case 'm':   /* MIME support */
X	    mime_f = TRUE;
X	    if(*cp=='B'||*cp=='Q') {
X		mime_mode = *cp++;
X		mimebuf_f = FIXED_MIME;
X	    } else if (*cp=='0') {
X		mime_f = FALSE;
X	    }
X	    continue;
X	case 'M':   /* MIME output */
X	    oconv = j_oconv;    /* sorry... not yet done.. */
X	    continue;
X	case 'B':   /* Broken JIS support */
X	    /*  bit:0   no ESC JIS
X		bit:1   allow any x on ESC-(-x or ESC-$-x
X		bit:2   reset to ascii on NL
X	    */
X	    if('9'>= *cp && *cp>='0') 
X		broken_f |= 1<<(*cp++ -'0');
X	    else 
X		broken_f |= TRUE;
X	    continue;
#ifndef PERL_XS
X	case 'O':/* for Output file */
X	    file_out = TRUE;
X	    continue;
#endif
X	case 'c':/* add cr code */
X	    add_cr = TRUE;
X	    continue;
X	case 'd':/* delete cr code */
X	    del_cr = TRUE;
X	    continue;
X	default:
X	    /* bogus option but ignored */
X	    continue;
X	}
X    }
}
X
int
noconvert(f)
X    FILE  *f;
{
X    int    c;
X
X    while ((c = getc(f)) != EOF)
X      putchar(c);
X    return 1;
}
X
X
X
X
int
kanji_convert(f)
X    FILE  *f;
{
X    int    c1,
X                    c2;
X
X    c2 = 0;
X
X    if(input_f == JIS_INPUT || input_f == LATIN1_INPUT) {
X        estab_f = TRUE; iconv = oconv;
X    } else if(input_f == SJIS_INPUT) {
X        estab_f = TRUE;  iconv = s_iconv;
X    } else {
X        estab_f = FALSE; iconv = oconv;
X    }
X    input_mode = ASCII;
X    output_mode = ASCII;
X    shift_mode = FALSE;
X
#define NEXT continue      /* no output, get next */
#define SEND ;             /* output c1 and c2, get next */
#define LAST break         /* end of loop, go closing  */
X
X    while ((c1 = GETC(f)) != EOF) {
X        if(c2) {
X            /* second byte */
X            if(c2 > DEL) {
X                /* in case of 8th bit is on */
X                if(!estab_f) {
X                    /* in case of not established yet */
X                    if(c1 > SSP) {
X                        /* It is still ambiguious */
X                        h_conv(f, c2, c1);
X                        c2 = 0;
X                        NEXT;
X                    } else if(c1 < AT) {
X                        /* ignore bogus code */
X                        c2 = 0;
X                        NEXT;
X                    } else {
X                        /* established */
X                        /* it seems to be MS Kanji */
X                        estab_f = TRUE;
X                        iconv = s_iconv;
X                        SEND;
X                    }
X                } else
X                    /* in case of already established */
X                    if(c1 < AT) {
X                        /* ignore bogus code */
X                        c2 = 0;
X                        NEXT;
X                    } else
X                        SEND;
X            } else
X                /* 7 bit code */
X                /* it might be kanji shitfted */
X                if((c1 == DEL) || (c1 <= SPACE)) {
X                    /* ignore bogus first code */
X                    c2 = 0;
X                    NEXT;
X                } else
X                    SEND;
X        } else {
X            /* first byte */
X            if(c1 > DEL) {
X                /* 8 bit code */
X                if(!estab_f && !iso8859_f) {
X                    /* not established yet */
X                    if(c1 < SSP) {
X                        /* it seems to be MS Kanji */
X                        estab_f = TRUE;
X                        iconv = s_iconv;
X                    } else if(c1 < 0xe0) {
X                        /* it seems to be EUC */
X                        estab_f = TRUE;
X                        iconv = oconv;
X                    } else {
X                        /* still ambiguious */
X                    }
X                    c2 = c1;
X                    NEXT;
X                } else { /* estab_f==TRUE */
X                    if(iso8859_f) {
X                        SEND;
X                    } else if(SSP<=c1 && c1<0xe0 && iconv == s_iconv) {
X                        /* SJIS X0201 Case... */
X                        /* This is too arrogant, but ... */
X                        if(x0201_f==NO_X0201) {
X                            iconv = oconv;
X                            c2 = c1;
X                            NEXT;
X                        } else 
X                        if(x0201_f) {
X                            if(dv[(c1-SSP)*2]||ev[(c1-SSP)*2]) {
X                            /* look ahead for X0201/X0208conversion */
X                                if((c2 = GETC(f)) == EOF) {
X                                    (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
X                                    LAST;
X                                } else if(c2==(0xde)) { /* 濁点 */
X                                    (*oconv)(dv[(c1-SSP)*2],dv[(c1-SSP)*2+1]);
X                                    c2=0; 
X                                    NEXT;
X                                } else if(c2==(0xdf)&&ev[(c1-SSP)*2]) { 
X                                    /* 半濁点 */
X                                    (*oconv)(ev[(c1-SSP)*2],ev[(c1-SSP)*2+1]);
X                                    c2=0; 
X                                    NEXT;
X                                } 
X                                UNGETC(c2,f); c2 = 0;
X                            }
X                            (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
X                            NEXT;
X                        } else
X                            SEND;
X                    } else if(c1==SSO && iconv != s_iconv) {
X                        /* EUC X0201 Case */
X                        /* This is too arrogant
X                        if(x0201_f == NO_X0201) {
X                            estab_f = FALSE; 
X                            c2 = 0;  
X                            NEXT;
X                        } */
X                        c1 = GETC(f);  /* skip SSO */
X                        euc_1byte_check:
X                        if(x0201_f && SSP<=c1 && c1<0xe0) {
X                            if(dv[(c1-SSP)*2]||ev[(c1-SSP)*2]) {
X                                if((c2 = GETC(f)) == EOF) {
X                                    (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
X                                    LAST;
X                                }
X                                /* forward lookup 濁点/半濁点 */
X                                if(c2 != SSO) {
X                                    UNGETC(c2,f); c2 = 0; 
X                                    (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
X                                    NEXT;
X                                } else if((c2 = GETC(f)) == EOF) {
X                                    (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
X                                    (*oconv)(0,SSO); 
X                                    LAST;
X                                } else if(c2==(0xde)) { /* 濁点 */
X                                    (*oconv)(dv[(c1-SSP)*2],dv[(c1-SSP)*2+1]);
X                                    c2=0; 
X                                    NEXT;
X                                } else if(c2==(0xdf)&&ev[(c1-SSP)*2]) { 
X                                    /* 半濁点 */
X                                    (*oconv)(ev[(c1-SSP)*2],ev[(c1-SSP)*2+1]);
X                                    c2=0; 
X                                    NEXT;
X                                } else {
X                                    (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
X                                    /* we have to check this c2 */
X                                    /* and no way to push back SSO */
X                                    c1 = c2; c2 = 0;
X                                    goto euc_1byte_check;
X                                }
X                            }
X                            (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
X                            NEXT;
X                        } else 
X                            SEND;
X                    } else if(c1 < SSP && iconv != s_iconv) {
X                        /* strange code in EUC */
X                        iconv = s_iconv;  /* try SJIS */
X                        c2 = c1;
X                        NEXT;
X                    } else {
X                       /* already established */
X                       c2 = c1;
X                       NEXT;
X                    }
X                }
X            } else if((c1 > SPACE) && (c1 != DEL)) {
X                /* in case of Roman characters */
X                if(shift_mode) { 
X                    c1 |= 0x80;
X                    /* output 1 shifted byte */
X                    if(x0201_f && (!iso8859_f||input_mode==X0201) && 
X                            SSP<=c1 && c1<0xe0 ) {
X                        if(dv[(c1-SSP)*2]||ev[(c1-SSP)*2]) {
X                            if((c2 = GETC(f)) == EOF) {
X                                (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
X                                LAST;
X                            } else if(c2==(0xde&0x7f)) { /* 濁点 */
X                                (*oconv)(dv[(c1-SSP)*2],dv[(c1-SSP)*2+1]);
X                                c2=0; 
X                                NEXT;
X                            } else if(c2==(0xdf&0x7f)&&ev[(c1-SSP)*2]) {  
X                                /* 半濁点 */
X                                (*oconv)(ev[(c1-SSP)*2],ev[(c1-SSP)*2+1]);
X                                c2=0; 
X                                NEXT;
X                            }
X                            UNGETC(c2,f); c2 = 0;
X                        }
X                        (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
X                        NEXT;
X                    } else
X                        SEND;
X                } else if(c1 == '(' && broken_f && input_mode == X0208
X                        && !mime_mode ) {
X                    /* Try to recover missing escape */
X                    if((c1 = GETC(f)) == EOF) {
X                        (*oconv)(0, '(');
X                        LAST;
X                    } else {
X                        if(c1 == 'B' || c1 == 'J' || c1 == 'H') {
X                            input_mode = ASCII; shift_mode = FALSE;
X                            NEXT;
X                        } else {
X                            (*oconv)(0, '(');
X                            /* do not modify various input_mode */
X                            /* It can be vt100 sequence */
X                            SEND;
X                        }
X                    }
X                } else if(input_mode == X0208) {
X                    /* in case of Kanji shifted */
X                    c2 = c1;
X                    NEXT;
X                    /* goto next_byte */
X                } else if(c1 == '=' && mime_f && !mime_mode ) {
X                    if((c1 = getc(f)) == EOF) {
X                        (*oconv)(0, '=');
X                        LAST;
X                    } else if(c1 == '?') {
X                        /* =? is mime conversiooon start sequence */
X                        if(mime_begin(f) == EOF) /* check in detail */
X                            LAST;
X                        else
X                            NEXT;
X                    } else {
X                        (*oconv)(0, '=');
X                        ungetc(c1,f);
X                        NEXT;
X                    }
X                } else if(c1 == '$' && broken_f && !mime_mode) {
X                    /* try to recover missing escape */
X                    if((c1 = GETC(f)) == EOF) {
X                        (*oconv)(0, '$');
X                        LAST;
X                    } else if(c1 == '@'|| c1 == 'B') {
X                        /* in case of Kanji in ESC sequence */
X                        input_mode = X0208;
X                        shift_mode = FALSE;
X                        NEXT;
X                    } else {
X                        /* sorry */
X                        (*oconv)(0, '$');
X                        (*oconv)(0, c1);
X                        NEXT;
X                    }
X                } else
X                    SEND;
X            } else if(c1 == SI) {
X                shift_mode = FALSE; 
X                NEXT;
X            } else if(c1 == SO) {
X                shift_mode = TRUE; 
X                NEXT;
X            } else if(c1 == ESC ) {
X                if((c1 = GETC(f)) == EOF) {
X                    (*oconv)(0, ESC);
X                    LAST;
X                } else if(c1 == '$') {
X                    if((c1 = GETC(f)) == EOF) {
X                        (*oconv)(0, ESC);
X                        (*oconv)(0, '$');
X                        LAST;
X                    } else if(c1 == '@'|| c1 == 'B') {
X                        /* This is kanji introduction */
X                        input_mode = X0208;
X                        shift_mode = FALSE;
X                        NEXT;
X                    } else if(c1 == '(') {
X			if((c1 = GETC(f)) == EOF) {
X			    (*oconv)(0, ESC);
X			    (*oconv)(0, '$');
X			    (*oconv)(0, '(');
X			    LAST;
X			} else if(c1 == '@'|| c1 == 'B') {
X			    /* This is kanji introduction */
X			    input_mode = X0208;
X			    shift_mode = FALSE;
X			    NEXT;
X			} else {
X			    (*oconv)(0, ESC);
X			    (*oconv)(0, '$');
X			    (*oconv)(0, '(');
X			    (*oconv)(0, c1);
X			    NEXT;
X			}
X                    } else if(broken_f&0x2) {
X                        input_mode = X0208;
X                        shift_mode = FALSE;
X                        NEXT;
X                    } else {
X                        (*oconv)(0, ESC);
X                        (*oconv)(0, '$');
X                        (*oconv)(0, c1);
X                        NEXT;
X                    }
X                } else if(c1 == '(') {
X                    if((c1 = GETC(f)) == EOF) {
X                        (*oconv)(0, ESC);
X                        (*oconv)(0, '(');
X                        LAST;
X                    } else {
X                        if(c1 == 'I') {
X                            /* This is X0201 kana introduction */
X                            input_mode = X0201; shift_mode = X0201;
X                            NEXT;
X                        } else if(c1 == 'B' || c1 == 'J' || c1 == 'H') {
X                            /* This is X0208 kanji introduction */
X                            input_mode = ASCII; shift_mode = FALSE;
X                            NEXT;
X                        } else if(broken_f&0x2) {
X                            input_mode = ASCII; shift_mode = FALSE;
X                            NEXT;
X                        } else {
X                            (*oconv)(0, ESC);
X                            (*oconv)(0, '(');
X                            /* maintain various input_mode here */
X                            SEND;
X                        }
X                    }
X                } else {
X                    /* lonely ESC  */
X                    (*oconv)(0, ESC);
X                    SEND;
X                }
X            } else if(c1 == NL && broken_f&4) {
X                input_mode = ASCII; 
X                SEND;
X            } else
X                SEND;
X        }
X        /* send: */
X        if(input_mode == X0208) 
X            (*oconv)(c2, c1);  /* this is JIS, not SJIS/EUC case */
X        else
X            (*iconv)(c2, c1);  /* can be EUC/SJIS */
X        c2 = 0;
X        continue;
X        /* goto next_word */
X    }
X
X    /* epilogue */
X    (*iconv)(EOF, 0);
X    return 1;
}
X
X
X
X
int
h_conv(f, c2, c1)
X    FILE  *f;
X    int    c1,
X                    c2;
{
X    int    wc;
X
X
X    /** it must NOT be in the kanji shifte sequence      */
X    /** it must NOT be written in JIS7                   */
X    /** and it must be after 2 byte 8bit code            */
X
X    hold_count = 0;
X    push_hold_buf(c2, c1);
X    c2 = 0;
X
X    while ((c1 = GETC(f)) != EOF) {
X        if(c2) {
X            /* second byte */
X            if(!estab_f) {
X                /* not established */
X                if(c1 > SSP) {
X                    /* it is still ambiguious yet */
X                    SEND;
X                } else if(c1 < AT) {
X                    /* ignore bogus first byte */
X                    c2 = 0;
X                    SEND;
X                } else {
X                    /* now established */
X                    /* it seems to be MS Kanji */
X                    estab_f = TRUE;
X                    iconv = s_iconv;
X                    SEND;
X                }
X            } else
X                SEND;
X        } else {
X            /* First byte */
X            if(c1 > DEL) {
X                /* 8th bit is on */
X                if(c1 < SSP) {
X                    /* it seems to be MS Kanji */
X                    estab_f = TRUE;
X                    iconv = s_iconv;
X                } else if(c1 < 0xe0) {
X                    /* it seems to be EUC */
X                    estab_f = TRUE;
X                    iconv = oconv;
X                } else {
X                    /* still ambiguious */
X                }
X                c2 = c1;
X                NEXT;
X            } else
X            /* 7 bit code , then send without any process */
X                SEND;
X        }
X        /* send: */
X        if((push_hold_buf(c2, c1) == EOF) || estab_f)
X            break;
X        c2 = 0;
X        continue;
X    }
X
X    /** now,
X     ** 1) EOF is detected, or
X     ** 2) Code is established, or
X     ** 3) Buffer is FULL (but last word is pushed)
X     **
X     ** in 1) and 3) cases, we continue to use
X     ** Kanji codes by oconv and leave estab_f unchanged.
X     **/
X
X    for (wc = 0; wc < hold_count; wc += 2) {
X        c2 = hold_buf[wc];
X        c1 = hold_buf[wc+1];
X        (*iconv)(c2, c1);
X    }
X    return;
}
X
X
X
int
push_hold_buf(c2, c1)
X    int             c2,
X                    c1;
{
X    if(hold_count >= HOLD_SIZE*2)
X        return (EOF);
X    hold_buf[hold_count++] = c2;
X    hold_buf[hold_count++] = c1;
X    return ((hold_count >= HOLD_SIZE*2) ? EOF : hold_count);
}
X
X
int
s_iconv(c2, c1)
X    int    c2,
X                    c1;
{
X    if((c2 == EOF) || (c2 == 0)) {
X        /* NOP */
X    } else {
X        c2 = c2 + c2 - ((c2 <= 0x9f) ? SJ0162 : SJ6394);
X        if(c1 < 0x9f)
X            c1 = c1 - ((c1 > DEL) ? SPACE : 0x1f);
X        else {
X            c1 = c1 - 0x7e;
X            c2++;
X        }
X    }
X    (*oconv)(c2, c1);
X    return 1;
}
X
X
e_oconv(c2, c1)
X    int    c2,
X                    c1;
{
X    c2 = pre_convert(c1,c2); c1 = c1_return;
X    if(fold_f) {
X        switch(line_fold(c2,c1)) {
X            case '\n': 
X                if(add_cr == TRUE) {
X                    putchar('\r');
X                    c1 = '\n';
X                }
X                putchar('\n');
X                break;
X            case 0:    return;
X            case '\r': 
X                c1 = '\n'; c2 = 0;
X                break;
X            case '\t': 
X            case ' ': 
X                c1 = ' '; c2 = 0;
X                break;
X        }
X    }
X    if(c2==DOUBLE_SPACE) {
X        putchar(' '); putchar(' ');
X        return;
X    }
X    if(c2 == EOF)
X        return;
X    else if(c2 == 0 && (c1&0x80)) {
X        putchar(SSO); putchar(c1);
X    } else if(c2 == 0) {
X        if(c1 == '\n' && add_cr == TRUE) 
X            putchar('\r');
X        if(c1 != '\r') 
X            putchar(c1);
X        else if(del_cr == FALSE) 
X            putchar(c1);
X    } else {
X        if((c1<0x20 || 0x7e<c1) ||
X           (c2<0x20 || 0x7e<c2)) {
X            estab_f = FALSE;
X            return; /* too late to rescue this char */
X        }
X        putchar(c2 | 0x080);
X        putchar(c1 | 0x080);
X    }
X    return;
}
X
X
X
X
s_oconv(c2, c1)
X    int    c2,
X                    c1;
{
X    c2 = pre_convert(c1,c2); c1 = c1_return;
X    if(fold_f) {
X        switch(line_fold(c2,c1)) {
X            case '\n': 
X                if(add_cr == TRUE) {
X                   putchar('\r');
X                   c1 = '\n';
X                }
X                putchar('\n');
X                break;
X            case '\r': 
X                c1 = '\n'; c2 = 0;
X                break;
X            case 0:    return;
X            case '\t': 
X            case ' ': 
X                c1 = ' '; c2 = 0;
X                break;
X        }
X    }
X    if(c2==DOUBLE_SPACE) {
X        putchar(' '); putchar(' ');
X        return;
X    }
X    if(c2 == EOF)
X        return;
X    else if(c2 == 0) {
X        if(c1 == '\n' && add_cr == TRUE) 
X            putchar('\r');
X        if(c1 != '\r') 
X            putchar(c1);
X        else if(del_cr == FALSE) 
X            putchar(c1);
X    } else {
X        if((c1<0x20 || 0x7e<c1) ||
X           (c2<0x20 || 0x7e<c2)) {
X            estab_f = FALSE;
X            return; /* too late to rescue this char */
X        }
X        putchar((((c2 - 1) >> 1) + ((c2 <= 0x5e) ? 0x71 : 0xb1)));
X        putchar((c1 + ((c2 & 1) ? ((c1 < 0x60) ? 0x1f : 0x20) : 0x7e)));
X    }
X    return;
}
X
j_oconv(c2, c1)
X    int    c2,
X                    c1;
{
X    c2 = pre_convert(c1,c2); c1 = c1_return;
X    if(fold_f) {
X        switch(line_fold(c2,c1)) {
X            case '\n': 
X                if(output_mode) {
X                    putchar(ESC);
X                    putchar('(');
X                    putchar(ascii_intro);
X                }
X                if(add_cr == TRUE) {
X                    putchar('\r');
X                    c1 = '\n';
X                }
X                putchar('\n');
X                output_mode = ASCII;
X                break;
X            case '\r': 
X                c1 = '\n'; c2 = 0;
X                break;
X            case '\t': 
X            case ' ': 
X                c1 = ' '; c2 = 0;
X                break;
X            case 0:    return;
X        }
X     }
X    if(c2 == EOF) {
X        if(output_mode) {
X            putchar(ESC);
X            putchar('(');
X            putchar(ascii_intro);
X        }
X    } else if(c2 == 0 && (c1 & 0x80)) {
X        if(input_mode==X0201 || !iso8859_f) {
X            if(output_mode!=X0201) {
X                putchar(ESC);
X                putchar('(');
X                putchar('I');
X                output_mode = X0201;
X            }
X            c1 &= 0x7f;
X        } else {
X            /* iso8859 introduction, or 8th bit on */
X            /* Can we convert in 7bit form using ESC-'-'-A ? 
X               Is this popular? */
X        }
X        putchar(c1);
X    } else if(c2 == 0) {
X        if(output_mode) {
X            putchar(ESC);
X            putchar('(');
X            putchar(ascii_intro);
X            output_mode = ASCII;
X        }
X        if(c1 == '\n' && add_cr == TRUE) 
X            putchar('\r');
X        if(c1 != '\r') 
X            putchar(c1);
X        else if(del_cr == FALSE) 
X            putchar(c1);
X    } else if(c2 == DOUBLE_SPACE) {
X        if(output_mode) {
X            putchar(ESC);
X            putchar('(');
X            putchar(ascii_intro);
X            output_mode = ASCII;
X        }
X        putchar(' ');
X        if(c1 == '\n' && add_cr == TRUE) 
X            putchar('\r');
X        if(c1 != '\r') 
X            putchar(c1);
X        else if(del_cr == FALSE) 
X            putchar(c1);
X    } else {
X        if(output_mode != X0208) {
X            putchar(ESC);
X            putchar('$');
X            putchar(kanji_intro);
X            output_mode = X0208;
X        }
X        if(c1<0x20 || 0x7e<c1) 
X            return;
X        if(c2<0x20 || 0x7e<c2) 
X            return;
X        putchar(c2);
X        if(c1 == '\n' && add_cr == TRUE) 
X            putchar('\r');
X        if(c1 != '\r') 
X            putchar(c1);
X        else if(del_cr == FALSE) 
X            putchar(c1);
X    }
X    return;
}
X
X
X
#define rot13(c)  ( \
X      ( c < 'A' ) ? c: \
X      (c <= 'M')  ? (c + 13): \
X      (c <= 'Z')  ? (c - 13): \
X      (c < 'a')   ? (c): \
X      (c <= 'm')  ? (c + 13): \
X      (c <= 'z')  ? (c - 13): \
X      (c) \
)
X
#define  rot47(c) ( \
X      ( c < '!' ) ? c: \
X      ( c <= 'O' ) ? (c + 47) : \
X      ( c <= '~' ) ?  (c - 47) : \
X      c \
)
X
X
/* 
X  Return value of line_fold()
X
X       \n  add newline  and output char
X       \r  add newline  and output nothing
X       ' ' space
X       0   skip  
X       1   (or else) normal output 
X
X  fold state in prev (previous character)
X
X      >0x80 Japanese (X0208/X0201)
X      <0x80 ASCII
X      \n    new line 
X      ' '   space
X
X  This fold algorthm does not preserve heading space in a line.
X  This is the main difference from fmt.
*/
X
int
line_fold(c2,c1) 
int c2,c1;
{ 
X    int prev0;
X    if(c1=='\r') 
X        return 0;               /* ignore cr */
X    if(c1== 8) {
X        if(line>0) line--;
X        return 1;
X    }
X    if(c2==EOF && line != 0)    /* close open last line */
X        return '\n';
X    /* new line */
X    if(c1=='\n') {
X        if(prev == c1) {        /* duplicate newline */
X            if(line) {
X                line = 0;
X                return '\n';    /* output two newline */
X            } else {
X                line = 0;
X                return 1;
X            }
X        } else  {
X            if(prev&0x80) {     /* Japanese? */
X                prev = c1;
X                return 0;       /* ignore given single newline */
X            } else if(prev==' ') {
X                return 0;
X            } else {
X                prev = c1;
X                if(++line<=fold_len) 
X                    return ' ';
X                else {
X                    line = 0;
X                    return '\r';        /* fold and output nothing */
X                }
X            }
X        }
X    }
X    if(c1=='\f') {
X        prev = '\n';
X        if(line==0)
X            return 1;
X        line = 0;
X        return '\n';            /* output newline and clear */
X    }
X    /* X0208 kankaku or ascii space */
X    if( (c2==0&&c1==' ')||
X        (c2==0&&c1=='\t')||
X        (c2==DOUBLE_SPACE)||
X        (c2=='!'&& c1=='!')) {
X        if(prev == ' ') {
X            return 0;           /* remove duplicate spaces */
X        } 
X        prev = ' ';    
X        if(++line<=fold_len) 
X            return ' ';         /* output ASCII space only */
X        else {
X            prev = ' '; line = 0;
X            return '\r';        /* fold and output nothing */
X        }
X    } 
X    prev0 = prev; /* we still need this one... , but almost done */
X    prev = c1;
X    if(c2 || (SSP<=c1 && c1<=0xdf)) 
X        prev |= 0x80;  /* this is Japanese */
X    line += (c2==0)?1:2;
X    if(line<=fold_len) {   /* normal case */
X        return 1;
X    }
X    if(line>=fold_len+FOLD_MARGIN) { /* too many kinsou suspension */
X        line = (c2==0)?1:2;
X        return '\n';       /* We can't wait, do fold now */
X    }
X    /* simple kinsoku rules  return 1 means no folding  */
X    if(c2==0) {
X        if(c1==0xde) return 1; /* ゛*/
X        if(c1==0xdf) return 1; /* ゜*/
X        if(c1==0xa4) return 1; /* 。*/
X        if(c1==0xa3) return 1; /* ，*/
X        if(c1==0xa1) return 1; /* 」*/
X        if(c1==0xb0) return 1; /* - */
X        if(SSP<=c1 && c1<=0xdf) {               /* X0201 */
X            line = 1;
X            return '\n';/* add one new line before this character */
X        }
X        /* fold point in ASCII { [ ( */
X        if(( c1!=')'&&
X             c1!=']'&&
X             c1!='}'&&
X             c1!='.'&&
X             c1!=','&&
X             c1!='!'&&
X             c1!='?'&&
X             c1!='/'&&
X             c1!=':'&&
X             c1!=';')&&
X            ((prev0=='\n')|| (prev0==' ')||     /* ignored new line */
X            (prev0&0x80))                       /* X0208 - ASCII */
X            ) {
X            line = 1;
X            return '\n';/* add one new line before this character */
X        }
X        return 1;  /* default no fold in ASCII */
X    } else {
X        if(c2=='!') {
X            if(c1=='"')  return 1; /* 、 */
X            if(c1=='#')  return 1; /* 。 */
X            if(c1=='$')  return 1; /* ， */
X            if(c1=='%')  return 1; /* ． */
X            if(c1=='\'') return 1; /* ＋ */
X            if(c1=='(')  return 1; /* ； */
X            if(c1==')')  return 1; /* ？ */
X            if(c1=='*')  return 1; /* ！ */
X            if(c1=='+')  return 1; /* ゛ */
X            if(c1==',')  return 1; /* ゜ */
X        }
X        line = 2;
X        return '\n'; /* add one new line before this character */
X    }
}
X
int
pre_convert(c1,c2)
int c1,c2;
{
X        if(c2) c1 &= 0x7f;
X        c1_return = c1;
X        if(c2==EOF) return c2;
X        c2 &= 0x7f;
X        if(rot_f) {
X            if(c2) {
X                c1 = rot47(c1);
X                c2 = rot47(c2);
X            } else {
X                if(!(c1 & 0x80)) 
X                    c1 = rot13(c1);
X            }
X            c1_return = c1;
X        }
X        /* JISX0208 Alphabet */
X        if(alpha_f && c2 == 0x23 ) return 0; 
X        /* JISX0208 Kigou */
X        if(alpha_f && c2 == 0x21 ) { 
X           if(0x21==c1) {
X               if(alpha_f&0x2) {
X                   c1_return = ' ';
X                   return 0;
X               } else if(alpha_f&0x4) {
X                   c1_return = ' ';
X                   return DOUBLE_SPACE;
X               } else {
X                   return c2;
X               }
X           } else if(0x20<c1 && c1<0x7f && fv[c1-0x20]) {
X               c1_return = fv[c1-0x20];
X               return 0;
X           } 
X        }
X        return c2;
}
X
X
#ifdef STRICT_MIME
/* This converts  =?ISO-2022-JP?B?HOGE HOGE */
X
unsigned char *mime_pattern[] = {
X   (unsigned char *)"\075?ISO-8859-1?Q?",
X   (unsigned char *)"\075?ISO-2022-JP?B?",
X   (unsigned char *)"\075?ISO-2022-JP?Q?",
X   (unsigned char *)"\075?JAPANESE_EUC?B?",
X   (unsigned char *)"\075?SHIFT_JIS?B?",
X   NULL
};
X
int      mime_encode[] = {
X    'Q', 'B', 'Q',
X    0
};
#endif
X
#define MAXRECOVER 20
int iso8859_f_save;
X
#ifdef STRICT_MIME
X
#define nkf_toupper(c)  (('a'<=c && c<='z')?(c-('a'-'A')):c)
/* I don't trust portablity of toupper */
X
int
mime_begin(f)
FILE *f;
{
X    int c1;
X    int i,j,k;
X    unsigned char *p,*q;
X    int r[MAXRECOVER];    /* recovery buffer, max mime pattern lenght */
X
X    mime_mode = FALSE;
X    /* =? has been checked   */
X    j = 0;
X    p = mime_pattern[j];
X    r[0]='='; r[1]='?';
X
X    for(i=2;p[i]>' ';i++) {                   /* start at =? */
X        if( ((r[i] = c1 = getc(f))==EOF) || nkf_toupper(c1) != p[i] ) {
X            /* pattern fails, try next one */
X            q = p;
X            while (p = mime_pattern[++j]) {
X                for(k=2;k<i;k++)              /* assume length(p) > i */
X                    if(p[k]!=q[k]) break;
X                if(k==i && nkf_toupper(c1)==p[k]) break;
X            }
X            if(p) continue;  /* found next one, continue */
X            /* all fails, output from recovery buffer */
X            ungetc(c1,f);
X            for(j=0;j<i;j++) {
X                (*oconv)(0,r[j]);
X            }
X            return c1;
X        }
X    }
X    mime_mode = mime_encode[j];
X    iso8859_f_save = iso8859_f;
X    if(j==0) {
X        iso8859_f = TRUE;
X    }
X    if(mime_mode=='B') {
X        mimebuf_f = unbuf_f;
X        if(!unbuf_f) {
X            /* do MIME integrity check */
X            return mime_integrity(f,mime_pattern[j]);
X        } 
X    }
X    mimebuf_f = TRUE;
X    return c1;
}
X
#define mime_getc0(f)   (mimebuf_f?getc(f):Fifo(mime_input++))
#define mime_ungetc0(c,f) (mimebuf_f?ungetc(c,f):mime_input--)
X
#else
int
mime_begin(f)
FILE *f;
{
X    int c1;
X    int i,j,k;
X    int r[MAXRECOVER];    /* recovery buffer, max mime pattern lenght */
X
X    mime_mode = FALSE;
X    /* =? has been checked   */
X    j = 0;
X    r[0]='='; r[1]='?';
X    for(i=2;i<MAXRECOVER;i++) {                   /* start at =? */
X	/* We accept any charcter type even if it is breaked by new lines */
X        if( (r[i] = c1 = getc(f))==EOF) break;
X	if(c1=='=') break;
X	if(c1<' '&& c1!='\r' && c1!='\n') break;
X	if(!(('A'<=c1&&c1<='Z')||('a'<=c1&&c1<='z')||('0'<=c1&&c1<='9')
X	    ||c1=='_'||c1=='-'||c1=='?')) break;
X	if(c1=='?') {
X	    i++;
X	    if(!(i<MAXRECOVER) || (r[i] = c1 = getc(f))==EOF) break;
X	    if(c1=='b'||c1=='B') {
X		mime_mode = 'B';
X	    } else if(c1=='q'||c1=='Q') {
X		mime_mode = 'Q';
X	    } else {
X		break;
X	    }
X	    i++;
X	    if(!(i<MAXRECOVER) || (r[i] = c1 = getc(f))==EOF) break;
X	    if(c1=='?') {
X		break;
X	    } else {
X		mime_mode = FALSE;
X	    }
X	    break;
X	}
X    }
X    if(!mime_mode || c1==EOF || i==MAXRECOVER) {
X	ungetc(c1,f);
X	for(j=0;j<i;j++) {
X	    (*oconv)(0,r[j]);
X	}
X	return c1;
X    }
X    iso8859_f_save = iso8859_f;
X    /* do no MIME integrity check */
X    return c1;   /* used only for checking EOF */
}
X
#define mime_getc0(f)   getc(f)
#define mime_ungetc0(c,f) ungetc(c,f)
X
#endif
X
int 
mime_getc(f)
FILE *f;
{
X    int c1, c2, c3, c4, cc;
X    int t1, t2, t3, t4, mode, exit_mode;
X
X    if(mime_top != mime_last) {  /* Something is in FIFO */
X        return  Fifo(mime_top++);
X    }
X
X    if(mimebuf_f == FIXED_MIME)
X        exit_mode = mime_mode;
X    else
X        exit_mode = FALSE;
X    if(mime_mode == 'Q') {
X        if((c1 = mime_getc0(f)) == EOF) return (EOF);
X        if(c1=='_') return ' ';
X        if(c1!='=' && c1!='?') 
X            return c1;
X        mime_mode = exit_mode; /* prepare for quit */
X        if(c1<=' ') return c1;
X        if((c2 = mime_getc0(f)) == EOF) return (EOF);
X        if(c2<=' ') return c2;
X        if(c1=='?'&&c2=='=') {
X            /* end Q encoding */
X            input_mode = exit_mode;
X            iso8859_f = iso8859_f_save;
X            return getc(f);
X        }
X        if(c1=='?') {
X            mime_mode = 'Q'; /* still in MIME */
X            mime_ungetc0(c2,f);
X            return c1;
X        }
X        if((c3 = mime_getc0(f)) == EOF) return (EOF);
X        if(c2<=' ') return c2;
X        mime_mode = 'Q'; /* still in MIME */
#define hex(c)   (('0'<=c&&c<='9')?(c-'0'):\
X     ('A'<=c&&c<='F')?(c-'A'+10):('a'<=c&&c<='f')?(c-'a'+10):0)
X        return ((hex(c2)<<4) + hex(c3));
X    }
X
X    if(mime_mode != 'B') {
X        mime_mode = FALSE;
X        return getc(f);
X    }
X
X
X    /* Base64 encoding */
X    /* 
X        MIME allows line break in the middle of 
X        Base64, but we are very pessimistic in decoding
X        in unbuf mode because MIME encoded code may broken by 
X        less or editor's control sequence (such as ESC-[-K in unbuffered
X        mode. ignore incomplete MIME.
X    */
X    mode = mime_mode;
X    mime_mode = exit_mode;  /* prepare for quit */
X
X    while ((c1 = mime_getc0(f))<=' ') {
X        if(c1==EOF)
X            return (EOF);
X    }
X    if((c2 = mime_getc0(f))<=' ') {
X        if(c2==EOF)
X            return (EOF);
X        if(mimebuf_f!=FIXED_MIME) input_mode = ASCII;  
X        return c2;
X    }
X    if((c1 == '?') && (c2 == '=')) {
X        input_mode = ASCII;
X        while((c1 =  getc(f))==' ' /* || c1=='\n' || c1=='\r' */);
X        return c1;
X    }
X    if((c3 = mime_getc0(f))<=' ') {
X        if(c3==EOF)
X            return (EOF);
X        if(mimebuf_f!=FIXED_MIME) input_mode = ASCII;  
X        return c3;
X    }
X    if((c4 = mime_getc0(f))<=' ') {
X        if(c4==EOF)
X            return (EOF);
X        if(mimebuf_f!=FIXED_MIME) input_mode = ASCII;  
X        return c4;
X    }
X
X    mime_mode = mode; /* still in MIME sigh... */
X
X    /* BASE 64 decoding */
X
X    t1 = 0x3f & base64decode(c1);
X    t2 = 0x3f & base64decode(c2);
X    t3 = 0x3f & base64decode(c3);
X    t4 = 0x3f & base64decode(c4);
X    cc = ((t1 << 2) & 0x0fc) | ((t2 >> 4) & 0x03);
X    if(c2 != '=') {
X        Fifo(mime_last++) = cc;
X        cc = ((t2 << 4) & 0x0f0) | ((t3 >> 2) & 0x0f);
X        if(c3 != '=') {
X            Fifo(mime_last++) = cc;
X            cc = ((t3 << 6) & 0x0c0) | (t4 & 0x3f);
X            if(c4 != '=') 
X                Fifo(mime_last++) = cc;
X        }
X    } else {
X        return c1;
X    }
X    return  Fifo(mime_top++);
}
X
int
mime_ungetc(c) 
unsigned int   c;
{
X    Fifo(mime_last++) = c;
X    return c;
}
X
#ifdef STRICT_MIME
int
mime_integrity(f,p)
FILE *f;
unsigned char *p;
{
X    int c,d;
X    unsigned int q;
X    /* In buffered mode, read until =? or NL or buffer fffull
X     */
X    mime_input = mime_top;
X    mime_last = mime_top;
X    while(*p) Fifo(mime_input++) = *p++;
X    d = 0;
X    q = mime_input;
X    while((c=getc(f))!=EOF) {
X        if(((mime_input-mime_top)&MIME_BUF_MASK)==0) break;
X        if(c=='=' && d=='?') {
X            /* checked. skip header, start decode */
X            Fifo(mime_input++) = c;
X            mime_input = q; 
X            return 1;
X        }
X        if(!( (c=='+'||c=='/'|| c=='=' || c=='?' ||
X            ('a'<=c && c<='z')||('A'<= c && c<='Z')||('0'<=c && c<='9'))))
X            break;
X        /* Should we check length mod 4? */
X        Fifo(mime_input++) = c;
X        d=c;
X    }
X    /* In case of Incomplete MIME, no MIME decode  */
X    Fifo(mime_input++) = c;
X    mime_last = mime_input;     /* point undecoded buffer */
X    mime_mode = 1;              /* no decode on Fifo last in mime_getc */
X    return 1;
}
#endif
X
int
base64decode(c)
X    int            c;
{
X    int             i;
X    if(c > '@')
X        if(c < '[')
X            i = c - 'A';                        /* A..Z 0-25 */
X        else
X            i = c - 'G'     /* - 'a' + 26 */ ;  /* a..z 26-51 */
X    else if(c > '/')
X        i = c - '0' + '4'   /* - '0' + 52 */ ;  /* 0..9 52-61 */
X    else if(c == '+')
X        i = '>'             /* 62 */ ;          /* +  62 */
X    else
X        i = '?'             /* 63 */ ;          /* / 63 */
X    return (i);
}
X
void 
reinit()
{
X    unbuf_f = FALSE;
X    estab_f = FALSE;
X    nop_f = FALSE;
X    binmode_f = TRUE;       
X    rot_f = FALSE;         
X    input_f = FALSE;      
X    alpha_f = FALSE;     
X    mime_f = TRUE;      
X    mimebuf_f = FALSE; 
X    broken_f = FALSE;  
X    iso8859_f = FALSE; 
X    x0201_f = TRUE;    
X    x0201_f = NO_X0201; 
X    fold_f  = FALSE;
X    kanji_intro = DEFAULT_J;
X    ascii_intro = DEFAULT_R;
X    oconv = DEFAULT_CONV; 
X    output_mode = ASCII;
X    input_mode =  ASCII;
X    shift_mode =  FALSE;
X    mime_mode =   FALSE;
X    file_out = FALSE;
X    add_cr = FALSE;
X    del_cr = FALSE;
}
X
#ifndef PERL_XS
int 
usage()   
{
X    fprintf(stderr,"USAGE:  nkf(nkf32,wnkf,nkf2) -[flags] [in file] .. [out file for -O flag]\n");
X    fprintf(stderr,"Flags:\n");
X    fprintf(stderr,"b,u      Output is bufferred (DEFAULT),Output is unbufferred\n");
#ifdef DEFAULT_CODE_SJIS
X    fprintf(stderr,"j,s,e    Outout code is JIS 7 bit, Shift JIS (DEFAULT), AT
&T JIS (EUC)\n");
#endif
#ifdef DEFAULT_CODE_JIS
X    fprintf(stderr,"j,s,e    Outout code is JIS 7 bit (DEFAULT), Shift JIS, AT&T JIS (EUC)\n");
#endif
#ifdef DEFAULT_CODE_EUC
X    fprintf(stderr,"j,s,e    Outout code is JIS 7 bit, Shift JIS, AT&T JIS (EU
C) (DEFAULT)\n");
#endif
X    fprintf(stderr,"J,S,E    Input assumption is JIS 7 bit , Shift JIS, AT&T JIS (EUC)\n");
X    fprintf(stderr,"t        no conversion\n");
X    fprintf(stderr,"i_       Output sequence to designate JIS-kanji (DEFAULT B)\n");
X    fprintf(stderr,"o_       Output sequence to designate ASCII (DEFAULT B)\n"
);
X    fprintf(stderr,"r        {de/en}crypt ROT13/47\n");
X    fprintf(stderr,"v        Show this usage\n");
X    fprintf(stderr,"m[BQ0]   MIME decode [B:base64,Q:quoted,0:no decode]\n");
X    fprintf(stderr,"l        ISO8859-1 (Latin-1) support\n");
X    fprintf(stderr,"f        Folding: -f60 or -f\n");
X    fprintf(stderr,"Z[0-2]   Convert X0208 alphabet to ASCII  1: Kankaku to space,2: 2 spaces\n");
X    fprintf(stderr,"X,x      Assume X0201 kana in MS-Kanji, -x preserves X0201 \n");
X    fprintf(stderr,"B[0-2]   Broken input  0: missing ESC,1: any X on ESC-[($]-X,2: ASCII on NL\n");
#ifdef MSDOS
X    fprintf(stderr,"T        Text mode output\n");
#endif
X    fprintf(stderr,"O        Output to File (DEFAULT 'nkf.out')\n");
X    fprintf(stderr,"d,c      Delete \\r in line feed, Add \\r in line feed\n")
;
X    fprintf(stderr,"Network Kanji Filter Version %s (%s) "
#if defined(MSDOS) && !defined(_Windows)
X                  "for DOS"
#endif
#if !defined(__WIN32__) && defined(_Windows)
X                  "for Win16"
#endif
#if defined(__WIN32__) && defined(_Windows)
X                  "for Win32"
#endif
#ifdef __OS2__
X                  "for OS/2"
#endif
X                  ,Version,Patchlevel);
X    fprintf(stderr,"\n%s\n",CopyRight);
X    return 0;
}
#endif
X
/**
X ** パッチ制作者
X **  void@merope.pleiades.or.jp (Kusakabe Youichi)
X **  NIDE Naoyuki <nide@ics.nara-wu.ac.jp>
X **  ohta@src.ricoh.co.jp (Junn Ohta)
X **  inouet@strl.nhk.or.jp (Tomoyuki Inoue)
X **  kiri@pulser.win.or.jp (Tetsuaki Kiriyama)
X **  Kimihiko Sato <sato@sail.t.u-tokyo.ac.jp>
X **  a_kuroe@kuroe.aoba.yokohama.jp (Akihiko Kuroe)
X **  kono@ie.u-ryukyu.ac.jp (Shinji Kono)
X **  GHG00637@nifty-serve.or.jp (COW)
X **
X ** 最終更新日
X **  1998.11.16
X **/
X
/* end */
SHAR_EOF
  $shar_touch -am 1116192198 'nkf.c' &&
  chmod 0644 'nkf.c' ||
  $echo 'restore of' 'nkf.c' 'failed'
  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
    || $echo 'nkf.c:' 'MD5 check failed'
f22548c7ba685348f7a5a53449740389  nkf.c
SHAR_EOF
  else
    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'nkf.c'`"
    test 56296 -eq "$shar_count" ||
    $echo 'nkf.c:' 'original size' '56296,' 'current size' "$shar_count!"
  fi
fi
# ============= nkf_test.pl ==============
if test -f 'nkf_test.pl' && test "$first_param" != -c; then
  $echo 'x -' SKIPPING 'nkf_test.pl' '(file already exists)'
else
  $echo 'x -' extracting 'nkf_test.pl' '(text)'
  sed 's/^X//' << 'SHAR_EOF' > 'nkf_test.pl' &&
#!/usr/local/bin/perl
#
# nkf test program for nkf 1.7
#    Shinji KONO <kono@ie.u-ryukyu.ac.jp>
# Sun Aug 18 12:25:40 JST 1996
# Sun Nov  8 00:16:06 JST 1998
#
# This is useful when you add new patch on nkf.
# Since this test is too strict, faileurs may not mean
# wrong conversion. 
#
# nkf 1.5 differs on MIME decoding
# nkf 1.4 passes Basic Conversion tests
# nkf PDS version passes Basic Conversion tests  using "nkf -iB -oB "
#
X
$nkf = "./nkf";
# $nkf = "doscmd nkf.exe";
X
# If you want to see the testing process, set next flag.
X
$detail_all = 0;
X
# &library_test0();
sub test  {
#    use NKF;
#    &library_test(@_);
X    &command_test(@_);
}
X
sub command_test {
X    local ($nkf,$in,$ans,$detail) = @_;
X    local ($result);
X
X    $result = '';
X    open(OUT,"> nkf.in");
X    print OUT $in;
X    close(OUT);
X    system("$nkf <nkf.in >nkf.out");   # easy
X    open(IN,"< nkf.out");
X    print STDERR "\nINPUT:\n",$in  if ($detail || $detail_all);
X    print STDERR "\nEXPECT:\n", $ans if ($detail || $detail_all);
X    while(<IN>) {
X	$result .= $_;
X    }
X    print STDERR "\nGOT:\n",$result if ($detail || $detail_all);
X    print (($result eq $ans)?"Ok\n":"Fail\n");
X    return $result;
}
X
sub library_test {
X    local ($nkf,$in,$ans,$detail) = @_;
X    local ($result);
X
X
X    $nkf =~ s/^[^_]* //;
X    print "\nINPUT:\n",$in  if ($detail || $detail_all);
X    print "\nEXPECT:\n", $ans if ($detail || $detail_all);
X    $result = NKF::nkf($nkf,$in);
X    print "\nGOT:\n",$result if ($detail || $detail_all);
X
X    print (($result eq $ans)?"Ok\n":"Fail\n");
X    return $result;
}
X
sub librrary_test0 {
BEGIN { $| = 1; print "1..3\n"; }
END {print "not ok 1\n" unless $loaded;}
X    use NKF;
X    $loaded = 1;
X    print "ok 1\n";
X
X    ######################### End of black magic.
X
X    # Insert your test code below (better if it prints "ok 13"
X    # (correspondingly "not ok 13") depending on the success of chunk 13
X    # of the test code):
X
X    if ( nkf("-m","-e","1") ) {
X	print "ok 2\n";
X    } else {
X	print "no 2\n";
X    }
X
X    $output = nkf("\033\$@#1#3#2%B");
X    if ($output) {
X    # print $output,"\n";
X	print "ok 3\n";
X    } else {
X	print "no 3\n";
X    }
X
X    $output = nkf("-Zj","\033\$@#1#3#2%B");
X    if ($output) {
X    # print $output,"\n";
X	print "ok 4\n";
X    } else {
X	print "no 4\n";
X    }
X
X    # conversion makes strings longer
X    $output = "\244\306 " x 1024;
X	$old =  length($output);
X    $output = nkf("-j",$output);
X    if ($output) {
X    # print $output,"\n";
X	print "ok 5 $old ",length($output),"\n";
X    } else {
X	print "no 5\n";
X    }
X
X
}
X
# Basic Conversion
print "\nBasic Conversion test\n\n";
X
# I gave up simple literal quote because there are big difference
# on perl4 and perl5 on literal quote. Of course we cannot use
# jperl.
X
$example{'jis'} = unpack('u',<<'eofeof');
M1FER<W0@4W1A9V4@&R1"(3DQ(3%^2R%+?D]3&RA"(%-E8V]N9"!3=&%G92`;
M)$)0)TU:&RA"($AI<F%G86YA(!LD0B0B)"0D)B0H)"HD;R1R)',;*$(*2V%T
M86MA;F$@&R1")2(E)"4F)2@E*B5O)7(E<QLH0B!+:6=O=2`;)$(A)B%G(S`C
/029!)E@G(B=!*$`;*$(*
eofeof
X
$example{'sjis'} = unpack('u',<<'eofeof');
M1FER<W0@4W1A9V4@@5B)0(F>ED"6GIAR(%-E8V]N9"!3=&%G92"8I9=Y($AI
M<F%G86YA((*@@J*"I(*F@JB"[8+P@O$*2V%T86MA;F$@@T&#0X-%@T>#28./
>@Y*#DR!+:6=O=2"!18&'@D^"8(._@]:$081@A+X*
eofeof
X
$example{'euc'} = unpack('u',<<'eofeof');
M1FER<W0@4W1A9V4@H;FQH;'^RZ'+_L_3(%-E8V]N9"!3=&%G92#0I\W:($AI
M<F%G86YA(*2BI*2DIJ2HI*JD[Z3RI/,*2V%T86MA;F$@I:*EI*6FI:BEJJ7O
>I?*E\R!+:6=O=2"AIJ'GH["CP:;!IMBGHJ?!J,`*
eofeof
X
X
# From JIS
X
print "JIS  to JIS ... ";&test("$nkf   ",$example{'jis'},$example{'jis'});
print "JIS  to SJIS... ";&test("$nkf -s",$example{'jis'},$example{'sjis'});
print "JIS  to EUC ... ";&test("$nkf -e",$example{'jis'},$example{'euc'});
X
# From SJIS
X
print "SJIS to JIS ... ";&test("$nkf -j",$example{'sjis'},$example{'jis'});
print "SJIS to SJIS... ";&test("$nkf -s",$example{'sjis'},$example{'sjis'});
print "SJIS to EUC ... ";&test("$nkf -e",$example{'sjis'},$example{'euc'});
X
# From EUC
X
print "EUC  to JIS ... ";&test("$nkf   ",$example{'euc'},$example{'jis'});
print "EUC  to SJIS... ";&test("$nkf -s",$example{'euc'},$example{'sjis'});
print "EUC  to EUC ... ";&test("$nkf -e",$example{'euc'},$example{'euc'});
X
# Ambigous Case
X
$example{'amb'} = unpack('u',<<'eofeof');
MI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<*PL:7"L+&E
MPK"QI<*PL:7"L+&EPK"QI<(*I<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<*P
ML:7"L+&EPK"QI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<(*I<*PL:7"L+&E
MPK"QI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<*PL:7"
ML+&EPK"QI<(*I<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"Q
MI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<(*I<*PL:7"L+&EPK"QI<*PL:7"
ML+&EPK"QI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<(*
eofeof
X
$example{'amb.euc'} = unpack('u',<<'eofeof');
M&R1")4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25"
M,#$E0C`Q)4(P,25",#$E0C`Q)4(;*$(*&R1")4(P,25",#$E0C`Q)4(P,25"
M,#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(;
M*$(*&R1")4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P
M,25",#$E0C`Q)4(P,25",#$E0C`Q)4(;*$(*&R1")4(P,25",#$E0C`Q)4(P
M,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q
M)4(;*$(*&R1")4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q
>)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(;*$(*
eofeof
X
$example{'amb.sjis'} = unpack('u',<<'eofeof');
M&RA))4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25"
M,#$E0C`Q)4(P,25",#$E0C`Q)4(;*$(*&RA))4(P,25",#$E0C`Q)4(P,25"
M,#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(;
M*$(*&RA))4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P
M,25",#$E0C`Q)4(P,25",#$E0C`Q)4(;*$(*&RA))4(P,25",#$E0C`Q)4(P
M,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q
M)4(;*$(*&RA))4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q
>)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(;*$(*
eofeof
X
print "Ambiguous Case. ";
X    &test("$nkf",$example{'amb'},$example{'amb.euc'});
X
# Input assumption
X
print "SJIS  Input assumption ";
X    &test("$nkf -Sx",$example{'amb'},$example{'amb.sjis'});
X
# X0201 仮名
# X0201->X0208 conversion
# X0208 aphabet -> ASCII
# X0201 相互変換
X
print "\nX0201 test\n\n";
X
$example{'x0201.sjis'} = unpack('u',<<'eofeof');
MD5.*<(-*@TR#3H-0@U*#2X--@T^#48-3"I%3B7""8()A@F*"8X)D@F6"9H*!
M@H*"@X*$@H6"AH*'"I%3BTR-AH%)@9>!E(&0@9.!3X&5@9:!:8%J@7R!>X&!
M@6V!;H%O@7"!CPJ4O(IPMK>X/;FZMMZWWKC>N=ZZWH+&"I2\BG#*W\O?S-_-
MW\[?M]^QW@K*W\O?S`IH86YK86MU(,K?R]_,I`K*W\O?S-VA"I2\BG""S(SC
!"@!"
eofeof
X
$example{'x0201.euc'} = unpack('u',<<'eofeof');
MP;2ST:6KI:VEKZ6QI;.EK*6NI;"ELJ6T"L&TL=&CP:/"H\.CQ*/%H\:CQZ/A
MH^*CXZ/DH^6CYJ/G"L&TM:VYYJ&JH?>A]*'PH?.AL*'UH?:ARJ'+H=VAW*'A
MH<ZASZ'0H=&A[PK(OK/1CK:.MXZX/8ZYCKJ.MH[>CK>.WHZXCMZ.N8[>CKJ.
MWJ3("LB^L]&.RH[?CLN.WX[,CM^.S8[?CLZ.WXZWCM^.L8[>"H[*CM^.RX[?
MCLP*:&%N:V%K=2".RH[?CLN.WX[,CJ0*CLJ.WX[+CM^.S([=CJ$*R+ZST:3.
#N.4*
eofeof
X
$example{'x0201.jis'} = unpack('u',<<'eofeof');
M&R1"030S424K)2TE+R4Q)3,E+"4N)3`E,B4T&RA""ALD0D$T,5$C02-"(T,C
M1"-%(T8C1R-A(V(C8R-D(V4C9B-G&RA""ALD0D$T-2TY9B$J(7<A="%P(7,A
M,"%U(78A2B%+(5TA7"%A(4XA3R%0(5$A;QLH0@H;)$)(/C-1&RA)-C<X&RA"
M/1LH23DZ-EXW7CA>.5XZ7ALD0B1(&RA""ALD0D@^,U$;*$E*7TM?3%]-7TY?
M-U\Q7ALH0@H;*$E*7TM?3!LH0@IH86YK86MU(!LH24I?2U],)!LH0@H;*$E*
97TM?3%TA&RA""ALD0D@^,U$D3CAE&RA""@``
eofeof
X
$example{'x0201.sosi'} = unpack('u',<<'eofeof');
M&R1"030S424K)2TE+R4Q)3,E+"4N)3`E,B4T&RA*"ALD0D$T,5$C02-"(T,C
M1"-%(T8C1R-A(V(C8R-D(V4C9B-G&RA*"ALD0D$T-2TY9B$J(7<A="%P(7,A
M,"%U(78A2B%+(5TA7"%A(4XA3R%0(5$A;QLH2@H;)$)(/C-1&RA*#C8W.`\;
M*$H]#CDZ-EXW7CA>.5XZ7@\;)$(D2!LH2@H;)$)(/C-1&RA*#DI?2U],7TU?
M3E\W7S%>#PH.2E]+7TP/&RA*"FAA;FMA:W4@#DI?2U],)`\;*$H*#DI?2U],
672$/&RA*"ALD0D@^,U$D3CAE&RA""@``
eofeof
X
$example{'x0201.x0208'} = unpack('u',<<'eofeof');
M&R1"030S424K)2TE+R4Q)3,E+"4N)3`E,B4T&RA""ALD0D$T,5$;*$)!0D-$
M149'86)C9&5F9PH;)$)!-#4M.68;*$(A0",D)5XF*B@I+2L]6UU[?1LD0B%O
M&RA""ALD0D@^,U$E*R4M)2\;*$(]&R1")3$E,R4L)2XE,"4R)30D2!LH0@H;
M)$)(/C-1)5$E5"57)5HE724M(2PE(B$K&RA""ALD0B51)50E51LH0@IH86YK
M86MU(!LD0B51)50E52$B&RA""ALD0B51)50E525S(2,;*$(*&R1"2#XS421.
&.&4;*$(*
eofeof
X
# -X is necessary to allow X0201 in SJIS
# -Z convert X0208 alphabet to ASCII
print "X0201 conversion: SJIS ";
X    &test("$nkf -XZ",$example{'x0201.sjis'},$example{'x0201.x0208'});
print "X0201 conversion: JIS  ";
X    &test("$nkf -Z",$example{'x0201.jis'},$example{'x0201.x0208'});
print "X0201 conversion:SI/SO ";
X    &test("$nkf -Z",$example{'x0201.sosi'},$example{'x0201.x0208'});
print "X0201 conversion: EUC  ";
X    &test("$nkf -Z",$example{'x0201.euc'},$example{'x0201.x0208'});
# -x means X0201 output
print "X0201 output: SJIS     ";
X    &test("$nkf -xs",$example{'x0201.euc'},$example{'x0201.sjis'});
print "X0201 output: JIS      ";
X    &test("$nkf -xj",$example{'x0201.sjis'},$example{'x0201.jis'});
print "X0201 output: EUC      ";
X    &test("$nkf -xe",$example{'x0201.jis'},$example{'x0201.euc'});
X
# MIME decode
X
print "\nMIME test\n\n";
X
# MIME ISO-2022-JP
X
$example{'mime.iso2022'} = unpack('u',<<'eofeof');
M/3])4T\M,C`R,BU*4#]"/T=Y4D%.144W96E23TI566Q/4U9)1WEH2S\]"CT_
M:7-O+3(P,C(M2E`_0C]'>5)!3D5%-V5I4D]*55EL3U-624=Y:$L_/0H]/VES
M;RTR,#(R+4I0/U$_/3%")$(D1B11/3%"*$)?96YD/ST*&R1`)#TD)B0K)$H;
M*$H@/3])4T\M,C`R,BU*4#]"/T=Y4D%.144W96E23U!Y:S=D:'-O4V<]/3\]
M(&5N9"!O9B!L:6YE"CT_25-/+3(P,C(M2E`_0C]'>5)!3D5%-V5I4D]0>6LW
M9&AS;U-G/3T_/2`]/TE33RTR,#(R+4I0/T(_1WE204Y%13=E:5)/4'EK-V1H
M<V]39ST]/ST*0G)O:V5N(&-A<V4*/3])4T\M,C`R,BU*4#]"/T=Y4D%.144W
M96E23U!Y:S=D"FAS;U-G/3T_/2`]/TE33RTR,`HR,BU*4#]"/T=Y4D%.144W
M96E23U!Y:S=D:'-O4V<]/3\]"CT_25-/+3(P,C(M2E`_0C]'>5)!3D5%-V5I
44D]*55EL3QM;2U-624=Y:$L_/0H_
eofeof
X
$example{'mime.ans.strict'} = unpack('u',<<'eofeof');
M&R1"-$$[>B1.)48E.25(&RA""ALD0C1!.WHD3B5&)3DE2!LH0@H;)$(D1B11
M&RA"(&5N9`H;)$(D/20F)"LD2ALH0B`;)$(T03MZ)$X_*3MV&RA"96YD(&]F
M(&QI;F4*&R1"-$$[>B1./RD[=C1!.WHD3C\I.W8;*$(*0G)O:V5N(&-A<V4*
M/3])4T\M,C`R,BU*4#]"/T=Y4D%.144W96E23U!Y:S=D"FAS;U-G/3T_/2`]
M/TE33RTR,`HR,BU*4#]"/T=Y4D%.144W96E23U!Y:S=D:'-O4V<]/3\]"CT_
L25-/+3(P,C(M2E`_0C]'>5)!3D5%-V5I4D]*55EL3QM;2U-624=Y:$L_/0H_
eofeof
X
$example{'mime.unbuf.strict'} = unpack('u',<<'eofeof');
M&R1"-$$[>B1.)48E.25(&RA""ALD0C1!.WHD3B5&)3DE2!LH0@H;)$(D1B11
M&RA"(&5N9`H;)$(D/20F)"LD2ALH0B`;)$(T03MZ)$X_*3MV&RA"96YD(&]F
M(&QI;F4*&R1"-$$[>B1./RD[=C1!.WHD3C\I.W8;*$(*0G)O:V5N(&-A<V4*
M&R1"-$$[>B1./RD;*$)H<V]39ST]/ST@/3])4T\M,C`*,C(M2E`_0C]'>5)!
M3D5%-V5I4D]0>6LW9&AS;U-G/3T_/0H;)$(T03MZ)$XE1ALH0EM+4U9)1WEH
$2S\]"F5I
eofeof
X
$example{'mime.ans'} = unpack('u',<<'eofeof');
M&R1"-$$[>B1.)48E.25(&RA""ALD0C1!.WHD3B5&)3DE2!LH0@H;)$(D1B11
M&RA"(&5N9`H;)$(D/20F)"LD2ALH0B`;)$(T03MZ)$X_*3MV&RA"96YD(&]F
M(&QI;F4*&R1"-$$[>B1./RD[=C1!.WHD3C\I.W8;*$(*0G)O:V5N(&-A<V4*
M&R1"-$$[>B1./RD;*$)H<V]39ST]/ST@&R1"-$$[>B1./RD[=ALH0@H;)$(T
603MZ)$XE1ALH0EM+4U9)1WEH2S\]"@`*
eofeof
X
$example{'mime.unbuf'} = unpack('u',<<'eofeof');
M&R1"-$$[>B1.)48E.25(&RA""ALD0C1!.WHD3B5&)3DE2!LH0@H;)$(D1B11
M&RA"(&5N9`H;)$(D/20F)"LD2ALH0B`;)$(T03MZ)$X_*3MV&RA"96YD(&]F
M(&QI;F4*&R1"-$$[>B1./RD[=C1!.WHD3C\I.W8;*$(*0G)O:V5N(&-A<V4*
M&R1"-$$[>B1./RD;*$)H<V]39ST]/ST@&R1"-$$[>B1./RD[=ALH0@H;)$(T
603MZ)$XE1ALH0EM+4U9)1WEH2S\]"@`*
eofeof
X
$example{'mime.base64'} = unpack('u',<<'eofeof');
M9W-M5"])3&YG<FU#>$I+-&=Q=4,S24LS9W%Q0E%:3TUI-39,,S0Q-&=S5T)1
M43!+9VUA1%9O3T@*9S)+1%1O3'=K8C)1;$E+;V=Q2T-X24MG9W5M0W%*3EEG
<<T=#>$E+9V=U;4,X64Q&9W)70S592VMG<6U""F=Q
eofeof
X
$example{'mime.base64.ans'} = unpack('u',<<'eofeof');
M&R1")$M&?B1I)#LD1D0Z)"TD7B0Y)"PA(D5L-7XV83E9)$<A(ALH0@T*&R1"
M(T<E-R5G)4,E+R1R0C\_="0J)"0D1B0B)&LD*D4Y)$,D1B0B)&LD<R1')#<D
(9R0F)"L;*$(E
eofeof
X
print "Next test is expeced to Fail.\n";
print "MIME decode (strict)   ";
X    $tmp = &test("$nkf -m",$example{'mime.iso2022'},$example{'mime.ans.strict'});
print "MIME decode (nonstrict)";
X    $tmp = &test("$nkf -m",$example{'mime.iso2022'},$example{'mime.ans'});
#    open(OUT,">tmp1");print OUT pack('u',$tmp);close(OUT);
# unbuf mode implies more pessimistic decode
print "MIME decode (unbuf)    ";
X    &test("$nkf -mu",$example{'mime.iso2022'},$example{'mime.unbuf'});
print "MIME decode (base64)   ";
X    &test("$nkf -mB",$example{'mime.base64'},$example{'mime.base64.ans'});
X
# MIME ISO-8859-1
X
$example{'mime.is8859'} = unpack('u',<<'eofeof');
M/3])4T\M.#@U.2TQ/U$_*CU#-V%V83\_/2`*4&5E<B!4]G)N9W)E;@I,87-S
M92!(:6QL97+X92!0971E<G-E;B`@7"`B36EN(&MA97!H97-T(&AA<B!F86%E
M="!E="!F;V5L(2(*06%R:'5S(%5N:79E<G-I='DL($1%3DU!4DL@(%P@(DUI
<;B!KYG!H97-T(&AA<B!FY65T(&5T(&;X;"$B"@!K
eofeof
X
$example{'mime.is8859.ans'} = unpack('u',<<'eofeof');
M*L=A=F$_(`I0965R(%3V<FYG<F5N"DQA<W-E($AI;&QE<OAE(%!E=&5R<V5N
M("!<(")-:6X@:V%E<&AE<W0@:&%R(&9A865T(&5T(&9O96PA(@I!87)H=7,@
M56YI=F5R<VET>2P@1$5.34%22R`@7"`B36EN(&OF<&AE<W0@:&%R(&;E970@
)970@9OAL(2(*
eofeof
X
# Without -l, ISO-8859-1 was handled as X0201.
X
print "MIME ISO-8859-1 (Q)    ";
X    &test("$nkf -ml",$example{'mime.is8859'},$example{'mime.is8859.ans'});
X
# test for -f is not so simple.
X
# end
X
SHAR_EOF
  $shar_touch -am 1116192198 'nkf_test.pl' &&
  chmod 0644 'nkf_test.pl' ||
  $echo 'restore of' 'nkf_test.pl' 'failed'
  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
    || $echo 'nkf_test.pl:' 'MD5 check failed'
24aa993a19b2f0bbf04b264cfd596593  nkf_test.pl
SHAR_EOF
  else
    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'nkf_test.pl'`"
    test 12697 -eq "$shar_count" ||
    $echo 'nkf_test.pl:' 'original size' '12697,' 'current size' "$shar_count!"
  fi
fi
# ============= NKF/Changes ==============
if test ! -d 'NKF'; then
  $echo 'x -' 'creating directory' 'NKF'
  mkdir 'NKF'
fi
if test -f 'NKF/Changes' && test "$first_param" != -c; then
  $echo 'x -' SKIPPING 'NKF/Changes' '(file already exists)'
else
  $echo 'x -' extracting 'NKF/Changes' '(text)'
  sed 's/^X//' << 'SHAR_EOF' > 'NKF/Changes' &&
Revision history for Perl extension NKF.
X
1.7  Sat Nov  7 16:50:33 1998
X	- original version; created by h2xs 1.18
X
SHAR_EOF
  $shar_touch -am 1116192198 'NKF/Changes' &&
  chmod 0644 'NKF/Changes' ||
  $echo 'restore of' 'NKF/Changes' 'failed'
  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
    || $echo 'NKF/Changes:' 'MD5 check failed'
b1b0cbf68cdd7895dd686206ba22a825  NKF/Changes
SHAR_EOF
  else
    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'NKF/Changes'`"
    test 115 -eq "$shar_count" ||
    $echo 'NKF/Changes:' 'original size' '115,' 'current size' "$shar_count!"
  fi
fi
# ============= NKF/MANIFEST ==============
if test -f 'NKF/MANIFEST' && test "$first_param" != -c; then
  $echo 'x -' SKIPPING 'NKF/MANIFEST' '(file already exists)'
else
  $echo 'x -' extracting 'NKF/MANIFEST' '(text)'
  sed 's/^X//' << 'SHAR_EOF' > 'NKF/MANIFEST' &&
Changes
MANIFEST
Makefile.PL
NKF.pm
NKF.xs
test.pl
SHAR_EOF
  $shar_touch -am 1116192198 'NKF/MANIFEST' &&
  chmod 0644 'NKF/MANIFEST' ||
  $echo 'restore of' 'NKF/MANIFEST' 'failed'
  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
    || $echo 'NKF/MANIFEST:' 'MD5 check failed'
0deb2997670573a1f5acba661e2320cf  NKF/MANIFEST
SHAR_EOF
  else
    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'NKF/MANIFEST'`"
    test 51 -eq "$shar_count" ||
    $echo 'NKF/MANIFEST:' 'original size' '51,' 'current size' "$shar_count!"
  fi
fi
# ============= NKF/Makefile.PL ==============
if test -f 'NKF/Makefile.PL' && test "$first_param" != -c; then
  $echo 'x -' SKIPPING 'NKF/Makefile.PL' '(file already exists)'
else
  $echo 'x -' extracting 'NKF/Makefile.PL' '(text)'
  sed 's/^X//' << 'SHAR_EOF' > 'NKF/Makefile.PL' &&
use ExtUtils::MakeMaker;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
WriteMakefile(
X    'NAME'	=> 'NKF',
X    'VERSION_FROM' => 'NKF.pm', # finds $VERSION
X    'LIBS'	=> [''],   # e.g., '-lm' 
X    'DEFINE'	=> '',     # e.g., '-DHAVE_SOMETHING' 
X    'INC'	=> '',     # e.g., '-I/usr/include/other' 
);
SHAR_EOF
  $shar_touch -am 1116192198 'NKF/Makefile.PL' &&
  chmod 0644 'NKF/Makefile.PL' ||
  $echo 'restore of' 'NKF/Makefile.PL' 'failed'
  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
    || $echo 'NKF/Makefile.PL:' 'MD5 check failed'
eb12f97e09146970e9810c944fb690f4  NKF/Makefile.PL
SHAR_EOF
  else
    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'NKF/Makefile.PL'`"
    test 367 -eq "$shar_count" ||
    $echo 'NKF/Makefile.PL:' 'original size' '367,' 'current size' "$shar_count!"
  fi
fi
# ============= NKF/NKF.pm ==============
if test -f 'NKF/NKF.pm' && test "$first_param" != -c; then
  $echo 'x -' SKIPPING 'NKF/NKF.pm' '(file already exists)'
else
  $echo 'x -' extracting 'NKF/NKF.pm' '(text)'
  sed 's/^X//' << 'SHAR_EOF' > 'NKF/NKF.pm' &&
package NKF;
X
use strict;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
X
require Exporter;
require DynaLoader;
X
@ISA = qw(Exporter DynaLoader);
# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.
@EXPORT = qw(
X	nkf	
);
$VERSION = '0.01';
X
bootstrap NKF $VERSION;
X
# Preloaded methods go here.
X
# Autoload methods go after =cut, and are processed by the autosplit program.
X
1;
__END__
# Below is the stub of documentation for your module. You better edit it!
X
=head1 NAME
X
NKF - Perl extension for Network Kanji Filter 
X
=head1 SYNOPSIS
X
X  use NKF;
X  $output = nkf("-s",$input);
X
=head1 DESCRIPTION
X
This is a Perl Extension version of nkf (Netowrk Kanji Filter ) 1.7.
It converts the last argument and return converted result. Conversion
details are specified by flags before the last argument.
X
Flags:
X
C<b,u      Output is bufferred (DEFAULT),Output is unbufferred>
X
C<j,s,e    Outout code is JIS 7 bit (DEFAULT), Shift JIS, AT&T JIS (EUC)>
X
C<J,S,E    Input assumption is JIS 7 bit , Shift JIS, AT&T JIS (EUC)>
X
C<t        no conversion>
X
C<i_       Output sequence to designate JIS-kanji (DEFAULT B)>
X
C<o_       Output sequence to designate ASCII (DEFAULT B)>
X
C<r        {de/en}crypt ROT13/47>
X
C<m[BQ]    MIME decode [B:base64 stream,Q:quoted stream]>
X
C<l        ISO8859-1 (Latin-1) support>
X
C<f        Folding: C<-f60> or C<-f>>
X
C<Z[0-2]   Convert X0208 alphabet to ASCII  1: Kankaku to space,2: 2 spaces>
X
C<X,x      Assume X0201 kana in MS-Kanji, C<-x> preserves X0201>
X
C<B[0-2]   Broken input  0: missing ESC,1: any X on ESC-[($]-X,2: ASCII on NL>
X
C<d,c      Delete \r in line feed, Add \r in line feed>
X
=head1 AUTHOR
X
Network Kanji Filter Version 1.7 (1/9811/Shinji Kono) 
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa),1997 S. Kono, COW
X
=head1 SEE ALSO
X
perl(1).   nkf(1)
X
=cut
SHAR_EOF
  $shar_touch -am 1116192198 'NKF/NKF.pm' &&
  chmod 0644 'NKF/NKF.pm' ||
  $echo 'restore of' 'NKF/NKF.pm' 'failed'
  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
    || $echo 'NKF/NKF.pm:' 'MD5 check failed'
dacebedefea6799a98bf1bd68e95aa98  NKF/NKF.pm
SHAR_EOF
  else
    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'NKF/NKF.pm'`"
    test 1957 -eq "$shar_count" ||
    $echo 'NKF/NKF.pm:' 'original size' '1957,' 'current size' "$shar_count!"
  fi
fi
# ============= NKF/NKF.xs ==============
if test -f 'NKF/NKF.xs' && test "$first_param" != -c; then
  $echo 'x -' SKIPPING 'NKF/NKF.xs' '(file already exists)'
else
  $echo 'x -' extracting 'NKF/NKF.xs' '(text)'
  sed 's/^X//' << 'SHAR_EOF' > 'NKF/NKF.xs' &&
#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#ifdef __cplusplus
}
#endif
X
/* we never use getc, ungetc */
X
#undef getc
#undef ungetc
#define getc(f)   	(input_ctr>i_len?-1:input[input_ctr++])
#define ungetc(c,f)	input_ctr--
X
#define INCSIZE		32
#undef putchar
#undef TRUE
#undef FALSE
#define putchar(c)	nkf_putchar(c)
X
static unsigned char *output;
static unsigned char *input;
static STRLEN input_ctr;
static STRLEN i_len;
static STRLEN output_ctr;
static STRLEN o_len;
static STRLEN incsize;
int nkf_putchar(unsigned int c);
X
SV *result;
X
int
nkf_putchar(unsigned int c) 
{
X    if(output_ctr>=o_len) {
X	o_len += incsize;
X        SvGROW(result, o_len);
X	incsize *= 2;
X	output = SvPVX(result);
X    }
X    return output[output_ctr++] = c;
}
X
#define PERL_XS 1
#include "../nkf.c"
X
MODULE = NKF		PACKAGE = NKF		
X
SV *
nkf(...)
X    PROTOTYPE: @
X    PREINIT:
X    SV* sv;
X    SV* last;
X    char **argv;
X    char *cp;
X    char *data;
X    STRLEN cplen,rlen;
X    int i,argc;
X    CODE:
X
X    reinit();
X    
X    argc = items - 1;
X
X    for (i=0;i<argc;i++) {
X        sv = ST(i);
X        cp = SvPV(sv,cplen);
X        if(*cp != '-') continue;
X	arguments(cp);
X    }
X    data = SvPV(ST(argc),i_len);
X    input_ctr = 0;
X
X    if(iso8859_f && (oconv != j_oconv || !x0201_f )) {
X	iso8859_f = FALSE;
X    } 
X    /* allocate a result buffer */
X    incsize = INCSIZE;
X    rlen = i_len+INCSIZE;
X    result = newSV(rlen);
X    input  = data;
X    output = SvPVX(result);
X    o_len = rlen;
X    output_ctr = 0;
X    kanji_convert(NULL);
X    nkf_putchar(0);
X    RETVAL = result;
X    SvPOK_on(RETVAL);       
X    SvCUR_set(RETVAL, strlen(output));
X    OUTPUT:
X    RETVAL
X
SHAR_EOF
  $shar_touch -am 1116192198 'NKF/NKF.xs' &&
  chmod 0644 'NKF/NKF.xs' ||
  $echo 'restore of' 'NKF/NKF.xs' 'failed'
  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
    || $echo 'NKF/NKF.xs:' 'MD5 check failed'
8e9ed77c2c6a57ceeb8f648ba2033fa4  NKF/NKF.xs
SHAR_EOF
  else
    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'NKF/NKF.xs'`"
    test 1689 -eq "$shar_count" ||
    $echo 'NKF/NKF.xs:' 'original size' '1689,' 'current size' "$shar_count!"
  fi
fi
# ============= NKF/README ==============
if test -f 'NKF/README' && test "$first_param" != -c; then
  $echo 'x -' SKIPPING 'NKF/README' '(file already exists)'
else
  $echo 'x -' extracting 'NKF/README' '(text)'
  sed 's/^X//' << 'SHAR_EOF' > 'NKF/README' &&
X			v1.7 河野真治  kono@ie.u-ryukyu.ac.jp
X			Sun Nov  8 00:42:15 JST 1998
X
Xこれは、Perl から nkf を使う拡張モジュールです。
Xいつものように、
X	perl5 Makefile.PL
X	make
X	make install
Xとすることにより使えるようになります。
X
X使い方は、
X	use NKF;
X	$output = nkf($flag,$input);
X
Xのように使います。flag は、nkf と同じです。
X
X配布の条件は、nkf と同様とします。
SHAR_EOF
  $shar_touch -am 1116192198 'NKF/README' &&
  chmod 0644 'NKF/README' ||
  $echo 'restore of' 'NKF/README' 'failed'
  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
    || $echo 'NKF/README:' 'MD5 check failed'
38b5ec19dd6ffeeb3337aed16005d301  NKF/README
SHAR_EOF
  else
    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'NKF/README'`"
    test 423 -eq "$shar_count" ||
    $echo 'NKF/README:' 'original size' '423,' 'current size' "$shar_count!"
  fi
fi
# ============= NKF/test.pl ==============
if test -f 'NKF/test.pl' && test "$first_param" != -c; then
  $echo 'x -' SKIPPING 'NKF/test.pl' '(file already exists)'
else
  $echo 'x -' extracting 'NKF/test.pl' '(text)'
  sed 's/^X//' << 'SHAR_EOF' > 'NKF/test.pl' &&
#!/usr/local/bin/perl
#
# nkf test program for nkf 1.7
#    Shinji KONO <kono@ie.u-ryukyu.ac.jp>
# Sun Aug 18 12:25:40 JST 1996
# Sun Nov  8 00:16:06 JST 1998
#
# This is useful when you add new patch on nkf.
# Since this test is too strict, faileurs may not mean
# wrong conversion. 
#
# nkf 1.5 differs on MIME decoding
# nkf 1.4 passes Basic Conversion tests
# nkf PDS version passes Basic Conversion tests  using "nkf -iB -oB "
#
X
$nkf = "./nkf";
# $nkf = "doscmd nkf.exe";
X
# If you want to see the testing process, set next flag.
X
$detail_all = 0;
X
&library_test0();
sub test  {
X    use NKF;
X    &library_test(@_);
#    &command_test(@_);
}
X
sub command_test {
X    local ($nkf,$in,$ans,$detail) = @_;
X    local ($result);
X
X    $result = '';
X    open(OUT,"> nkf.in");
X    print OUT $in;
X    close(OUT);
X    system("$nkf <nkf.in >nkf.out");   # easy
X    open(IN,"< nkf.out");
X    print STDERR "\nINPUT:\n",$in  if ($detail || $detail_all);
X    print STDERR "\nEXPECT:\n", $ans if ($detail || $detail_all);
X    while(<IN>) {
X	$result .= $_;
X    }
X    print STDERR "\nGOT:\n",$result if ($detail || $detail_all);
X    print (($result eq $ans)?"Ok\n":"Fail\n");
X    return $result;
}
X
sub library_test {
X    local ($nkf,$in,$ans,$detail) = @_;
X    local ($result);
X
X
X    $nkf =~ s/^[^_]* //;
X    print "\nINPUT:\n",$in  if ($detail || $detail_all);
X    print "\nEXPECT:\n", $ans if ($detail || $detail_all);
X    $result = NKF::nkf($nkf,$in);
X    print "\nGOT:\n",$result if ($detail || $detail_all);
X
X    print (($result eq $ans)?"Ok\n":"Fail\n");
X    return $result;
}
X
sub library_test0 {
BEGIN { $| = 1; print "1..3\n"; }
END {print "not ok 1\n" unless $loaded;}
X    use NKF;
X    $loaded = 1;
X    print "ok 1\n";
X
X    ######################### End of black magic.
X
X    # Insert your test code below (better if it prints "ok 13"
X    # (correspondingly "not ok 13") depending on the success of chunk 13
X    # of the test code):
X
X    if ( nkf("-m","-e","1") ) {
X	print "ok 2\n";
X    } else {
X	print "no 2\n";
X    }
X
X    $output = nkf("\033\$@#1#3#2%B");
X    if ($output) {
X    # print $output,"\n";
X	print "ok 3\n";
X    } else {
X	print "no 3\n";
X    }
X
X    $output = nkf("-Zj","\033\$@#1#3#2%B");
X    if ($output) {
X    # print $output,"\n";
X	print "ok 4\n";
X    } else {
X	print "no 4\n";
X    }
X
X    # conversion makes strings longer
X    $output = "\244\306 " x 1024;
X	$old =  length($output);
X    $output = nkf("-j",$output);
X    if ($output) {
X    # print $output,"\n";
X	print "ok 5 $old ",length($output),"\n";
X    } else {
X	print "no 5\n";
X    }
X
X
}
X
# Basic Conversion
print "\nBasic Conversion test\n\n";
X
# I gave up simple literal quote because there are big difference
# on perl4 and perl5 on literal quote. Of course we cannot use
# jperl.
X
$example{'jis'} = unpack('u',<<'eofeof');
M1FER<W0@4W1A9V4@&R1"(3DQ(3%^2R%+?D]3&RA"(%-E8V]N9"!3=&%G92`;
M)$)0)TU:&RA"($AI<F%G86YA(!LD0B0B)"0D)B0H)"HD;R1R)',;*$(*2V%T
M86MA;F$@&R1")2(E)"4F)2@E*B5O)7(E<QLH0B!+:6=O=2`;)$(A)B%G(S`C
/029!)E@G(B=!*$`;*$(*
eofeof
X
$example{'sjis'} = unpack('u',<<'eofeof');
M1FER<W0@4W1A9V4@@5B)0(F>ED"6GIAR(%-E8V]N9"!3=&%G92"8I9=Y($AI
M<F%G86YA((*@@J*"I(*F@JB"[8+P@O$*2V%T86MA;F$@@T&#0X-%@T>#28./
>@Y*#DR!+:6=O=2"!18&'@D^"8(._@]:$081@A+X*
eofeof
X
$example{'euc'} = unpack('u',<<'eofeof');
M1FER<W0@4W1A9V4@H;FQH;'^RZ'+_L_3(%-E8V]N9"!3=&%G92#0I\W:($AI
M<F%G86YA(*2BI*2DIJ2HI*JD[Z3RI/,*2V%T86MA;F$@I:*EI*6FI:BEJJ7O
>I?*E\R!+:6=O=2"AIJ'GH["CP:;!IMBGHJ?!J,`*
eofeof
X
X
# From JIS
X
print "JIS  to JIS ... ";&test("$nkf   ",$example{'jis'},$example{'jis'});
print "JIS  to SJIS... ";&test("$nkf -s",$example{'jis'},$example{'sjis'});
print "JIS  to EUC ... ";&test("$nkf -e",$example{'jis'},$example{'euc'});
X
# From SJIS
X
print "SJIS to JIS ... ";&test("$nkf -j",$example{'sjis'},$example{'jis'});
print "SJIS to SJIS... ";&test("$nkf -s",$example{'sjis'},$example{'sjis'});
print "SJIS to EUC ... ";&test("$nkf -e",$example{'sjis'},$example{'euc'});
X
# From EUC
X
print "EUC  to JIS ... ";&test("$nkf   ",$example{'euc'},$example{'jis'});
print "EUC  to SJIS... ";&test("$nkf -s",$example{'euc'},$example{'sjis'});
print "EUC  to EUC ... ";&test("$nkf -e",$example{'euc'},$example{'euc'});
X
# Ambigous Case
X
$example{'amb'} = unpack('u',<<'eofeof');
MI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<*PL:7"L+&E
MPK"QI<*PL:7"L+&EPK"QI<(*I<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<*P
ML:7"L+&EPK"QI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<(*I<*PL:7"L+&E
MPK"QI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<*PL:7"
ML+&EPK"QI<(*I<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"Q
MI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<(*I<*PL:7"L+&EPK"QI<*PL:7"
ML+&EPK"QI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<*PL:7"L+&EPK"QI<(*
eofeof
X
$example{'amb.euc'} = unpack('u',<<'eofeof');
M&R1")4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25"
M,#$E0C`Q)4(P,25",#$E0C`Q)4(;*$(*&R1")4(P,25",#$E0C`Q)4(P,25"
M,#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(;
M*$(*&R1")4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P
M,25",#$E0C`Q)4(P,25",#$E0C`Q)4(;*$(*&R1")4(P,25",#$E0C`Q)4(P
M,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q
M)4(;*$(*&R1")4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q
>)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(;*$(*
eofeof
X
$example{'amb.sjis'} = unpack('u',<<'eofeof');
M&RA))4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25"
M,#$E0C`Q)4(P,25",#$E0C`Q)4(;*$(*&RA))4(P,25",#$E0C`Q)4(P,25"
M,#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(;
M*$(*&RA))4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P
M,25",#$E0C`Q)4(P,25",#$E0C`Q)4(;*$(*&RA))4(P,25",#$E0C`Q)4(P
M,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q
M)4(;*$(*&RA))4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q
>)4(P,25",#$E0C`Q)4(P,25",#$E0C`Q)4(;*$(*
eofeof
X
print "Ambiguous Case. ";
X    &test("$nkf",$example{'amb'},$example{'amb.euc'});
X
# Input assumption
X
print "SJIS  Input assumption ";
X    &test("$nkf -Sx",$example{'amb'},$example{'amb.sjis'});
X
# X0201 仮名
# X0201->X0208 conversion
# X0208 aphabet -> ASCII
# X0201 相互変換
X
print "\nX0201 test\n\n";
X
$example{'x0201.sjis'} = unpack('u',<<'eofeof');
MD5.*<(-*@TR#3H-0@U*#2X--@T^#48-3"I%3B7""8()A@F*"8X)D@F6"9H*!
M@H*"@X*$@H6"AH*'"I%3BTR-AH%)@9>!E(&0@9.!3X&5@9:!:8%J@7R!>X&!
M@6V!;H%O@7"!CPJ4O(IPMK>X/;FZMMZWWKC>N=ZZWH+&"I2\BG#*W\O?S-_-
MW\[?M]^QW@K*W\O?S`IH86YK86MU(,K?R]_,I`K*W\O?S-VA"I2\BG""S(SC
!"@!"
eofeof
X
$example{'x0201.euc'} = unpack('u',<<'eofeof');
MP;2ST:6KI:VEKZ6QI;.EK*6NI;"ELJ6T"L&TL=&CP:/"H\.CQ*/%H\:CQZ/A
MH^*CXZ/DH^6CYJ/G"L&TM:VYYJ&JH?>A]*'PH?.AL*'UH?:ARJ'+H=VAW*'A
MH<ZASZ'0H=&A[PK(OK/1CK:.MXZX/8ZYCKJ.MH[>CK>.WHZXCMZ.N8[>CKJ.
MWJ3("LB^L]&.RH[?CLN.WX[,CM^.S8[?CLZ.WXZWCM^.L8[>"H[*CM^.RX[?
MCLP*:&%N:V%K=2".RH[?CLN.WX[,CJ0*CLJ.WX[+CM^.S([=CJ$*R+ZST:3.
#N.4*
eofeof
X
$example{'x0201.jis'} = unpack('u',<<'eofeof');
M&R1"030S424K)2TE+R4Q)3,E+"4N)3`E,B4T&RA""ALD0D$T,5$C02-"(T,C
M1"-%(T8C1R-A(V(C8R-D(V4C9B-G&RA""ALD0D$T-2TY9B$J(7<A="%P(7,A
M,"%U(78A2B%+(5TA7"%A(4XA3R%0(5$A;QLH0@H;)$)(/C-1&RA)-C<X&RA"
M/1LH23DZ-EXW7CA>.5XZ7ALD0B1(&RA""ALD0D@^,U$;*$E*7TM?3%]-7TY?
M-U\Q7ALH0@H;*$E*7TM?3!LH0@IH86YK86MU(!LH24I?2U],)!LH0@H;*$E*
97TM?3%TA&RA""ALD0D@^,U$D3CAE&RA""@``
eofeof
X
$example{'x0201.sosi'} = unpack('u',<<'eofeof');
M&R1"030S424K)2TE+R4Q)3,E+"4N)3`E,B4T&RA*"ALD0D$T,5$C02-"(T,C
M1"-%(T8C1R-A(V(C8R-D(V4C9B-G&RA*"ALD0D$T-2TY9B$J(7<A="%P(7,A
M,"%U(78A2B%+(5TA7"%A(4XA3R%0(5$A;QLH2@H;)$)(/C-1&RA*#C8W.`\;
M*$H]#CDZ-EXW7CA>.5XZ7@\;)$(D2!LH2@H;)$)(/C-1&RA*#DI?2U],7TU?
M3E\W7S%>#PH.2E]+7TP/&RA*"FAA;FMA:W4@#DI?2U],)`\;*$H*#DI?2U],
672$/&RA*"ALD0D@^,U$D3CAE&RA""@``
eofeof
X
$example{'x0201.x0208'} = unpack('u',<<'eofeof');
M&R1"030S424K)2TE+R4Q)3,E+"4N)3`E,B4T&RA""ALD0D$T,5$;*$)!0D-$
M149'86)C9&5F9PH;)$)!-#4M.68;*$(A0",D)5XF*B@I+2L]6UU[?1LD0B%O
M&RA""ALD0D@^,U$E*R4M)2\;*$(]&R1")3$E,R4L)2XE,"4R)30D2!LH0@H;
M)$)(/C-1)5$E5"57)5HE724M(2PE(B$K&RA""ALD0B51)50E51LH0@IH86YK
M86MU(!LD0B51)50E52$B&RA""ALD0B51)50E525S(2,;*$(*&R1"2#XS421.
&.&4;*$(*
eofeof
X
# -X is necessary to allow X0201 in SJIS
# -Z convert X0208 alphabet to ASCII
print "X0201 conversion: SJIS ";
X    &test("$nkf -XZ",$example{'x0201.sjis'},$example{'x0201.x0208'});
print "X0201 conversion: JIS  ";
X    &test("$nkf -Z",$example{'x0201.jis'},$example{'x0201.x0208'});
print "X0201 conversion:SI/SO ";
X    &test("$nkf -Z",$example{'x0201.sosi'},$example{'x0201.x0208'});
print "X0201 conversion: EUC  ";
X    &test("$nkf -Z",$example{'x0201.euc'},$example{'x0201.x0208'});
# -x means X0201 output
print "X0201 output: SJIS     ";
X    &test("$nkf -xs",$example{'x0201.euc'},$example{'x0201.sjis'});
print "X0201 output: JIS      ";
X    &test("$nkf -xj",$example{'x0201.sjis'},$example{'x0201.jis'});
print "X0201 output: EUC      ";
X    &test("$nkf -xe",$example{'x0201.jis'},$example{'x0201.euc'});
X
# MIME decode
X
print "\nMIME test\n\n";
X
# MIME ISO-2022-JP
X
$example{'mime.iso2022'} = unpack('u',<<'eofeof');
M/3])4T\M,C`R,BU*4#]"/T=Y4D%.144W96E23TI566Q/4U9)1WEH2S\]"CT_
M:7-O+3(P,C(M2E`_0C]'>5)!3D5%-V5I4D]*55EL3U-624=Y:$L_/0H]/VES
M;RTR,#(R+4I0/U$_/3%")$(D1B11/3%"*$)?96YD/ST*&R1`)#TD)B0K)$H;
M*$H@/3])4T\M,C`R,BU*4#]"/T=Y4D%.144W96E23U!Y:S=D:'-O4V<]/3\]
M(&5N9"!O9B!L:6YE"CT_25-/+3(P,C(M2E`_0C]'>5)!3D5%-V5I4D]0>6LW
M9&AS;U-G/3T_/2`]/TE33RTR,#(R+4I0/T(_1WE204Y%13=E:5)/4'EK-V1H
M<V]39ST]/ST*0G)O:V5N(&-A<V4*/3])4T\M,C`R,BU*4#]"/T=Y4D%.144W
M96E23U!Y:S=D"FAS;U-G/3T_/2`]/TE33RTR,`HR,BU*4#]"/T=Y4D%.144W
M96E23U!Y:S=D:'-O4V<]/3\]"CT_25-/+3(P,C(M2E`_0C]'>5)!3D5%-V5I
44D]*55EL3QM;2U-624=Y:$L_/0H_
eofeof
X
$example{'mime.ans.strict'} = unpack('u',<<'eofeof');
M&R1"-$$[>B1.)48E.25(&RA""ALD0C1!.WHD3B5&)3DE2!LH0@H;)$(D1B11
M&RA"(&5N9`H;)$(D/20F)"LD2ALH0B`;)$(T03MZ)$X_*3MV&RA"96YD(&]F
M(&QI;F4*&R1"-$$[>B1./RD[=C1!.WHD3C\I.W8;*$(*0G)O:V5N(&-A<V4*
M/3])4T\M,C`R,BU*4#]"/T=Y4D%.144W96E23U!Y:S=D"FAS;U-G/3T_/2`]
M/TE33RTR,`HR,BU*4#]"/T=Y4D%.144W96E23U!Y:S=D:'-O4V<]/3\]"CT_
L25-/+3(P,C(M2E`_0C]'>5)!3D5%-V5I4D]*55EL3QM;2U-624=Y:$L_/0H_
eofeof
X
$example{'mime.unbuf.strict'} = unpack('u',<<'eofeof');
M&R1"-$$[>B1.)48E.25(&RA""ALD0C1!.WHD3B5&)3DE2!LH0@H;)$(D1B11
M&RA"(&5N9`H;)$(D/20F)"LD2ALH0B`;)$(T03MZ)$X_*3MV&RA"96YD(&]F
M(&QI;F4*&R1"-$$[>B1./RD[=C1!.WHD3C\I.W8;*$(*0G)O:V5N(&-A<V4*
M&R1"-$$[>B1./RD;*$)H<V]39ST]/ST@/3])4T\M,C`*,C(M2E`_0C]'>5)!
M3D5%-V5I4D]0>6LW9&AS;U-G/3T_/0H;)$(T03MZ)$XE1ALH0EM+4U9)1WEH
$2S\]"F5I
eofeof
X
$example{'mime.ans'} = unpack('u',<<'eofeof');
M&R1"-$$[>B1.)48E.25(&RA""ALD0C1!.WHD3B5&)3DE2!LH0@H;)$(D1B11
M&RA"(&5N9`H;)$(D/20F)"LD2ALH0B`;)$(T03MZ)$X_*3MV&RA"96YD(&]F
M(&QI;F4*&R1"-$$[>B1./RD[=C1!.WHD3C\I.W8;*$(*0G)O:V5N(&-A<V4*
M&R1"-$$[>B1./RD;*$)H<V]39ST]/ST@&R1"-$$[>B1./RD[=ALH0@H;)$(T
603MZ)$XE1ALH0EM+4U9)1WEH2S\]"@`*
eofeof
X
$example{'mime.unbuf'} = unpack('u',<<'eofeof');
M&R1"-$$[>B1.)48E.25(&RA""ALD0C1!.WHD3B5&)3DE2!LH0@H;)$(D1B11
M&RA"(&5N9`H;)$(D/20F)"LD2ALH0B`;)$(T03MZ)$X_*3MV&RA"96YD(&]F
M(&QI;F4*&R1"-$$[>B1./RD[=C1!.WHD3C\I.W8;*$(*0G)O:V5N(&-A<V4*
M&R1"-$$[>B1./RD;*$)H<V]39ST]/ST@&R1"-$$[>B1./RD[=ALH0@H;)$(T
603MZ)$XE1ALH0EM+4U9)1WEH2S\]"@`*
eofeof
X
$example{'mime.base64'} = unpack('u',<<'eofeof');
M9W-M5"])3&YG<FU#>$I+-&=Q=4,S24LS9W%Q0E%:3TUI-39,,S0Q-&=S5T)1
M43!+9VUA1%9O3T@*9S)+1%1O3'=K8C)1;$E+;V=Q2T-X24MG9W5M0W%*3EEG
<<T=#>$E+9V=U;4,X64Q&9W)70S592VMG<6U""F=Q
eofeof
X
$example{'mime.base64.ans'} = unpack('u',<<'eofeof');
M&R1")$M&?B1I)#LD1D0Z)"TD7B0Y)"PA(D5L-7XV83E9)$<A(ALH0@T*&R1"
M(T<E-R5G)4,E+R1R0C\_="0J)"0D1B0B)&LD*D4Y)$,D1B0B)&LD<R1')#<D
(9R0F)"L;*$(E
eofeof
X
print "Next test is expeced to Fail.\n";
print "MIME decode (strict)   ";
X    $tmp = &test("$nkf -m",$example{'mime.iso2022'},$example{'mime.ans.strict'});
print "MIME decode (nonstrict)";
X    $tmp = &test("$nkf -m",$example{'mime.iso2022'},$example{'mime.ans'});
#    open(OUT,">tmp1");print OUT pack('u',$tmp);close(OUT);
# unbuf mode implies more pessimistic decode
print "MIME decode (unbuf)    ";
X    &test("$nkf -mu",$example{'mime.iso2022'},$example{'mime.unbuf'});
print "MIME decode (base64)   ";
X    &test("$nkf -mB",$example{'mime.base64'},$example{'mime.base64.ans'});
X
# MIME ISO-8859-1
X
$example{'mime.is8859'} = unpack('u',<<'eofeof');
M/3])4T\M.#@U.2TQ/U$_*CU#-V%V83\_/2`*4&5E<B!4]G)N9W)E;@I,87-S
M92!(:6QL97+X92!0971E<G-E;B`@7"`B36EN(&MA97!H97-T(&AA<B!F86%E
M="!E="!F;V5L(2(*06%R:'5S(%5N:79E<G-I='DL($1%3DU!4DL@(%P@(DUI
<;B!KYG!H97-T(&AA<B!FY65T(&5T(&;X;"$B"@!K
eofeof
X
$example{'mime.is8859.ans'} = unpack('u',<<'eofeof');
M*L=A=F$_(`I0965R(%3V<FYG<F5N"DQA<W-E($AI;&QE<OAE(%!E=&5R<V5N
M("!<(")-:6X@:V%E<&AE<W0@:&%R(&9A865T(&5T(&9O96PA(@I!87)H=7,@
M56YI=F5R<VET>2P@1$5.34%22R`@7"`B36EN(&OF<&AE<W0@:&%R(&;E970@
)970@9OAL(2(*
eofeof
X
# Without -l, ISO-8859-1 was handled as X0201.
X
print "MIME ISO-8859-1 (Q)    ";
X    &test("$nkf -ml",$example{'mime.is8859'},$example{'mime.is8859.ans'});
X
# test for -f is not so simple.
X
# end
X
SHAR_EOF
  $shar_touch -am 1116192198 'NKF/test.pl' &&
  chmod 0644 'NKF/test.pl' ||
  $echo 'restore of' 'NKF/test.pl' 'failed'
  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
    || $echo 'NKF/test.pl:' 'MD5 check failed'
cafed3817eb6fb8db8f37ce23ff4aa10  NKF/test.pl
SHAR_EOF
  else
    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'NKF/test.pl'`"
    test 12693 -eq "$shar_count" ||
    $echo 'NKF/test.pl:' 'original size' '12693,' 'current size' "$shar_count!"
  fi
fi
rm -fr _sh18783
exit 0
