Sophie

Sophie

distrib > Mandriva > 9.1 > i586 > by-pkgid > cb586d19f2412491e4111bdd6001e16e > files > 1

perl-NKF-1.71-4mdk.src.rpm

#!/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 - $B%M%C%H%o!<%/MQ4A;z%3!<%IJQ49%U%#%k%?(B v1.7
X
SYNOPSIS
X	nkf [options] [in_file]                   ...Unix$BHG(B
X	nkf [options] [in_file] [out_file for -O] ...DOS$BHG(B
X	wnkf [options] [in_file] [outfile for -O] ...Windows16bit(3.x)$BHG(B
X	nkf32 [options] [in_file] [outfile for -O]...Windows32bit(95/NT)$BHG(B
X	nkf2 [options] [in_file] [outfile for -O] ...OS/2$BHG(B
X
X	$B!JL>>N$O!"F1$8(BPath$B>e$K$"$C$F$b6hJL$G$-$k$h$&$KJQ99$7$F$$$k!#!K(B
X
DESCRIPTION
X
nkf$B$O%M%C%H%o!<%/$G%a!<%k$d%K%e!<%9$NFI$_=q$-$r$9$k$?$a$K:n$i$l$?!"4A(B
X$B;z%3!<%I$NJQ49%U%#%k%?$G$"$k!#(B
X
X$B$3$N(Bnkf$B$NFCD'$H$7$F$O!"F~NO4A;z%3!<%I7O$NE}7WE*$J<+F0G'<15!G=$,$"$k!#(B
X$B$3$N$?$a!"MxMQ<T$O!"F~NO4A;z%3!<%I7O$,2?$G$"$k$+$rCN$i$J$/$F$b!"=PNO4A;z(B
X$B%3!<%I7O$N$_;XDj$9$l$PNI$$$3$H$K$J$k!#$?$@!"$3$NH=Dj5!9=$O!"M}O@E*$K$O40(B
X$BA4$G$O$J$$$,!"DL>o$N%K%e!<%9$d%a!<%k$N%a%C%;!<%8$K$D$$$F$O3N<B$KF0:n$9$k(B
X$B0BA4$J$b$N$K$O$J$C$F$$$k!#(B
X
X$B8=:_!"(Bnkf$B$,G'<1$G$-$kF~NO$N4A;z%3!<%I7O$O!"$$$o$f$k!V(BJIS$B%3!<%I!W(B(ISO-
2022-JP$B$K4p$E$/$b$N(B)$B!"(BMS$B4A;z%3!<%I(B($B%7%U%H(BJIS)$B!"F|K\8l(BEUC(AT&T$B%3!<%I(B)$B$N$$(B
X$B$:$l$+$G$"$k!#=PNO$9$k4A;z%3!<%I7O$b!"$3$N(B3$B<oN`$G$"$k!#(B
X
X$BF~NO$O!"%U%!%$%k$r;XDj$7$J$1$l$P!"I8=`F~NO$H$J$k!#=PNO$OI8=`=PNO$G$"$k!#(B
X
X$B;XDj$G$-$k%*%W%7%g%s$O!"0J2<$NDL$j!#(B-mu $B$N$h$&$KB3$1$k$3$H$,$G$-$k!#(B
X
X        -b      $B%P%C%U%!%j%s%0=PNO$r9T$&!#(B($B%G%U%)%k%H(B)
X        -u      $B=PNO;~$K!"%P%C%U%!%j%s%0$7$J$$!#(B
X                rsh localhost | nkf -u $B$H$$$&$h$&$K;H$&!#(B
X
X        -t      $B2?$b$7$J$$!#(B
X
X        -j      JIS$B%3!<%I$r=PNO$9$k!#(B($B%G%U%)%k%H(B)
X
X        -e      EUC$B%3!<%I$r=PNO$9$k!#(B
X
X        -s      $B%7%U%H(BJIS$B%3!<%I$r=PNO$9$k!#(B
X
X        -i?     JIS$B4A;z$r;X<($9$k%7!<%1%s%9$H$7$F(B ESC-'$'-?$B$r;HMQ$9$k!#(B
X                ($B%G%U%)%k%H$O!"(BESC-'$'-'B')
X
X        -o?     1$B%P%$%H1Q?tJ8;z%;%C%H$r;X<($9$k%7!<%1%s%9$H$7$F!"(BESC-
X                '('-?$B$r;HMQ$9$k!#(B($B%G%U%)%k%H$O!"(BESC-'('-'B')
X
X        -r      ROT13/47$B$NJQ49$r$9$k!#(B
X
X        -v      $B%P!<%8%g%s$rI=<($9$k!#(B
X
X        -T      $B%F%-%9%H%b!<%I$G=PNO$9$k!#(B(MS-DOS$B>e$G$N$_8zNO$r;}$D(B)
X
X        -m      MIME $B$r2rFI$9$k!#(B(defalut on)
X		ISO-2022-JP(base64)$B$H(BISO-8859-1(Q encode)
X                $B$N$_$r2rFI$9$k!#(BISO-8859-1 (Latin-1) $B$r2rFI$9$k;~$O!"(B
X                -l$B%U%i%0$bI,MW$G$"$k!#(B
X                -mB   MIME base64 stream $B$r2rFI$9$k!#%X%C%@$J$I$O<h$j=|$/$3$H!#(B
X                -mQ   MIME quoted stream $B$r2rFI$9$k!#(B
X                -m0   MIME $B$r2rFI$7$J$$!#(B
X
X        -l      0x80-0xfe$B$N%3!<%I$r(BISO-8859-1 (Latin-1)$B$H$7$F07$&!#(B
X                JIS$B%3!<%I%"%&%H%W%C%H$H$NAH9g$;$_$N$_M-8z!#(B
X                -s, -e, -x$B$H$ON>N)$7$J$$!#(B
X
X        -f?    $B0l9T(B?$BJ8;z$K$J$k$h$&$K4JC1$J@07A$r$*$3$J$&!#%G%U%)%k%H$O(B
X                60$BJ8;z$G$"$k!#(B
X
X        -Z      X0208$BCf$N1Q?t;z$H<c43$N5-9f$r(BASCII$B$KJQ49$9$k!#(B
X                -Z1 $B$O(BX0208$B4V3V$r(BASCII space$B$KJQ49$9$k!#(B
X                -Z2 $B$O(BX0208$B4V3V$r(BASCII space $BFs$D$KJQ49$9$k!#(B
X
X
X        -J -E -S -X -B
X                $B4|BT$5$l$kF~NO%3!<%I$N@-<A$r;XDj$9$k!#(B
X                -J     ISO-2022-JP$B$r2>Dj$9$k!#(B
X                -E     $BF|K\8l(BEUC(AT&T)$B$r2>Dj$9$k!#(B
X                -S     MS$B4A;z$r2>Dj$9$k!#(BX0201$B2>L>$b2>Dj$5$l$k!#(B
X                -X     MS$B4A;zCf$K(BX0201$B2>L>$,$"$k$H2>Dj$9$k!#(B
X                -B     $B2u$l$?(B(Broken)JIS$B%3!<%I!#(BESC$B$,$J$/$J$C$?$H2>Dj$9$k!#(B
X                    -B1  ESC-(, ESC-$ $B$N$"$H$N%3!<%I$rLd$o$J$$(B
X                    -B2  $B2~9T$N$"$H$K6/@)E*$K(BASCII$B$KLa$9(B
X
X        -x      $BDL>o$*$3$J$o$l$k(BX0201$B2>L>(B->X0208$B$N2>L>JQ49$r$7$J$$$G!"(B
X                X0201$B2>L>$rJ]B8$9$k!#F~NO$O!"(BMS-Kanji$B$N(B1byte$B2>L>!"(BSO/SI$B!"(B
X                ESC-(-I, SSO$B$r<u$1IU$1$k!#=PNO$O!"F|K\8l(BEUC$BCf$G$O(BSSO$B!"(B
X                JIS$B$G$O(B ESC-'('-I $B$r;H$&!#(B
X
X	-O	$B%U%!%$%k(B out_file $B$K=PNO$,J]B8$5$l$^$9!#%U%!%$%kL>$,;XDj$5$l(B
X		$B$F$$$J$$>l9g$O!"(B'nkf.out'$BKt$O(B'wnkf.out'$B$K=PNO$9$k!#(B
X
X	-c	$B9TKv$K(BCR$B%3!<%I(B(0D)$B$rDI2C(B($B3HD%5!G=(B -T $B$HJ;MQIT2D(B)
X	
X	-d	$B9TKv$+$i(BCR$B%3!<%I(B(0D)$B$r:o=|(B($B3HD%5!G=(B -T $B$HJ;MQIT2D(B)
X
X
AUTHOR
X
X$B;T@n(B  $B;j(B        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 $BB>!"(Bfujitsu & flab.fujitsu$B$N3'$5$s$N6(NO$K46<U!#(B
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$B<B$O!"F~NO$N%3!<%I7O$NH=Dj$O!"(BEUC$B$H%7%U%H(BJIS$B$H$N<+F0H=Dj$G$"$j!":G=i$K(B
X$BFCDj$G$-$kJ8;z$,Mh$?;~E@$G3NDj$7$F$7$^$&!#$=$7$F!"FCDjITG=$N4V$OJ]N1%P%C(B
X$B%U%!$K$?$a$F$*$+$l!"3NDj8e$K=hM}$5$l$k!#$3$N$?$a!"(B
X
X        1)7$B%S%C%H(BJIS$B$O>o$KG'<1$5$l$k!#%7%U%H(BJIS$B!"(BEUC$B:.9g$b$[$H$s$I$N(B
X          $B>l9g$OLdBj$,$J$$!#$?$@$7!"(B
X
X        2)$B%7%U%H(BJIS$B$N(BX0201$B2>L>$H(BEUC$B$,<1JL$G$-$J$$!#$7$?$,$C$F!"(B
X          $B%G%U%)%k%H$G$O%7%U%H(BJIS$B$N(BX0201$B2>L>$O$J$$$H2>Dj$7$F$$$k!#(B
X
X        3)$B$A$g$C$H!"$N$m$$!#(B($B=i4|$NHG$h$j$O2~NI$5$l$F$$$k(B)
X
JIS$B4A;z$N?75lHG$N6hJL$H$+!"(BASCII$B$H(BJIS$B%m!<%^;z$N6hJL$J$I$K$D$$$F$OJ]B8$5(B
X$B$l$J$$!#(B
X
X$B$3$N%U%#%k%?$NJQ49$O!"%3!<%I7O$KBP1~$7$?0l3g<LA|$r;\$9$@$1$J$N$G!"30;z(B
X$B$dFC<l5-9f$d7S@~AGJR$J$I!"(BJIS$BBh0l!"BhFs?e=`I=$K$*$$$FDj5A$5$l$F$$$J$$%3!<(B
X$B%I$K3F<R$K$h$j3d$jEv$F$i$l$?J8;z$,$I$&$J$k$+$^$G$O4XCN$7$J$$!#$=$7$F!"Bh(B
X$BFs?e=`$,$J$$$H$+$"$k$H$+$K$h$kLdBj$O!"$3$N%U%#%k%?$NHO0O30$H;W$($k!#$=$l(B
X$B$i$O!"=q$-<j$N@UG$$G$J$s$H$+$7$F$b$i$$$?$$!#(B
X
X$B$$$:$l$K$;$h!"DL>o$N%K%e!<%9$N5-;v$K$D$$$F$OLdBj$O$J$/JQ49$G$-$k$O$:$G(B
X$B$"$k!#(B($B$H;W$&$N$@$,!":#$R$H$D<+?.$O$J$$(B)
X
kono@csl.sony.co.jp (Shinji Kono) $B$K$h$kJQ99!#(B
X
nkf 1.4 $B$N>iD9$@$1$I@N$OJXMx$@$C$?%*%W%7%g%s$N$$$/$D$+$O:o=|$5$l$F$$$k!#(B
-n -B$B$J$I!#(B
X
XX0201$B2>L>$O%G%U%)%k%H$G(BX0208$B$KJQ49$5$l$k!#$?$@$7!"%7%U%H(BJIS$B$N(BX0201$B2>L>(B
X$B$O%G%U%)%k%H$G$O(BEUC$B$@$H2r<a$5$l$F$7$^$&!#$3$l$,K>$^$7$/$J$$;~$K$O(B -S $B$d(B
-X $B$J$I$N%U%i%0$r;H$($PNI$$!#(B-X$B$r;XDj$9$k$H0lC63NDj$7$?%7%U%H(BJIS$B$+$i(B 
EUC$B$K0\9T$9$k$3$H$O$J$$!#(BESC-(-I$B$K$h$k(B X0201$B$O>o$KG'<1$5$l$k!#(BSI/SO
SSO$B$O!"(B-l$B$,;XDj$5$l$F$$$J$1$l$P(BX0201$B$H2r<a$9$k!#(B
X
MIME decode$B$O!"(BISO-2022-JP$B$N(Bbase64$B$H!"(BISO-8859-1$B$N(B16$B?J(Bencode$B$N$_(B
decode$B$9$k!#(B MIME decode$B$O!"C1=c$J2~9T$d6uGr$O0BA4$KFI$_Ht$P$5$l$k!#(B
X$B$H$$$&$3$H$O!"(B MIME decode$BCf$N6uGr$OJ]B8$5$l$J$$!#(Bless$B$d(Brn$B$G9T$,J,3d(B
X$B$5$l$?;~$O!"(B Terminal$B$K$h$C$F0[$J$k(B ESC-[-K $B$J$I$,A^F~$5$l$k$N$G!"(B
X$B40A4$K$O(Bdecode $B$G$-$J$$!#(BISO-8859-1 $B=PNO$O(BJIS $B%3!<%I=PNO$H$7$+N>N)$7$J$$!#(B
X
Fold $B5!G=$O(Bfmt$B$H0[$J$j9TF,$N6uGr$rL5;k$9$k!#6XB'=hM}$O$"$k$,;XDj$5$l$?(B
X$BD9$5(B+5$B$G6/@)2~9T$9$k!#(B
X
XX0201$B2>L>$O(Brot47$B$5$l$J$$!#(B
X
nkf 1.6
X
kono@ie.u-ryukyu.ac.jp (Shinji Kono) $B$K$h$kJQ99!#(B
X
MIME $B$N%A%'%C%/$r$-$S$7$/$7$F(B($BCY$/$J$C$?J,(B)$B0BA4$K$J$C$?!#(B
X$B$7$?$,$C$FJ#?t9T$K$^$?$,$k(BMIME$B$O(Bdecode$B$5$l$J$$!#(B
MIME $B$ND>8e$N6uGr$OFI$_Ht$P$9!#(BQ-Encding $B$N(B_$B$O6uGr$KJQ49$5$l$k!#(B
X -B $B$N(Blevel$B$r(B0,1,2 $B$KA}$d$7$?!#(BMIME$B$N(Bbase64, Q-Encoding$B$r2rFI$9$k(B
X$B5!G=$rIU$1$?!#%X%C%@$J$I$O2rFI$7$J$$$N$G!"(BEncode$B$5$l$?ItJ,$@$1$r(B
X$BDL$9I,MW$,$"$k!#(B -mB $B$O!"(Bnkf1.5$B$H0c$&F0$-$r$9$k$N$G!"(B-B -m $B$H$9$k$3$H!#(B
X
nkf 1.6.1
X
X -Z $B$G!A(B -> ~$B$NJQ49$r;_$a$?!#(B
X -Z1 $B$G(BX0208$B4V3V(B->ASCII space$B$NJQ49$r$*$3$J$&!#(B
X -Z2 $B$G(BX0208$B4V3V(B->ASCII space 2$B8D$NJQ49$r$*$3$J$&!#(B
X
X kabe@dais.is.tohoku.ac.jp (Taketo Kabe) $B$K$h$kF|K\8l(Broff $B$N%=!<%9$,(B
X $B$D$-$^$7$?!#(B
X
========
nkf 1.62
X
GHG00637@niftyserve.or.jp (COW) $B$K$h$kJQ99(B
X
X$B!!;T@n;a$N(Bnkf$B$O!"(BUNIX$BMQ$N%D!<%k$G$"$k$N$G!"=PNO$N%G%U%)%k%H$N@_Dj$,(B7bit
X$B$N(BJIS$B%3!<%I$G$"$C$?$b$N$r!"(BDOS,Windows$BHG$G$O!"(BS-JIS$B%3!<%I$r=PNO%G%U%)%k(B
X$B%H$K@_Dj$7$?!#$3$l$K$h$j!"(BUNIX$B$G:n@.$5$l$?%U%!%$%k$r!"(BDOS,Windows$B>e$G1\(B
X$BMw$9$k$3$H$,$G$-$k!#$=$NB>$N5!G=DI2C$H$7$F%P!<%8%g%s>pJs$H;HMQJ}K!$rI=<((B
X$B$9$k$h$&$K$7!"%U%!%$%k=PNO5!G=$rDI2C$7$?!#!J:F%3%s%Q%$%k$GJQ992DG=!K(B
X
Windows16bit$BHG$N$_$N3HD%$K$D$$$F(B
X
X$B!!(BWindows16bit$BHG$K$D$$$F$O!"%j%@%$%l%/%H$d%Q%$%W5!G=$,;H$($^$;$s!#$h$C$F$3$N(B
X$B>l9g$K$O(B-O$B%*%W%7%g%s$rMxMQ$7$F%U%!%$%k=PNO$5$l$?$b$N$rMxMQ$7$F$b$i$$$?$$!#(B
X
X$BNc!'!!(Bwnkf -e -O nkf.in nkf.out ...nkf.in$B$r(BEUC$B%3!<%I$G(Bnkf,out$B$K=PNO$9$k!#(B
X
X$B!!(BWindows16bit$BHG$G$O!"I8=`=PNO5Z$S%(%i!<=PNO$,%&%$%s%I%&2hLL$K$J$j$^$9!#I8=`(B
X$B=PNO$N>l9g$O%9%/%m!<%kF0:n$,DI2C$5$l$F$*$j!"2hLL$,N.$l$J$$$h$&$K$J$C$F$$$k!#(B
X$B$@$@$7!"(B-O$B%*%W%7%g%s$r;XDj$7$?>l9g$K$O%U%!%$%k$K=PNO$5$l$k$?$a!"2hLL$K(B
X$B$O2?$bI=<($5$l$J$$!#(B
X$B$^$?!"(BEasyWin$B$N%P!<%8%g%s%"%C%W$G!"(B400$B9T$^$G$N%/%j%C%W%\!<%IE>Aw$H0u:~$b(B
X$B2DG=$H$J$C$?!#$^$?!"%I%i%C%0!&%"%s%I!&%I%m%C%W$K$bBP1~$7$F$$$k!#(B
X
X$B!!(BUNIX$B%U%!%$%k$N(BViewer$B$H$7$F;H$&$K$O!"0J2<$N$h$&$K;HMQ$9$k!#$3$l$O3HD%;R(B
X$B$r4XO"$E$1$7$F$b;HMQ2DG=$H;W$o$l$k!#(B
X
X$BNc!'!!(Bwnkf in.euc ...EUC$B%3!<%I$N%U%!%$%k$r(BS-JIS$B$G1\Mw(B
X$B!!!!!!(Bwnkf in.jis ...JIS$B%3!<%I$N%U%!%$%k$r(BS-JIS$B$G1\Mw(B
X
X$B$J$*!"$3$N(Bwnkf.exe$B$O(BDOS$BAk>e$G$O5/F0$G$-$J$$$N$G!"%3%^%s%I%i%$%s$G!"(B
Windows16bit$B%=%U%H$,F0:n$G$-$k4D6-$G$"$k(BComWin,ComRun$BEy$rMxMQ$7$F$[$7$$!#(B
(Windows95/NT$B$G$"$l$P!"%3%s%=!<%k$+$i<B9T$,2DG=$G$"$k!#(B)
X
DOS,OS/2,Windows32bit$BHG$K$D$$$F(B
X
X$B!!(BDOS,OS/2,Windows32bit$BHG$O(BUNIX$B$HF1$8$h$&$K%Q%$%W5Z$S%j%@%$%l%/%H$,2DG=(B
X$B$G$"$k!#$h$C$F!"0J2<$N$h$&$K$7$F$b%U%!%$%k=PNO2DG=$G$"$k!#(B
X
X$BNc!'!!(Bnkf -e nkf.in > nkf.out ...nkf.in$B$r(BEUC$B%3!<%I$G(Bnkf,out$B$K=PNO$9$k!#(B
X
X$B!!(BViewer$B$H$7$F;HMQ$9$k>l9g$O0J2<$N$h$&$K$9$k!#(B
X
X$BNc!'!!(Bnkf in.euc | more ...EUC$B%3!<%I$N%U%!%$%k$r(BS-JIS$B$G1\Mw(B
X$B!!!!!!(Bnkf in.jis | more ...JIS$B%3!<%I$N%U%!%$%k$r(BS-JIS$B$G1\Mw(B
X
X  DOS,Windows$B$H(BUNIX$B4V$N%G!<%?JQ495!G=$K$D$$$F$O!"2~9T%3!<%I$N(BCR(0D)$B$r:o=|(B
X$B$7$?$jDI2C$7$?$j$9$k5!G=$rDI2C$7$?!#(B(UNIX$B$N%"!<%+%$%V$rE83+$7$?;~$KJXMx(B)
X
X$BNc!'(B nkf -j -d nkf.man > nkf.jis ...nkf.man$B$r(BCR$B$r:o=|$7$F(BJIS$B%3!<%I$K(B
X                                       $BJQ49$7!"(Bnkf.jis$B$K=q$-9~$`!#(B
X
X$B!!(B-O$B%*%W%7%g%s$b;H$($k$h$&$KJQ99$7$?$N$G!">e5-$NNc$O<!$N$h$&$K;HMQ2DG=(B
X$B!!$3$N%3%^%s%I%i%$%s$G%"%W%j$NCf$+$iD>@\5/F0$G$-$FJXMx$N$O$:$G$9$,!&!&(B
X
X$BNc!'(B nkf -j -d -O nkf.man nkf.jis
X
X$BDI2C%*%W%7%g%s$NMxMQ$K$D$$$F!"(B
X
X  $BDI2C$5$l$?(B-c,-d$B%*%W%7%g%s$O!"(Bftp$B$GE>Aw$5$l$?%P%$%J%j05=L2rE`8e$N%F%-%9%H(B
X$B$r(BUNIX$B$H(BDOS Windows$B4V$G;HMQ$G$-$k$h$&$K2~9T%3!<%I$rJQ49$9$k$N$KMxMQ$G$-$k(B
X$B$H;W$&!#DL>o$O(B-T$B%*%W%7%g%s$@$1$G$b==J,$G$"$m$&!#(B
X
X$B?7(BOS/2$BHG;HMQ$K$*$1$kCm0U(B
X
X$B!!$3$N?7(BOS/2$BHG$rMxMQ$9$k$K$O!"(BGNU$B$K$h$k(Bemx 0.8h$B0J9_$N4D6-$OITMW$G$9!#(B
X$B!!0J2<$K(BIBM VisualAge C++3.0$B$G$N<B9T%U%!%$%k:n@.<j=g$r<($9!#(B
X   icc /Fe nkf2.exe nkf.c
X
X$BJQ99MzNr(B
X
X$B$3$N(Bnkf$B$O!"(B1995$BG/(B3$B7n(B1$BF|HG$+$i$N:9J,%Q%C%A(B1.5$B$r%Y!<%9$K5!G=3HD%$7$?$b$N$G$"$k!#(B
X$B$3$N$?$a!"A02s8x3+$7$?(BVersion 1.43$B$h$j(B-O$B%*%W%7%g%s$,(BWindows16bit$B$@$1$KJQ99$5(B
X$B$l!"(BWindows16bit$BHG$O!"2hLL%9%/%m!<%k$H%/%j%C%/%\!<%IE>Aw$H0u:~5!G=$,DI2C$5$l(B
X$B$?!#(B
X$B0JA0$N%P!<%8%g%s$G$O!"(BJIS$BJQ49;~$K>c32$,$"$j!"(B-O$B%*%W%7%g%s$N%9%H%j!<%`$N;HMQJ}(B
X$BK!$rJQ99$7$?!#$^$?!";d(BCOW$B$O!":G6a%$%s%?!<%M%C%H$K@\B3$7$?$,!"(BNews$B$K;22C$7$F$$(B
X$B$J$$$?$a!":G?7$G$J$$$+$b$7$l$J$$$N$O!"4*J[$7$F$$$?$@$-$?$$!#(B
X
Ver1.52$B$K$*$$$FJQ49$N%G%U%)%k%HI=<($N4V0c$$Ey$r=$@5$7$?!#?=$7Lu$J$$!#(B
Ver1.53$B$K$*$$$F(Bnkf,nkf32,nkf2$B$N(B-O$B%*%W%7%g%s$rI|3h$7$?!#(B($BJ}?K$,5$$^$0$l$@(B)
($B%3%^%s%I%7%'%k$r%"%W%j$+$i<B9T$9$k$N$K(B>$B$d(B|$B$,G'<1$5$l$J$$LdBj$,$"$k$?$a(B)
X$B$^$?!"(BOS/2$B$K$*$1$k(B-c,-d$B%*%W%7%g%s;XDj;~$K%P%$%J%j%b!]%I$K$J$i$J$+$C$?(B
X$B$?$a!"2~9T%3!]%IJQ49$,$G$-$J$$%P%0$r=$@5$7$?!#(B(icc$B$N;EMM$,FC<l$G$"$C$?!#(B)
X$B$=$l$KIU?o$7$F!"$=$NB>(B-c,-d$B%*%W%7%g%s$N(BJIS,EUC$B%b!<%I$G$NIT6q9g$b=$@5$7$?!#(B
Ver1.54$B$K$*$$$F(B-m$B%*%W%7%g%s$G(BMIME$B%(%s%3!<%I$5$l$?J8;zNs$N07$$$N%X%C%@!<ItJ,$,!"(B
X  $B$+$:$d$s(B
X$B$^$?$O!"(B
X  $B$+$:$d$s(B
X$B$N>l9g$G$b@5>o$KJQ49$G$-$k$h$&$K=$@5$7$?!#(B
Ver1.62$B$K$*$$$F(Bkono$B;a$N(BVer1.6$B$N(B-Z,-B level$B%*%W%7%g%sDI2C5!G=$KBP=h$7$?!#(B
X$B$=$l0J30$K(B-c$B%*%W%7%g%s$N%P%0=$@5$r$*$3$J$C$?!#(B
X$B%G%U%)%k%H$N=PNO%3!<%I$rA*Br$G$-$k$h$&$K%=!<%9$rJQ99$7$?!#(B
X
X$B%Q%C%A$K$D$$$F(B
X
nkf $B$K$O?tB?$/$NHs8x<0%Q%C%A$,B8:_$9$k!#:#$^$G$=$l$i$rJT=8$7$F(B
X$B$-$?$o$1$@$,!":#2s!V7hDjHG!W$H$7$F%*%j%8%J%k$+$i$N%Q%C%A0lK\$K(B
X$B=8Ls$7$?!#$b$A$m$s!":NMQ$7$?%Q%C%A$N=PE5$OL@5-$7$F$"$k!#%Q%C%A(B
X$B$d%I%-%e%a%s%H$r=q$$$??M$N$&$A!"K\%Q%C%1!<%8$K4X$o$C$F$$$k$N$O(B
X$B0J2<$K<($9DL$j$G$"$k!#(B($B=gITF1!"7I>NN,(B)
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$B:G8e$K(B
X
nkf$B$r(BGUI$B2=$7$?(BEasy nkf$B$r8x3+$7$F$$$^$9!#(B(http://www.mirai.or.jp/~cow/)
X$BB>$N%=%U%H$b$3$m$,$C$F$$$^$9$N$G!"2K$J?M$OGA$$$F$_$F$/$@$5$$!#(B
X
nkf 1.7
X
ESC-$-(-B $B$J$I$K$bBP1~$9$k$h$&$K$7$^$7$?!#(B
X
MIME$B$N%A%'%C%/$,87$7$9$.$k$h$&$K;W$&$N$G!"(BSTRICT_MIME $B$r(Bdefine
X$B$7$?;~$K$N$_$K87$7$$%A%'%C%/$r9T$&MQ$K$7$^$7$?!#(B
X
nkf $B$O!"K\Mh!"(Bnetwork $B>e$K=P$7$F0BA4$J%3!<%I$r%G%U%)%k%H$G=PNO$9$Y$-(B
X$B$G$"$k$N$G!"%G%U%)%k%H$N=PNO%3!<%I$r(BShift JIS, EUC $B$J$I$K$9$k$N$O(B
X$BK>$^$7$/$J$$$G$7$g$&!#(B
X
X$BB>$N?M$H>/$7OC$7$F!"(Bcopy right $B$NHs1DMx$N>r7o$r4K$a$^$7$?!#(B
X
Perl Extension $B$H$7$F;H$($k$h$&$K$J$j$^$7$?!#(B
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$BB.$$(B!
X
patch 1 for 1.7
X
version $B$,4V0c$C$F$^$7$?!#(B
X
MIME decode $B$r%G%U%)%k%H$K$7$?$N$K!"(BMIME $B$N>r7o$r4K$a$?$N$,(B
X$B>/$74K$a2a$.$N$h$&$G$9$M!#(Buuencode $B$H$+$,$R$C$+$+$C$F$7$^$&!#(B
STRICT_MIME $B$r(B define $B$9$l$P$$$$$N$G$9$,!"$A$g$C$H(B syntax error
X$B$$$l$F$7$^$$$^$7$?!#(B
X
define STRICT_MIME $B$r%G%U%)%k%H$KD>$7$^$7$?!#$^$!!";EJ}$J$$$+$J$!!#(B
X
X$B<!$N(B nkf 1.9 $B$G$O!"(Bcommand option $B$G@Z$jBX$($i$l$k$h$&$K$J$j$^$9!#(B
X
X$B$"$H(B NKF.xs $B$G(B 
X    argc = items - 1;
X$B$r;H$&$h$&$K$7$^$7$?!#(B(by $BLZB<(B $B4`(B <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 \- $B%M%C%H%o!<%/MQ4A;z%3!<%IJQ49%U%#%k%?(B v1.7
X.SH SYNOPSIS
X.B nkf
X.RI [ options ]
X.RI [ file ]
X.SH DESCRIPTION
\fInkf\fP$B$O%M%C%H%o!<%/$G%a!<%k$d%K%e!<%9$NFI$_=q$-$r$9$k$?$a$K:n$i$l$?!"4A(B
X$B;z%3!<%I$NJQ49%U%#%k%?$G$"$k!#(B
X.PP
X$B$3$N(B\fInkf\fP$B$NFCD'$H$7$F$O!"F~NO4A;z%3!<%I7O$NE}7WE*$J<+F0G'<15!G=$,$"$k!#(B
X$B$3$N$?$a!"MxMQ<T$O!"F~NO4A;z%3!<%I7O$,2?$G$"$k$+$rCN$i$J$/$F$b!"=PNO4A;z(B
X$B%3!<%I7O$N$_;XDj$9$l$PNI$$$3$H$K$J$k!#$?$@!"$3$NH=Dj5!9=$O!"M}O@E*$K$O40(B
X$BA4$G$O$J$$$,!"DL>o$N%K%e!<%9$d%a!<%k$N%a%C%;!<%8$K$D$$$F$O3N<B$KF0:n$9$k(B
X$B0BA4$J$b$N$K$O$J$C$F$$$k!#(B
X.PP
X$B8=:_!"(B\fInkf\fP$B$,G'<1$G$-$kF~NO$N4A;z%3!<%I7O$O!"$$$o$f$k!V(BJIS$B%3!<%I!W(B(ISO-
2022-JP$B$K4p$E$/$b$N(B)$B!"(BMS$B4A;z%3!<%I(B($B%7%U%H(BJIS)$B!"F|K\8l(BEUC(AT&T$B%3!<%I(B)$B$N$$(B
X$B$:$l$+$G$"$k!#=PNO$9$k4A;z%3!<%I7O$b!"$3$N(B3$B<oN`$G$"$k!#(B
X.PP
X$BF~NO$O!"%U%!%$%k$r;XDj$7$J$1$l$P!"I8=`F~NO$H$J$k!#=PNO$OI8=`=PNO$G$"$k!#(B
X.PP
X$B;XDj$G$-$k%*%W%7%g%s$O!"0J2<$NDL$j!#(B\fB\-mu\fP $B$N$h$&$KB3$1$k$3$H$,$G$-$k!#(B
X.TP
X.B \-b
X$B%P%C%U%!%j%s%0=PNO$r9T$&!#(B($B%G%U%)%k%H(B)
X.TP
X.B \-u
X$B=PNO;~$K!"%P%C%U%!%j%s%0$7$J$$!#(B
rsh localhost | nkf \-u $B$H$$$&$h$&$K;H$&!#(B
X.TP
X.B \-t
X$B2?$b$7$J$$!#(B
X.TP
X.B \-j
JIS$B%3!<%I$r=PNO$9$k!#(B($B%G%U%)%k%H(B)
X.TP
X.B \-e
EUC$B%3!<%I$r=PNO$9$k!#(B
X.TP
X.B \-s
X$B%7%U%H(BJIS$B%3!<%I$r=PNO$9$k!#(B
X.TP
X.BI \-i ?
JIS$B4A;z$r;X<($9$k%7!<%1%s%9$H$7$F(B \fBESC-'$'-\fP\fI?\fP$B$r;HMQ$9$k!#(B
($B%G%U%)%k%H$O!"(BESC-'$'-'B')
X.TP
X.BI \-o ?
1$B%P%$%H1Q?tJ8;z%;%C%H$r;X<($9$k%7!<%1%s%9$H$7$F!"(B\fBESC-'('-\fP\fI?\fP$B$r;HMQ$9(B
X$B$k!#(B
($B%G%U%)%k%H$O!"(BESC-'('-'B')
X.TP
X.B \-r
ROT13/47$B$NJQ49$r$9$k!#(B
X.TP
X.B \-v
X$B%P!<%8%g%s$rI=<($9$k!#(B
X.TP
X.B \-T
X$B%F%-%9%H%b!<%I$G=PNO$9$k!#(B(MS-DOS$B>e$G$N$_8zNO$r;}$D(B)
X.TP
X.B \-m[QB0]
MIME $B$r2rFI$9$k!#(B($B%G%U%)%k%H(B) ISO-2022-JP(base64)$B$H(BISO-8859-1(Q encode)
X$B$N$_$r2rFI$9$k!#(BISO-8859-1 (Latin-1) $B$r2rFI$9$k;~$O!"(B
-l$B%U%i%0$bI,MW$G$"$k!#(B\-m0 $B$G$O(BMIME$B$r2rFI$7$J$$!#(B\-mQ, \-mB$B$G$O!"(B
Q encode, B encode $B$5$l$F$$$k$b$N$H$7$F=hM}$9$k!#(B
X.TP
X.B \-l
0x80-0xfe$B$N%3!<%I$r(BISO-8859-1 (Latin-1)$B$H$7$F07$&!#(B
JIS$B%3!<%I%"%&%H%W%C%H$H$NAH9g$;$_$N$_M-8z!#(B
\-s, \-e, \-x$B$H$ON>N)$7$J$$!#(B
X.TP
X.BI \-f ?
X$B0l9T(B\fI?\fP$BJ8;z$K$J$k$h$&$K4JC1$J@07A$r$*$3$J$&!#%G%U%)%k%H$O(B
60$BJ8;z$G$"$k!#(B
X.TP
X.B \-Z
XX0208$BCf$N1Q?t;z$H<c43$N5-9f$r(BASCII$B$KJQ49$9$k!#(B\-Z1 $B$O(BX0208$B4V3V$r(BASCII
space$B$KJQ49$9$k!#(B\-Z2$B$O(BX0208$B4V3V$r(BASCII space $BFs$D$KJQ49$9$k!#<qL#$K$h$C$F(B
X$B;H$$J,$1$F$[$7$$!#(B
X.TP
X.B "\-J \-E \-S \-X \-B"
X$B4|BT$5$l$kF~NO%3!<%I$N@-<A$r;XDj$9$k!#(B
X.RS
X.IP \fB\-J\fP
ISO-2022-JP$B$r2>Dj$9$k!#(B
X.IP \fB\-E\fP
X$BF|K\8l(BEUC(AT&T)$B$r2>Dj$9$k!#(B
X.IP \fB\-S\fP
MS$B4A;z$r2>Dj$9$k!#(BX0201$B2>L>$b2>Dj$5$l$k!#(B
X.IP \fB\-X\fP
MS$B4A;zCf$K(BX0201$B2>L>$,$"$k$H2>Dj$9$k!#(B
X.IP \fB\-B\fP
X$B2u$l$?(B(Broken)JIS$B%3!<%I!#(BESC$B$,$J$/$J$C$?$H2>Dj$9$k!#(B
X.RS
X.IP \fB\-B1\fP
X \fBESC-(\fP, \fBESC-$\fP $B$N$"$H$N%3!<%I$rLd$o$J$$(B
X.IP \fB\-B2\fP
X$B2~9T$N$"$H$K6/@)E*$K(BASCII$B$NLa$9(B
X.RE
X.RE
X.TP
X.B \-x
X$BDL>o$*$3$J$o$l$k(BX0201$B2>L>(B->X0208$B$N2>L>JQ49$r$7$J$$$G!"(B
X X0201$B2>L>$rJ]B8$9$k!#F~NO$O!"(BMS-Kanji$B$N(B1byte$B2>L>!"(BSO/SI$B!"(B
ESC-(-I, SSO$B$r<u$1IU$1$k!#=PNO$O!"F|K\8l(BEUC$BCf$G$O(BSSO$B!"(B
JIS$B$G$O(B ESC-'('-I $B$r;H$&!#(B
X.TP
X.B \-O
X$B%U%!%$%k$K=PNO$9$k!#(BUnix$B$G$OITMW$J5!G=$@$,(BWindows$B$d(BMSDOS$B$G$O(B
X$BI,MW$i$7$$!#D>8e$N0z$-?t$G$J$/!":G8e$N%U%!%$%kL>$,=PNO%U%!%$(B
X$B%kL>$H$J$j>e=q$-$5$l$F$7$^$&$N$GCm0U!#%U%!%$%kL>$,$J$$>l9g$O!"(B
X$BE,Ev$K7h$a$i$l$k(B(nkf.out$B$J$I(B)$B!#(B
X.TP
X.B \-c
NL$B$"$H$K(BCR$B$rIU2C$9$k!#(B
X.TP
X.B \-d
NL$B$"$H$N(BCR$B$r:o=|$9$k!#(B
X
X.SH AUTHOR
X
X$B;T@n(B  $B;j(B	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 $BB>!"(Bfujitsu & flab.fujitsu$B$N3'$5$s$N6(NO$K46<U!#(B
shinoda@cs.titech, kato@cs.titech, uematsu@cs.titech  TNX
kono@ie.u-ryukyu.ac.jp
X
X.SH BUGS
X
X$B<B$O!"F~NO$N%3!<%I7O$NH=Dj$O!"(BEUC$B$H%7%U%H(BJIS$B$H$N<+F0H=Dj$G$"$j!":G=i$K(B
X$BFCDj$G$-$kJ8;z$,Mh$?;~E@$G3NDj$7$F$7$^$&!#$=$7$F!"FCDjITG=$N4V$OJ]N1%P%C(B
X$B%U%!$K$?$a$F$*$+$l!"3NDj8e$K=hM}$5$l$k!#$3$N$?$a!"(B
X.IP 1)
7$B%S%C%H(BJIS$B$O>o$KG'<1$5$l$k!#%7%U%H(BJIS$B!"(BEUC$B:.9g$b$[$H$s$I$N(B
X$B>l9g$OLdBj$,$J$$!#$?$@$7!"(B
X.IP 2)
X$B%7%U%H(BJIS$B$N(BX0201$B2>L>$H(BEUC$B$,<1JL$G$-$J$$!#$7$?$,$C$F!"(B
X$B%G%U%)%k%H$G$O%7%U%H(BJIS$B$N(BX0201$B2>L>$O$J$$$H2>Dj$7$F$$$k!#(B
X.IP 3)
X$B$A$g$C$H!"$N$m$$!#(B($B=i4|$NHG$h$j$O2~NI$5$l$F$$$k(B)
X.PP
JIS$B4A;z$N?75lHG$N6hJL$H$+!"(BASCII$B$H(BJIS$B%m!<%^;z$N6hJL$J$I$K$D$$$F$OJ]B8$5(B
X$B$l$J$$!#(B
X.PP
X$B$3$N%U%#%k%?$NJQ49$O!"%3!<%I7O$KBP1~$7$?0l3g<LA|$r;\$9$@$1$J$N$G!"30;z(B
X$B$dFC<l5-9f$d7S@~AGJR$J$I!"(BJIS$BBh0l!"BhFs?e=`I=$K$*$$$FDj5A$5$l$F$$$J$$%3!<(B
X$B%I$K3F<R$K$h$j3d$jEv$F$i$l$?J8;z$,$I$&$J$k$+$^$G$O4XCN$7$J$$!#$=$7$F!"Bh(B
X$BFs?e=`$,$J$$$H$+$"$k$H$+$K$h$kLdBj$O!"$3$N%U%#%k%?$NHO0O30$H;W$($k!#$=$l(B
X$B$i$O!"=q$-<j$N@UG$$G$J$s$H$+$7$F$b$i$$$?$$!#(B
X.PP
X$B$$$:$l$K$;$h!"DL>o$N%K%e!<%9$N5-;v$K$D$$$F$OLdBj$O$J$/JQ49$G$-$k$O$:$G(B
X$B$"$k!#(B($B$H;W$&$N$@$,!":#$R$H$D<+?.$O$J$$(B)
X
X.SH "kono@csl.sony.co.jp (Shinji Kono) $B$K$h$kJQ99!#(B"
X
nkf 1.4 $B$N>iD9$@$1$I@N$OJXMx$@$C$?%*%W%7%g%s$N$$$/$D$+$O:o=|$5$l$F$$$k!#(B
\- \-n \-B$B$J$I!#(B
X.PP
XX0201$B2>L>$O%G%U%)%k%H$G(BX0208$B$KJQ49$5$l$k!#$?$@$7!"%7%U%H(BJIS$B$N(BX0201$B2>L>(B
X$B$O%G%U%)%k%H$G$O(BEUC$B$@$H2r<a$5$l$F$7$^$&!#$3$l$,K>$^$7$/$J$$;~$K$O(B \-S $B$d(B
\- \-X $B$J$I$N%U%i%0$r;H$($PNI$$!#(B\-X$B$r;XDj$9$k$H0lC63NDj$7$?%7%U%H(BJIS$B$+$i(B 
EUC$B$K0\9T$9$k$3$H$O$J$$!#(BESC-(-I$B$K$h$k(B X0201$B$O>o$KG'<1$5$l$k!#(BSI/SO
SSO$B$O!"(B\-l$B$,;XDj$5$l$F$$$J$1$l$P(BX0201$B$H2r<a$9$k!#(B
X.PP
MIME decode$B$O!"(BISO-2022-JP$B$N(Bbase64$B$H!"(BISO-8859-1$B$N(B16$B?J(Bencode$B$N$_(B
decode$B$9$k!#(B MIME decode$B$O!"C1=c$J2~9T$d6uGr$O0BA4$KFI$_Ht$P$5$l$k!#(B
X$B$H$$$&$3$H$O!"(B MIME decode$BCf$N6uGr$OJ]B8$5$l$J$$!#(Bless$B$d(Brn$B$G9T$,J,3d(B
X$B$5$l$?;~$O!"(B Terminal$B$K$h$C$F0[$J$k(B ESC-[-K $B$J$I$,A^F~$5$l$k$N$G!"(B
X$B40A4$K$O(Bdecode $B$G$-$J$$!#(BISO-8859-1 $B=PNO$O(BJIS $B%3!<%I=PNO$H$7$+N>N)$7$J$$!#(B
X.PP
Fold $B5!G=$O(Bfmt$B$H0[$J$j9TF,$N6uGr$rL5;k$9$k!#6XB'=hM}$O$"$k$,;XDj$5$l$?(B
X$BD9$5(B+5$B$G6/@)2~9T$9$k!#(B
X.PP
XX0201$B2>L>$O(Brot47$B$5$l$J$$!#(B
X
X.SH nkf 1.6 "kono@ie.u-ryukyu.ac.jp (Shinji Kono) $B$K$h$kJQ99!#(B"
X
MIME $B$N%A%'%C%/$r$-$S$7$/$7$F(B($BCY$/$J$C$?J,(B)$B0BA4$K$J$C$?!#(B
X$B$7$?$,$C$FJ#?t9T$K$^$?$,$k(BMIME$B$O(Bdecode$B$5$l$J$$!#(B
MIME $B$ND>8e$N6uGr$OFI$_Ht$P$9!#(BQ-Encding $B$N(B_$B$O6uGr$KJQ49$5$l$k!#(B
X -B $B$N(Blevel$B$r(B0,1,2 $B$KA}$d$7$?!#(BMIME$B$N(Bbase64, Q-Encoding$B$r2rFI$9$k(B
X$B5!G=$rIU$1$?!#%X%C%@$J$I$O2rFI$7$J$$$N$G!"(BEncode$B$5$l$?ItJ,$@$1$r(B
X$BDL$9I,MW$,$"$k!#(B -mB $B$O!"(Bnkf1.5$B$H0c$&F0$-$r$9$k$N$G!"(B-B -m $B$H$9$k$3$H!#(B
X
X.SH nkf 1.6.1
X
\-Z $B$G!A(B \-> ~$B$NJQ49$r;_$a$?!#(B
\-Z1 $B$G(BX0208$B4V3V(B\->ASCII space$B$NJQ49$r$*$3$J$&!#(B
\-Z2 $B$G(BX0208$B4V3V(B\->ASCII space 2$B8D$NJQ49$r$*$3$J$&!#(B
X.PP
kabe@dais.is.tohoku.ac.jp (Taketo Kabe) $B$K$h$kF|K\8l(Broff $B$N%=!<%9$,(B
X$B$G$-$^$7$?!#(B
X
X.SH nkf 1.7
X.PP
ESC-$-(-B $B$J$I$K$bBP1~$9$k$h$&$K$7$^$7$?!#(B
X.PP
MIME$B$N%A%'%C%/$,87$7$9$.$k$h$&$K;W$&$N$G!"(BSTRICT_MIME $B$r(Bdefine
X$B$7$?;~$K$N$_$K87$7$$%A%'%C%/$r9T$&MQ$K$7$^$7$?!#(B
X.PP
nkf $B$O!"K\Mh!"(Bnetwork $B>e$K=P$7$F0BA4$J%3!<%I$r%G%U%)%k%H$G=PNO$9$Y$-(B
X$B$G$"$k$N$G!"%G%U%)%k%H$N=PNO%3!<%I$r(BShift JIS, EUC $B$J$I$K$9$k$N$O(B
X$BK>$^$7$/$J$$$G$7$g$&!#(B
X.PP
X$BB>$N?M$H>/$7OC$7$F!"(Bcopy right $B$NHs1DMx$N>r7o$r4K$a$^$7$?!#(B
X.PP
Perl Extension $B$H$7$F;H$($k$h$&$K$J$j$^$7$?!#(B
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)
** $BO"Mm@h!'(B $B!J3t!KIY;NDL8&5f=j!!%=%U%H#38&!!;T@n!!;j(B 
** $B!J(BE-Mail Address: ichikawa@flab.fujitsu.co.jp$B!K(B
** Copyright (C) 1996,1998
** $BO"Mm@h!'(B $BN05eBg3X>pJs9)3X2J(B $B2OLn(B $B??<#(B  mine/X0208 support
** $B!J(BE-Mail Address: kono@ie.u-ryukyu.ac.jp$B!K(B
** $BO"Mm@h!'(B COW for DOS & Win16 & Win32 & OS/2
** $B!J(BE-Mail Address: GHG00637@niftyserve.or.p$B!K(B
**    $B$3$N%=!<%9$N$$$+$J$kJ#<L!$2~JQ!$=$@5$b5vBz$7$^$9!#$?$@$7!"(B
**    $B$=$N:]$K$O!"C/$,9W8%$7$?$r<($9$3$NItJ,$r;D$9$3$H!#(B
**    $B:FG[I[$d;(;o$NIUO?$J$I$NLd$$9g$o$;$bI,MW$"$j$^$;$s!#(B
**    $B$3$N%W%m%0%i%`$K$D$$$F$OFC$K2?$NJ]>Z$b$7$J$$!"0-$7$+$i$:!#(B
**    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 
**/
/******************************/
/* $B%G%U%)%k%H$N=PNO%3!<%IA*Br(B */
/* 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)) { /* $BByE@(B */
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                                    /* $BH>ByE@(B */
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 $BByE@(B/$BH>ByE@(B */
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)) { /* $BByE@(B */
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                                    /* $BH>ByE@(B */
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)) { /* $BByE@(B */
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                                /* $BH>ByE@(B */
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; /* $B!+(B*/
X        if(c1==0xdf) return 1; /* $B!,(B*/
X        if(c1==0xa4) return 1; /* $B!#(B*/
X        if(c1==0xa3) return 1; /* $B!$(B*/
X        if(c1==0xa1) return 1; /* $B!W(B*/
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; /* $B!"(B */
X            if(c1=='#')  return 1; /* $B!#(B */
X            if(c1=='$')  return 1; /* $B!$(B */
X            if(c1=='%')  return 1; /* $B!%(B */
X            if(c1=='\'') return 1; /* $B!\(B */
X            if(c1=='(')  return 1; /* $B!((B */
X            if(c1==')')  return 1; /* $B!)(B */
X            if(c1=='*')  return 1; /* $B!*(B */
X            if(c1=='+')  return 1; /* $B!+(B */
X            if(c1==',')  return 1; /* $B!,(B */
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 ** $B%Q%C%A@):n<T(B
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 ** $B:G=*99?7F|(B
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 $B2>L>(B
# X0201->X0208 conversion
# X0208 aphabet -> ASCII
# X0201 $BAj8_JQ49(B
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 $B2OLn??<#(B  kono@ie.u-ryukyu.ac.jp
X			Sun Nov  8 00:42:15 JST 1998
X
X$B$3$l$O!"(BPerl $B$+$i(B nkf $B$r;H$&3HD%%b%8%e!<%k$G$9!#(B
X$B$$$D$b$N$h$&$K!"(B
X	perl5 Makefile.PL
X	make
X	make install
X$B$H$9$k$3$H$K$h$j;H$($k$h$&$K$J$j$^$9!#(B
X
X$B;H$$J}$O!"(B
X	use NKF;
X	$output = nkf($flag,$input);
X
X$B$N$h$&$K;H$$$^$9!#(Bflag $B$O!"(Bnkf $B$HF1$8$G$9!#(B
X
X$BG[I[$N>r7o$O!"(Bnkf $B$HF1MM$H$7$^$9!#(B
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 $B2>L>(B
# X0201->X0208 conversion
# X0208 aphabet -> ASCII
# X0201 $BAj8_JQ49(B
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