#!/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 . # 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 木村 巌 ) 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 (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) ** 連絡先: (株)富士通研究所 ソフト3研 市川 至 ** (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 #endif X #if defined(MSDOS) || defined(__OS2__) #include #include #include #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 #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= *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> 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 || 0x7e0x80 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' ';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 */ 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> 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 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 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 # 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.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() { 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'); M1FERED"6GIAR(%-E8V]N9"!3=&%G92"8I9=Y($AI M#28./ >@Y*#DR!+:6=O=2"!18&'@D^"8(._@]:$081@A+X* eofeof X $example{'euc'} = unpack('u',<<'eofeof'); M1FERI?*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 MHCK>.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.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.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 M5)!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(&-A5)!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(&-AB1./RD;*$)H5)! 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(&-AB1./RD;*$)HB1./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(&-AB1./RD;*$)HB1./RD[=ALH0@H;)$(T 603MZ)$XE1ALH0EM+4U9)1WEH2S\]"@`* eofeof X $example{'mime.base64'} = unpack('u',<<'eofeof'); M9W-M5"])3&YG$I+-&=Q=4,S24LS9W%Q0E%:3TUI-39,,S0Q-&=S5T)1 M43!+9VUA1%9O3T@*9S)+1%1O3'=K8C)1;$E+;V=Q2T-X24MG9W5M0W%*3EEG <$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)$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&5E2P@1$5.34%22R`@7"`B36EN(&OF<&AE&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 X C X C X C X C X C X C X C X C X C or C<-f>> X C X C preserves X0201> X C X C 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&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 # 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.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() { 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'); M1FERED"6GIAR(%-E8V]N9"!3=&%G92"8I9=Y($AI M#28./ >@Y*#DR!+:6=O=2"!18&'@D^"8(._@]:$081@A+X* eofeof X $example{'euc'} = unpack('u',<<'eofeof'); M1FERI?*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 MHCK>.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.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.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 M5)!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(&-A5)!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(&-AB1./RD;*$)H5)! 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(&-AB1./RD;*$)HB1./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(&-AB1./RD;*$)HB1./RD[=ALH0@H;)$(T 603MZ)$XE1ALH0EM+4U9)1WEH2S\]"@`* eofeof X $example{'mime.base64'} = unpack('u',<<'eofeof'); M9W-M5"])3&YG$I+-&=Q=4,S24LS9W%Q0E%:3TUI-39,,S0Q-&=S5T)1 M43!+9VUA1%9O3T@*9S)+1%1O3'=K8C)1;$E+;V=Q2T-X24MG9W5M0W%*3EEG <$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)$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&5E2P@1$5.34%22R`@7"`B36EN(&OF<&AE&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