OSDN Git Service

TiMidity++-2.10.1
authorMasanao Izumo <mo@goice.co.jp>
Wed, 18 Oct 2000 00:10:01 +0000 (09:10 +0900)
committerMasanao Izumo <mo@goice.co.jp>
Wed, 18 Oct 2000 00:10:01 +0000 (09:10 +0900)
37 files changed:
ChangeLog
Makefile.am
Makefile.in
NEWS
configs/msc-config.h
configure
configure.in
interface/Makefile.am
interface/Makefile.in
interface/interface_T.txt [new file with mode: 0644]
interface/interface_a.txt [new file with mode: 0644]
interface/interface_e.txt [new file with mode: 0644]
interface/interface_g.txt [new file with mode: 0644]
interface/interface_i.txt [new file with mode: 0644]
interface/interface_m.txt [new file with mode: 0644]
interface/interface_n.txt [new file with mode: 0644]
interface/interface_s.txt [new file with mode: 0644]
interface/x_sherry.c
libunimod/Makefile.am
libunimod/Makefile.in
libunimod/load_imf.c
libunimod/load_m15.c
libunimod/load_med.c
libunimod/load_mod.c
libunimod/load_okt.c [new file with mode: 0644]
libunimod/load_stm.c
libunimod/load_stx.c
libunimod/load_uni.c
libunimod/load_xm.c
libunimod/mloader.c
libunimod/mlutil.c
libunimod/unimod_priv.h
timidity/effect.c
timidity/mix.c
timidity/mod.c
timidity/timidity.c
utils/nkflib.c

index 982c4d4..2a085e9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,66 @@
+2000-10-18  Masanao Izumo <mo@goice.co.jp>
+
+       * Version 2.10.1 released.
+
+2000-10-17  Paolo Bonzini <bonzini@gnu.org>
+
+       Merged with libmikmod 3.1.9
+
+       * libunimod/Makefile.am: added load_okt.c
+
+       * libunimod/load_imf.c: envelopes weren't loaded correctly. The first
+       envelope point was correct, the remaining half points were bogus, and
+       the other half completely random.
+       * libunimod/load_m15.c: effect 0xc (set channel volume) with effect
+       parameter 0xff was misplayed as a note cut.  Effects 0x1, 0x2 and 0x3
+       (portamentos) with effect parameter 0x00 were using the command
+       memory, but these commands do not have effect memory for MOD files.
+       * libunimod/load_med.c: use better variable names.
+       * libunimod/load_mod.c: same as load_m15.c
+       * libunimod/load_okt.c: new file.
+       * libunimod/load_stm.c: recognize Wuzamod STM modules.  Plus, fixed
+       sample rate.
+       * libunimod/load_stx.c: recognize MOD2STM and Wuzamod STM modules.
+       Plus, fixed sample rate.
+       * libunimod/load_uni.c: recognize recent APlayer modules (.APUN
+       format level 0x104)
+       * libunimod/load_xm.c: same as load_imf.c
+
+       * libunimod/mloader.c: register the Oktalyzer loader
+       * libunimod/mlutil.c: moved the STM module signatures here, so that
+       the STX loader can use them
+       
+       * libunimod/unimod_priv.h: moved the STM module signatures here, so
+       that the STX loader can use them
+
+       * timidity/mod.c: enabling the envelope (with an effect) for a sample
+       with no associated envelope would cause immediate coredumps.  Also
+       fixed arpeggio memory (which was ignored) and tempo slide (which
+       was processed incorrectly).
+
+2000-10-02  Daisuke Aoki <dai@sweetparty.ne.jp>
+
+    * utils/nkflib.c: Update newer version.
+
+2000-08-30  Masanao Izumo <mo@goice.co.jp>
+       
+    * interface/{Makefile.am,Makefile.in}:
+       Added target of interface_r.so and interface_A.so.
+       
+2000-08-29  Masanao Izumo <mo@goice.co.jp>
+
+    * interface/x_sherry.c: Remove memory leak.
+
+2000-08-26  Henrique M. Holschuh <hmh@rcm.org.br>
+
+    * Bug fixed about dynamic_interface_id
+    * Added interface_?.txt files
+       
+2000-08-20  Eric A. Welsh <ewelsh@gpc.wustl.edu>
+
+    * timidity/mix.c(sustain): Changed behavior to not begin the decay until
+       after the sample plays past it's loop start.
+
 2000-08-09  Masanao Izumo <mo@goice.co.jp>
 
     * Version 2.10.0 released.
index 31cd8b0..48a9511 100644 (file)
@@ -93,7 +93,7 @@ ump: ump-targets
 ump-targets: $(UMPDIR)/Makefile
 
 $(UMPDIR)/Makefile: $(UMPDIR)/Makefile.in config.status
-       CONFIG_HEADERS='' CONFIG_FILES=ump/Makefile $(SHELL) ./config.status 
+       CONFIG_HEADERS='' CONFIG_FILES=ump/Makefile $(SHELL) ./config.status
 
 ## for developers
 #$(UMPDIR)/Makefile.in: $(UMPDIR)/Makefile.am
index 5b2970a..bdf6e60 100644 (file)
@@ -465,7 +465,7 @@ ump: ump-targets
 ump-targets: $(UMPDIR)/Makefile
 
 $(UMPDIR)/Makefile: $(UMPDIR)/Makefile.in config.status
-       CONFIG_HEADERS='' CONFIG_FILES=ump/Makefile $(SHELL) ./config.status 
+       CONFIG_HEADERS='' CONFIG_FILES=ump/Makefile $(SHELL) ./config.status
 
 #$(UMPDIR)/Makefile.in: $(UMPDIR)/Makefile.am
 #      $(AUTOMAKE) --gnu $(UMPSDIR)/Makefile
diff --git a/NEWS b/NEWS
index f48f697..53b8771 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,8 @@
+10/18, 2000
+    * Version 2.10.1 released.
+
 08/09, 2000
+    * Version 2.10.0 released.
     * Enable to write each separated wav file if `-o' 
        command line option is omitted.
        The output filename is automatically generated from the input MIDI
index a67dd2e..0006cb5 100644 (file)
 \r
 /* In VDS Macro AAA=BBB is not available. */\r
 #define __W32__\r
-#define TIMID_VERSION  "2.10.0"\r
+#define TIMID_VERSION  "2.10.1"\r
 #define DEFAULT_PATH   ".\\"\r
 #define AU_W32\r
 #define WINSOCK\r
index 96e124a..2f7a842 100755 (executable)
--- a/configure
+++ b/configure
@@ -891,7 +891,7 @@ fi
 
 PACKAGE=TiMidity++
 
-VERSION=2.10.0
+VERSION=2.10.1
 
 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
   { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
@@ -7532,7 +7532,6 @@ esac
 
 
 
-
 if false; then
   ENABLE_ALSASEQ_TRUE=
   ENABLE_ALSASEQ_FALSE='#'
@@ -7566,17 +7565,17 @@ fi
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:7570: checking for $ac_hdr" >&5
+echo "configure:7569: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7575 "configure"
+#line 7574 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7580: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7579: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7672,17 +7671,17 @@ if test "${enable_ump+set}" = set; then
     fi
     ac_safe=`echo "X11/xpm.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/xpm.h""... $ac_c" 1>&6
-echo "configure:7676: checking for X11/xpm.h" >&5
+echo "configure:7675: checking for X11/xpm.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7681 "configure"
+#line 7680 "configure"
 #include "confdefs.h"
 #include <X11/xpm.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7686: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7685: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7705,7 +7704,7 @@ else
 fi
 
     echo $ac_n "checking for XpmCreatePixmapFromData in -lXpm""... $ac_c" 1>&6
-echo "configure:7709: checking for XpmCreatePixmapFromData in -lXpm" >&5
+echo "configure:7708: checking for XpmCreatePixmapFromData in -lXpm" >&5
 ac_lib_var=`echo Xpm'_'XpmCreatePixmapFromData | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7713,7 +7712,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXpm  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7717 "configure"
+#line 7716 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7724,7 +7723,7 @@ int main() {
 XpmCreatePixmapFromData()
 ; return 0; }
 EOF
-if { (eval echo configure:7728: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7727: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7796,7 +7795,7 @@ if test "${enable_offix+set}" = set; then
       LDFLAGS="$LDFLAGS $offix_lib_dir"
       LIBS="$LIBS $lib_xmu_opt $lib_xt_opt $lib_xprelibs_opt $lib_xext_opt -lX11"
       echo $ac_n "checking for DndInitialize in -lDnd""... $ac_c" 1>&6
-echo "configure:7800: checking for DndInitialize in -lDnd" >&5
+echo "configure:7799: checking for DndInitialize in -lDnd" >&5
 ac_lib_var=`echo Dnd'_'DndInitialize | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7804,7 +7803,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lDnd  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7808 "configure"
+#line 7807 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7815,7 +7814,7 @@ int main() {
 DndInitialize()
 ; return 0; }
 EOF
-if { (eval echo configure:7819: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7818: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7922,7 +7921,7 @@ if test "${enable_wrd+set}" = set; then
       EXTRADEFS="$EXTRADEFS -DWRDT_X"
       enable_sherry_wrd=yes
       echo $ac_n "checking for zlibVersion in -lz""... $ac_c" 1>&6
-echo "configure:7926: checking for zlibVersion in -lz" >&5
+echo "configure:7925: checking for zlibVersion in -lz" >&5
 ac_lib_var=`echo z'_'zlibVersion | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7930,7 +7929,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lz  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7934 "configure"
+#line 7933 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7941,7 +7940,7 @@ int main() {
 zlibVersion()
 ; return 0; }
 EOF
-if { (eval echo configure:7945: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7944: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7964,17 +7963,17 @@ fi
 
       ac_safe=`echo "png.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for png.h""... $ac_c" 1>&6
-echo "configure:7968: checking for png.h" >&5
+echo "configure:7967: checking for png.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7973 "configure"
+#line 7972 "configure"
 #include "confdefs.h"
 #include <png.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7978: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7977: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7997,7 +7996,7 @@ enable_sherry_wrd=no
 fi
 
       echo $ac_n "checking for png_init_io in -lpng""... $ac_c" 1>&6
-echo "configure:8001: checking for png_init_io in -lpng" >&5
+echo "configure:8000: checking for png_init_io in -lpng" >&5
 ac_lib_var=`echo png'_'png_init_io | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -8005,7 +8004,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lpng -lz $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 8009 "configure"
+#line 8008 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -8016,7 +8015,7 @@ int main() {
 png_init_io()
 ; return 0; }
 EOF
-if { (eval echo configure:8020: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8019: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
index fcd3efd..9ed228d 100644 (file)
@@ -55,7 +55,7 @@ dnl
 AC_INIT(timidity/timidity.c)
 SHELL=${CONFIG_SHELL-/bin/sh}
 AC_CANONICAL_SYSTEM
-AM_INIT_AUTOMAKE(TiMidity++, 2.10.0, no-define)
+AM_INIT_AUTOMAKE(TiMidity++, 2.10.1, no-define)
 
 dnl To use CONTAINS() macro (See acinclude.m4)
 CONTAINS_INIT
@@ -1193,7 +1193,6 @@ CONFIG_INTERFACE(server,SERVER,r,
     AC_CHECK_HEADERS(sys/soundcard.h)
   ])
 
-
 dnl TiMidity ALSA sequencer server
 AM_CONDITIONAL(ENABLE_ALSASEQ, false)
 CONFIG_INTERFACE(alsaseq,ALSASEQ,A,
index c505f5f..7010623 100644 (file)
@@ -113,7 +113,6 @@ EXTRA_libinterface_a_SOURCES = \
        w32g_sleep.bmp \
        w32g_subbtn.bmp
 
-
 if ENABLE_WRD
 WRD_OBJS = \
        wrdt_x.o \
@@ -167,7 +166,15 @@ EXTRA_DIST = \
        browser.tcl \
        misc.tcl \
        timidity.el \
-       tclIndex
+       tclIndex \
+       interface_T.txt \
+       interface_a.txt \
+       interface_e.txt \
+       interface_g.txt \
+       interface_i.txt \
+       interface_m.txt \
+       interface_n.txt \
+       interface_s.txt
 
 .ptcl.tcl:
        sed -e 's@%TCL_DIR%@$(TCL_DIR)@g' $< > $@
@@ -282,6 +289,12 @@ interface_i.$(so): xskin_c.$(so) support.$(so) xskin_i.$(so) xskin_loadBMP.$(so)
 interface_g.$(so): gtk_c.$(so) support.$(so) gtk_i.$(so) gtk_p.$(so)
        $(SHLD) -o $@ gtk_c.$(so) support.$(so) gtk_i.$(so) gtk_p.$(so) $(g_so_libs)
 
+interface_r.$(so): server_c.$(so) support.$(so)
+       $(SHLD) -o $@ server_c.$(so) support.$(so)
+
+interface_A.$(so): alsaseq_c.$(so) support.$(so)
+       $(SHLD) -o $@ alsaseq_c.$(so) support.$(so)
+
 endif
 
 clean-compile:
index babc233..ff4fa2a 100644 (file)
@@ -149,7 +149,7 @@ TCLSRCS = tkmidity.ptcl tkpanel.tcl browser.tcl misc.tcl
 TCLF = tkmidity.tcl tkpanel.tcl browser.tcl misc.tcl
 ALLTCLF = $(TCLF) tclIndex
 
-EXTRA_DIST =   tkmidity.ptcl   tkpanel.tcl     browser.tcl     misc.tcl        timidity.el     tclIndex
+EXTRA_DIST =   tkmidity.ptcl   tkpanel.tcl     browser.tcl     misc.tcl        timidity.el     tclIndex        interface_T.txt         interface_a.txt         interface_e.txt         interface_g.txt         interface_i.txt         interface_m.txt         interface_n.txt         interface_s.txt
 
 @ENABLE_TCLTK_TRUE@install_tk = install.tk
 @ENABLE_DYNAMIC_TCLTK_TRUE@install_tk = install.tk
@@ -657,6 +657,12 @@ w32g_res.res: w32g_res.h w32g_rec.h w32g_res.rc \
 @NEEDDLOPEN_TRUE@interface_g.$(so): gtk_c.$(so) support.$(so) gtk_i.$(so) gtk_p.$(so)
 @NEEDDLOPEN_TRUE@      $(SHLD) -o $@ gtk_c.$(so) support.$(so) gtk_i.$(so) gtk_p.$(so) $(g_so_libs)
 
+@NEEDDLOPEN_TRUE@interface_r.$(so): server_c.$(so) support.$(so)
+@NEEDDLOPEN_TRUE@      $(SHLD) -o $@ server_c.$(so) support.$(so)
+
+@NEEDDLOPEN_TRUE@interface_A.$(so): alsaseq_c.$(so) support.$(so)
+@NEEDDLOPEN_TRUE@      $(SHLD) -o $@ alsaseq_c.$(so) support.$(so)
+
 clean-compile:
        -rm -f *.$(so)
 
diff --git a/interface/interface_T.txt b/interface/interface_T.txt
new file mode 100644 (file)
index 0000000..64213b7
--- /dev/null
@@ -0,0 +1 @@
+vt100 interface
diff --git a/interface/interface_a.txt b/interface/interface_a.txt
new file mode 100644 (file)
index 0000000..d875ad7
--- /dev/null
@@ -0,0 +1 @@
+Xaw interface
diff --git a/interface/interface_e.txt b/interface/interface_e.txt
new file mode 100644 (file)
index 0000000..0cc58d0
--- /dev/null
@@ -0,0 +1 @@
+Emacs interface (invoked from `M-x timidity')
diff --git a/interface/interface_g.txt b/interface/interface_g.txt
new file mode 100644 (file)
index 0000000..53ee8b5
--- /dev/null
@@ -0,0 +1 @@
+gtk+ interface
diff --git a/interface/interface_i.txt b/interface/interface_i.txt
new file mode 100644 (file)
index 0000000..9aa7084
--- /dev/null
@@ -0,0 +1 @@
+X Skin interface
diff --git a/interface/interface_m.txt b/interface/interface_m.txt
new file mode 100644 (file)
index 0000000..dd1e995
--- /dev/null
@@ -0,0 +1 @@
+Motif interface
diff --git a/interface/interface_n.txt b/interface/interface_n.txt
new file mode 100644 (file)
index 0000000..ac08a05
--- /dev/null
@@ -0,0 +1 @@
+ncurses interface
diff --git a/interface/interface_s.txt b/interface/interface_s.txt
new file mode 100644 (file)
index 0000000..877b8bc
--- /dev/null
@@ -0,0 +1 @@
+slang interface
index 046d05e..c6d6d71 100644 (file)
@@ -1956,6 +1956,7 @@ void x_sry_wrdt_apply(uint8 *data, int len)
       case 0x1d:
       case 0x1e:
       case 0x1f:
+      case 0x20:
       case 0x71:
       case 0x72:
       case 0x7f:
@@ -2052,10 +2053,6 @@ static ImagePixmap *create_shm_image_pixmap(int width, int height, int depth)
        goto done;
     }
 
-    /* allocate n-depth Z image data structure */
-    ip->im->data = (char *)safe_large_malloc(ip->im->bytes_per_line *
-                                            ip->im->height);
-
     /* The next step is to create the shared memory segment.
      * The return value of shmat() should be stored both
      * the XImage structure and the shminfo structure.
index 47244d1..cc0696f 100644 (file)
@@ -40,6 +40,7 @@ libunimod_a_SOURCES = \
        load_med.c \
        load_mod.c \
        load_mtm.c \
+       load_okt.c \
        load_s3m.c \
        load_stm.c \
        load_stx.c \
index 26c4d21..1d43079 100644 (file)
@@ -117,7 +117,7 @@ INCLUDES =          -I$(top_srcdir)         -I$(top_srcdir)/timidity        -I$(top_srcdir)/utils   -
 
 noinst_LIBRARIES = libunimod.a
 
-libunimod_a_SOURCES =          load_669.c      load_amf.c      load_dsm.c      load_far.c      load_gdm.c      load_imf.c      load_it.c       load_m15.c      load_med.c      load_mod.c      load_mtm.c      load_s3m.c      load_stm.c      load_stx.c      load_ult.c      load_uni.c      load_xm.c       mloader.c       mlutil.c        mmsup.c         munitrk.c       unimod.h        unimod_priv.h
+libunimod_a_SOURCES =          load_669.c      load_amf.c      load_dsm.c      load_far.c      load_gdm.c      load_imf.c      load_it.c       load_m15.c      load_med.c      load_mod.c      load_mtm.c      load_okt.c      load_s3m.c      load_stm.c      load_stx.c      load_ult.c      load_uni.c      load_xm.c       mloader.c       mlutil.c        mmsup.c         munitrk.c       unimod.h        unimod_priv.h
 
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = ../config.h ../interface.h
@@ -136,8 +136,8 @@ X_PRE_LIBS = @X_PRE_LIBS@
 libunimod_a_LIBADD = 
 libunimod_a_OBJECTS =  load_669.o load_amf.o load_dsm.o load_far.o \
 load_gdm.o load_imf.o load_it.o load_m15.o load_med.o load_mod.o \
-load_mtm.o load_s3m.o load_stm.o load_stx.o load_ult.o load_uni.o \
-load_xm.o mloader.o mlutil.o mmsup.o munitrk.o
+load_mtm.o load_okt.o load_s3m.o load_stm.o load_stx.o load_ult.o \
+load_uni.o load_xm.o mloader.o mlutil.o mmsup.o munitrk.o
 AR = ar
 CFLAGS = @CFLAGS@
 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -262,6 +262,8 @@ load_mod.o: load_mod.c ../config.h unimod_priv.h unimod.h \
        ../libarc/url.h
 load_mtm.o: load_mtm.c ../config.h unimod_priv.h unimod.h \
        ../libarc/url.h
+load_okt.o: load_okt.c ../config.h unimod_priv.h unimod.h \
+       ../libarc/url.h
 load_s3m.o: load_s3m.c ../config.h unimod_priv.h unimod.h \
        ../libarc/url.h
 load_stm.o: load_stm.c ../config.h unimod_priv.h unimod.h \
index 2a64d7d..17d0de3 100644 (file)
@@ -611,7 +611,10 @@ IMF_Load (BOOL curious)
       d->volfade = ih.volfade;
 
 #define IMF_ProcessEnvelope(name)                                                                              \
-               memcpy(d->##name##env,ih.##name##env,IMFENVCNT);                                \
+               for (u = 0; u < (IMFENVCNT >> 1); u++) {                                                \
+                       d->##name##env[u].pos = ih.##name##env[u << 1];                         \
+                       d->##name##env[u].val = ih.##name##env[(u << 1)+ 1];            \
+               }                                                                                                                               \
                if (ih.##name##flg&1) d->##name##flg|=EF_ON;                                    \
                if (ih.##name##flg&2) d->##name##flg|=EF_SUSTAIN;                               \
                if (ih.##name##flg&4) d->##name##flg|=EF_LOOP;                                  \
index 77adad4..3d8ec0d 100644 (file)
@@ -240,10 +240,10 @@ M15_Test (void)
            return 0;
        }
 
-      if (!ust_loader)
-       return 1;
-
-      if ((mh.samples[t].reppos + mh.samples[t].replen) > (mh.samples[t].length + 10))
+      /* if loop information is incorrect as words, but correct as bytes,
+        this is likely to be an ust-style module */
+      if((mh.samples[t].reppos + mh.samples[t].replen > mh.samples[t].length) &&
+        (mh.samples[t].reppos + mh.samples[t].replen < (mh.samples[t].length << 1)))
        {
          ust_loader = 1;
          return 1;
@@ -370,6 +370,10 @@ M15_ConvertNote (MODNOTE * n)
       lastnote = note;
     }
 
+  /* Handle ``heavy'' volumes correctly */
+  if ((effect == 0xc) && (effdat > 0x40))
+    effdat = 0x40;
+
   /* Convert pattern jump from Dec to Hex */
   if (effect == 0xd)
     effdat = (((effdat & 0xf0) >> 4) * 10) + (effdat & 0xf);
@@ -399,8 +403,13 @@ M15_ConvertNote (MODNOTE * n)
          break;
        }
     }
-  else
+  else {
+    /* Ignore 100, 200 and 300 (there is no porta memory in mod files) */
+    if ((!effdat) && ((effect == 1)||(effect == 2)||(effect == 3)))
+      effect = 0;
+
     UniPTEffect (effect, effdat);
+  }
 }
 
 static UBYTE *
@@ -529,9 +538,11 @@ M15_Load (BOOL curious)
       q->loopend = q->loopstart + (s->replen << 1);
       q->length = s->length << 1;
 
-      q->flags = SF_SIGNED | SF_UST_LOOP;
-      if (s->replen > 1)
-       q->flags |= SF_LOOP;
+      q->flags = SF_SIGNED;
+      if(ust_loader)
+        q->flags |= SF_UST_LOOP;
+      if(s->replen > 2)
+        q->flags |= SF_LOOP;
 
       /* fix replen if repend>length */
       if (q->loopend > q->length)
@@ -566,7 +577,7 @@ MLOADER load_m15 =
 {
   NULL,
   "15-instrument module",
-  "MOD (15 instrument)",
+  "MOD (15 instruments)",
   M15_Init,
   M15_Test,
   M15_Load,
index 3164acf..b5cac3d 100644 (file)
 
 /*========== Module information */
 
-typedef struct MMD0
+typedef struct MEDHEADER
   {
     ULONG id;
     ULONG modlen;
-    ULONG MMD0songP;           /* struct MMD0song *song; */
+    ULONG pMEDSONG;            /* struct MEDSONG *song; */
     UWORD psecnum;             /* for the player routine, MMD2 only */
     UWORD pseq;                        /*  "   "   "   " */
-    ULONG MMD0BlockPP;         /* struct MMD0Block **blockarr; */
+    ULONG pMEDBLOCKP;          /* struct MMD0Block **blockarr; */
     ULONG reserved1;
-    ULONG InstrHdrPP;          /* struct InstrHdr **smplarr; */
+    ULONG ppMedInstrHdr;               /* struct InstrHdr **smplarr; */
     ULONG reserved2;
-    ULONG MMD0expP;            /* struct MMD0exp *expdata; */
+    ULONG pMEDEXP;             /* struct MEDEXP *expdata; */
     ULONG reserved3;
     UWORD pstate;              /* some data for the player routine */
     UWORD pblock;
@@ -57,9 +57,9 @@ typedef struct MMD0
     UBYTE counter;
     UBYTE extra_songs;         /* number of songs - 1 */
   }
-MMD0;
+MEDHEADER;
 
-typedef struct MMD0sample
+typedef struct MEDSAMPLE
   {
     UWORD rep, replen;         /* offs: 0(s), 2(s) */
     UBYTE midich;              /* offs: 4(s) */
@@ -67,11 +67,11 @@ typedef struct MMD0sample
     UBYTE svol;                        /* offs: 6(s) */
     SBYTE strans;              /* offs: 7(s) */
   }
-MMD0sample;
+MEDSAMPLE;
 
-typedef struct MMD0song
+typedef struct MEDSONG
   {
-    MMD0sample sample[63];     /* 63 * 8 bytes = 504 bytes */
+    MEDSAMPLE sample[63];      /* 63 * 8 bytes = 504 bytes */
     UWORD numblocks;           /* offs: 504 */
     UWORD songlen;             /* offs: 506 */
     UBYTE playseq[256];                /* offs: 508 */
@@ -84,9 +84,9 @@ typedef struct MMD0song
     UBYTE mastervol;           /* offs: 786 */
     UBYTE numsamples;          /* offs: 787 */
   }
-MMD0song;
+MEDSONG;
 
-typedef struct MMD0exp
+typedef struct MEDEXP
   {
     ULONG nextmod;             /* pointer to next module */
     ULONG exp_smp;             /* pointer to InstrExt array */
@@ -106,7 +106,7 @@ typedef struct MMD0exp
     ULONG dumps;
     ULONG reserved2[7];
   }
-MMD0exp;
+MEDEXP;
 
 typedef struct MMD0NOTE
   {
@@ -120,37 +120,37 @@ typedef struct MMD1NOTE
   }
 MMD1NOTE;
 
-typedef struct InstrHdr
+typedef struct MEDINSTHEADER
   {
     ULONG length;
     SWORD type;
     /* Followed by actual data */
   }
-InstrHdr;
+MEDINSTHEADER;
 
-typedef struct InstrExt
+typedef struct MEDINSTEXT
   {
     UBYTE hold;
     UBYTE decay;
     UBYTE suppress_midi_off;
     SBYTE finetune;
   }
-InstrExt;
+MEDINSTEXT;
 
-typedef struct InstrInfo
+typedef struct MEDINSTINFO
   {
     UBYTE name[40];
   }
-InstrInfo;
+MEDINSTINFO;
 
 /*========== Loader variables */
 
 #define MMD0_string 0x4D4D4430
 #define MMD1_string 0x4D4D4431
 
-static MMD0 *mh = NULL;
-static MMD0song *ms = NULL;
-static MMD0exp *me = NULL;
+static MEDHEADER *mh = NULL;
+static MEDSONG *ms = NULL;
+static MEDEXP *me = NULL;
 static ULONG *ba = NULL;
 static MMD0NOTE *mmd0pat = NULL;
 static MMD1NOTE *mmd1pat = NULL;
@@ -180,11 +180,11 @@ MED_Test (void)
 BOOL 
 MED_Init (void)
 {
-  if (!(me = (MMD0exp *) _mm_malloc (sizeof (MMD0exp))))
+  if (!(me = (MEDEXP *) _mm_malloc (sizeof (MEDEXP))))
     return 0;
-  if (!(mh = (MMD0 *) _mm_malloc (sizeof (MMD0))))
+  if (!(mh = (MEDHEADER *) _mm_malloc (sizeof (MEDHEADER))))
     return 0;
-  if (!(ms = (MMD0song *) _mm_malloc (sizeof (MMD0song))))
+  if (!(ms = (MEDSONG *) _mm_malloc (sizeof (MEDSONG))))
     return 0;
   return 1;
 }
@@ -459,21 +459,21 @@ MED_Load (BOOL curious)
 {
   int t;
   ULONG sa[64];
-  InstrHdr s;
+  MEDINSTHEADER s;
   SAMPLE *q;
-  MMD0sample *mss;
+  MEDSAMPLE *mss;
 
   /* try to read module header */
   mh->id = _mm_read_M_ULONG (modreader);
   mh->modlen = _mm_read_M_ULONG (modreader);
-  mh->MMD0songP = _mm_read_M_ULONG (modreader);
+  mh->pMEDSONG = _mm_read_M_ULONG (modreader);
   mh->psecnum = _mm_read_M_UWORD (modreader);
   mh->pseq = _mm_read_M_UWORD (modreader);
-  mh->MMD0BlockPP = _mm_read_M_ULONG (modreader);
+  mh->pMEDBLOCKP = _mm_read_M_ULONG (modreader);
   mh->reserved1 = _mm_read_M_ULONG (modreader);
-  mh->InstrHdrPP = _mm_read_M_ULONG (modreader);
+  mh->ppMedInstrHdr = _mm_read_M_ULONG (modreader);
   mh->reserved2 = _mm_read_M_ULONG (modreader);
-  mh->MMD0expP = _mm_read_M_ULONG (modreader);
+  mh->pMEDEXP = _mm_read_M_ULONG (modreader);
   mh->reserved3 = _mm_read_M_ULONG (modreader);
   mh->pstate = _mm_read_M_UWORD (modreader);
   mh->pblock = _mm_read_M_UWORD (modreader);
@@ -483,8 +483,8 @@ MED_Load (BOOL curious)
   mh->counter = _mm_read_UBYTE (modreader);
   mh->extra_songs = _mm_read_UBYTE (modreader);
 
-  /* Seek to MMD0song struct */
-  _mm_fseek (modreader, mh->MMD0songP, SEEK_SET);
+  /* Seek to MEDSONG struct */
+  _mm_fseek (modreader, mh->pMEDSONG, SEEK_SET);
 
   /* Load the MMD0 Song Header */
   mss = ms->sample;            /* load the sample data first */
@@ -518,9 +518,9 @@ MED_Load (BOOL curious)
     }
 
   /* load extension structure */
-  if (mh->MMD0expP)
+  if (mh->pMEDEXP)
     {
-      _mm_fseek (modreader, mh->MMD0expP, SEEK_SET);
+      _mm_fseek (modreader, mh->pMEDEXP, SEEK_SET);
       me->nextmod = _mm_read_M_ULONG (modreader);
       me->exp_smp = _mm_read_M_ULONG (modreader);
       me->s_ext_entries = _mm_read_M_UWORD (modreader);
@@ -540,7 +540,7 @@ MED_Load (BOOL curious)
     }
 
   /* seek to and read the samplepointer array */
-  _mm_fseek (modreader, mh->InstrHdrPP, SEEK_SET);
+  _mm_fseek (modreader, mh->ppMedInstrHdr, SEEK_SET);
   if (!_mm_read_M_ULONGS (sa, ms->numsamples, modreader))
     {
       _mm_errno = MMERR_LOADING_HEADER;
@@ -550,7 +550,7 @@ MED_Load (BOOL curious)
   /* alloc and read the blockpointer array */
   if (!(ba = (ULONG *) _mm_calloc (ms->numblocks, sizeof (ULONG))))
     return 0;
-  _mm_fseek (modreader, mh->MMD0BlockPP, SEEK_SET);
+  _mm_fseek (modreader, mh->pMEDBLOCKP, SEEK_SET);
   if (!_mm_read_M_ULONGS (ba, ms->numblocks, modreader))
     {
       _mm_errno = MMERR_LOADING_HEADER;
@@ -619,7 +619,7 @@ MED_Load (BOOL curious)
   of.numins = ms->numsamples;
   of.numsmp = of.numins;
   of.reppos = 0;
-  if ((mh->MMD0expP) && (me->songname) && (me->songnamelen))
+  if ((mh->pMEDEXP) && (me->songname) && (me->songnamelen))
     {
       char *name;
 
@@ -631,7 +631,7 @@ MED_Load (BOOL curious)
     }
   else
     of.songname = DupStr (NULL, 0, 0);
-  if ((mh->MMD0expP) && (me->annotxt) && (me->annolen))
+  if ((mh->pMEDEXP) && (me->annotxt) && (me->annolen))
     {
       _mm_fseek (modreader, me->annotxt, SEEK_SET);
       ReadComment (me->annolen);
@@ -685,10 +685,10 @@ MED_Load (BOOL curious)
       else
        q->length = 0;
 
-      if ((mh->MMD0expP) && (me->exp_smp) &&
+      if ((mh->pMEDEXP) && (me->exp_smp) &&
          (t < me->s_ext_entries) && (me->s_ext_entrsz >= 4))
        {
-         InstrExt ie;
+         MEDINSTEXT ie;
 
          _mm_fseek (modreader, me->exp_smp + t * me->s_ext_entrsz, SEEK_SET);
          ie.hold = _mm_read_UBYTE (modreader);
@@ -701,10 +701,10 @@ MED_Load (BOOL curious)
       else
        q->speed = 8363;
 
-      if ((mh->MMD0expP) && (me->iinfo) &&
+      if ((mh->pMEDEXP) && (me->iinfo) &&
          (t < me->i_ext_entries) && (me->i_ext_entrsz >= 40))
        {
-         InstrInfo ii;
+         MEDINSTINFO ii;
 
          _mm_fseek (modreader, me->iinfo + t * me->i_ext_entrsz, SEEK_SET);
          _mm_read_UBYTES (ii.name, 40, modreader);
index 4b8a042..a1fc668 100644 (file)
@@ -259,6 +259,14 @@ ConvertNote (MODNOTE * n)
   if ((effect == 0xa) && (effdat & 0xf) && (effdat & 0xf0))
     effdat &= 0xf0;
 
+  /* Handle ``heavy'' volumes correctly */
+  if ((effect == 0xc) && (effdat > 0x40))
+    effdat = 0x40;
+
+  /* Ignore 100, 200 and 300 (there is no porta memory in mod files) */
+  if ((!effdat) && ((effect == 1)||(effect == 2)||(effect ==3)))
+    effect = 0;
+
   UniPTEffect (effect, effdat);
 }
 
@@ -443,7 +451,7 @@ MLOADER load_mod =
 {
   NULL,
   "Standard module",
-  "MOD (31 instrument)",
+  "MOD (31 instruments)",
   MOD_Init,
   MOD_Test,
   MOD_Load,
diff --git a/libunimod/load_okt.c b/libunimod/load_okt.c
new file mode 100644 (file)
index 0000000..2ddad44
--- /dev/null
@@ -0,0 +1,446 @@
+/*     MikMod sound library\r
+       (c) 1999, 2000 Miodrag Vallat and others - see file AUTHORS for\r
+       complete list.\r
+\r
+       This library is free software; you can redistribute it and/or modify\r
+       it under the terms of the GNU Library General Public License as\r
+       published by the Free Software Foundation; either version 2 of\r
+       the License, or (at your option) any later version.\r
+\r
+       This program is distributed in the hope that it will be useful,\r
+       but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+       GNU Library General Public License for more details.\r
+\r
+       You should have received a copy of the GNU Library General Public\r
+       License along with this library; if not, write to the Free Software\r
+       Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\r
+       02111-1307, USA.\r
+*/\r
+\r
+/*==============================================================================\r
+\r
+  $Id: load_okt.c,v 1.3 2000/02/14 22:10:22 miod Exp $\r
+\r
+  Oktalyzer (OKT) module loader\r
+\r
+==============================================================================*/\r
+\r
+/*\r
+       Written by UFO <ufo303@poczta.onet.pl>\r
+       based on the file description compiled by Harald Zappe\r
+                                                             <zappe@gaea.sietec.de>\r
+\r
+*/\r
+\r
+#ifdef HAVE_CONFIG_H\r
+#include "config.h"\r
+#endif\r
+\r
+#ifdef HAVE_UNISTD_H\r
+#include <unistd.h>\r
+#endif\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+\r
+#include "unimod_priv.h"\r
+\r
+/*========== Module blocks */\r
+\r
+/* sample information */\r
+typedef struct OKTSAMPLE {\r
+       CHAR sampname[20];\r
+       ULONG len;\r
+       UWORD loopbeg;\r
+       UWORD looplen;\r
+       UBYTE volume;\r
+} OKTSAMPLE;\r
+\r
+typedef struct OKTNOTE {\r
+       UBYTE note, ins, eff, dat;\r
+} OKTNOTE;\r
+\r
+/*========== Loader variables */\r
+\r
+static OKTNOTE *okttrk = NULL;\r
+\r
+/*========== Loader code */\r
+\r
+BOOL OKT_Test(void)\r
+{\r
+       CHAR id[8];\r
+\r
+       if (!_mm_read_UBYTES(id, 8, modreader))\r
+               return 0;\r
+       if (!memcmp(id, "OKTASONG", 8))\r
+               return 1;\r
+\r
+       return 0;\r
+}\r
+\r
+/*     Pattern analysis routine.\r
+       Effects not implemented (yet) : (in decimal)\r
+       11 Arpeggio 4: Change note every 50Hz tick between N,H,N,L\r
+       12 Arpeggio 5: Change note every 50Hz tick between H,H,N\r
+                   N = normal note being played in this channel (1-36)\r
+                   L = normal note number minus upper four bits of 'data'.\r
+                   H = normal note number plus  lower four bits of 'data'.\r
+    13 Decrease note number by 'data' once per tick.\r
+    17 Increase note number by 'data' once per tick.\r
+    21 Decrease note number by 'data' once per line.\r
+    30 Increase note number by 'data' once per line.\r
+*/\r
+static UBYTE *OKT_ConvertTrack(UBYTE patrows)\r
+{\r
+       int t;\r
+       UBYTE ins, note, eff, dat;\r
+\r
+       UniReset();\r
+       for (t = 0; t < patrows; t++) {\r
+               note = okttrk[t].note;\r
+               ins = okttrk[t].ins;\r
+               eff = okttrk[t].eff;\r
+               dat = okttrk[t].dat;\r
+\r
+               if (note) {\r
+                       UniNote(note + 3*OCTAVE - 1);\r
+                       UniInstrument(ins);\r
+               }\r
+\r
+               if (eff)\r
+                       switch (eff) {\r
+                         case 1:                       /* Porta Up */\r
+                               UniPTEffect(0x1, dat);\r
+                               break;\r
+                         case 2:                       /* Portamento Down */\r
+                               UniPTEffect(0x2, dat);\r
+                               break;\r
+                         case 10:                      /* Arpeggio 3 supported */\r
+                               UniPTEffect(0x0, dat);\r
+                               break;\r
+                         case 15:      /* Amiga filter toggle, ignored */\r
+                               break;\r
+                         case 25:                      /* Pattern Jump */\r
+                               UniPTEffect(0xb, dat);\r
+                               break;\r
+                         case 27:                      /* Release - similar to Keyoff */\r
+                               UniWriteByte(UNI_KEYOFF);\r
+                               break;\r
+                         case 28:                      /* Set Tempo */\r
+                               UniPTEffect(0xf, dat);\r
+                               break;\r
+                         case 31:                      /* volume Control */\r
+                               if (dat <= 0x40)\r
+                                       UniPTEffect(0xc, dat);\r
+                               else if (dat <= 0x50)\r
+                                       UniEffect(UNI_XMEFFECTA, (dat - 0x40)); /* fast fade out */\r
+                               else if (dat <= 0x60)\r
+                                       UniEffect(UNI_XMEFFECTA, (dat - 0x50) << 4);    /* fast fade in */\r
+                               else if (dat <= 0x70)\r
+                                       UniEffect(UNI_XMEFFECTEB, (dat - 0x60));        /* slow fade out */\r
+                               else if (dat <= 0x80)\r
+                                       UniEffect(UNI_XMEFFECTEA, (dat - 0x70));        /* slow fade in */\r
+                               break;\r
+#ifdef MIKMOD_DEBUG\r
+                         default:\r
+                               fprintf(stderr, "\rUnimplemented effect (%02d,%02x)\n",\r
+                                               eff, dat);\r
+#endif\r
+                       }\r
+\r
+               UniNewline();\r
+       }\r
+       return UniDup();\r
+}\r
+\r
+/* Read "channel modes" i.e. channel number and panning information */\r
+static void OKT_doCMOD(void)\r
+{\r
+       /* amiga channel panning table */\r
+       UBYTE amigapan[4] = { 0x00, 0xff, 0xff, 0x00 };\r
+       int t;\r
+\r
+       of.numchn = 0;\r
+\r
+       for (t = 0; t < 4; t++)\r
+               if (_mm_read_M_UWORD(modreader)) {\r
+                       /* two channels tied to the same Amiga hardware voice */\r
+                       of.panning[of.numchn++] = amigapan[t];\r
+                       of.panning[of.numchn++] = amigapan[t];\r
+               } else\r
+                       /* one channel tied to the Amiga hardware voice */\r
+                       of.panning[of.numchn++] = amigapan[t];\r
+}\r
+\r
+/* Read sample information */\r
+static BOOL OKT_doSAMP(int len)\r
+{\r
+       int t;\r
+       SAMPLE *q;\r
+       OKTSAMPLE s;\r
+\r
+       of.numins = of.numsmp = (len / 0x20);\r
+       if (!AllocSamples())\r
+               return 0;\r
+\r
+       for (t = 0, q = of.samples; t < of.numins; t++, q++) {\r
+               _mm_read_UBYTES(s.sampname, 20, modreader);\r
+               s.len = _mm_read_M_ULONG(modreader);\r
+               s.loopbeg = _mm_read_M_UWORD(modreader);\r
+               s.looplen = _mm_read_M_UWORD(modreader);\r
+               _mm_read_UBYTE(modreader);\r
+               s.volume = _mm_read_UBYTE(modreader);\r
+               _mm_read_M_UWORD(modreader);\r
+\r
+               if (_mm_eof(modreader)) {\r
+                       _mm_errno = MMERR_LOADING_SAMPLEINFO;\r
+                       return 0;\r
+               }\r
+\r
+               if (!s.len)\r
+                       q->seekpos = q->length = q->loopstart = q->loopend = q->flags = 0;\r
+               else {\r
+                       s.len--;\r
+                       /* sanity checks */\r
+                       if (s.loopbeg > s.len)\r
+                               s.loopbeg = s.len;\r
+                       if (s.loopbeg + s.looplen > s.len)\r
+                               s.looplen = s.len - s.loopbeg;\r
+                       if (s.looplen < 2)\r
+                               s.looplen = 0;\r
+\r
+                       q->length = s.len;\r
+                       q->loopstart = s.loopbeg;\r
+                       q->loopend = s.looplen + q->loopstart;\r
+                       q->volume = s.volume;\r
+                       q->flags = SF_SIGNED;\r
+\r
+                       if (s.looplen)\r
+                               q->flags |= SF_LOOP;\r
+               }\r
+               q->samplename = DupStr(s.sampname, 20, 1);\r
+               q->speed = 8363;\r
+       }\r
+       return 1;\r
+}\r
+\r
+/* Read speed information */\r
+static void OKT_doSPEE(void)\r
+{\r
+       int tempo = _mm_read_M_UWORD(modreader);\r
+\r
+       of.initspeed = tempo;\r
+}\r
+\r
+/* Read song length information */\r
+static void OKT_doSLEN(void)\r
+{\r
+       of.numpat = _mm_read_M_UWORD(modreader);\r
+}\r
+\r
+/* Read pattern length information */\r
+static void OKT_doPLEN(void)\r
+{\r
+       of.numpos = _mm_read_M_UWORD(modreader);\r
+}\r
+\r
+/* Read order table */\r
+static BOOL OKT_doPATT(void)\r
+{\r
+       int t;\r
+\r
+       if (!of.numpos || !AllocPositions(of.numpos))\r
+               return 0;\r
+\r
+       for (t = 0; t < 128; t++)\r
+               if (t < of.numpos)\r
+                       of.positions[t] = (UWORD)_mm_read_UBYTE(modreader);\r
+               else\r
+                       break;\r
+\r
+       return 1;\r
+}\r
+\r
+static BOOL OKT_doPBOD(int patnum)\r
+{\r
+       char *patbuf;\r
+       int rows, i;\r
+       int u;\r
+\r
+       if (!patnum) {\r
+               of.numtrk = of.numpat * of.numchn;\r
+\r
+               if (!AllocTracks() || !AllocPatterns())\r
+                       return 0;\r
+       }\r
+\r
+       /* Read pattern */\r
+       of.pattrows[patnum] = rows = _mm_read_M_UWORD(modreader);\r
+\r
+       if (!(okttrk = (OKTNOTE *) _mm_calloc(rows, sizeof(OKTNOTE))) ||\r
+           !(patbuf = (char *)_mm_calloc(rows * of.numchn, sizeof(OKTNOTE))))\r
+               return 0;\r
+       _mm_read_UBYTES(patbuf, rows * of.numchn * sizeof(OKTNOTE), modreader);\r
+       if (_mm_eof(modreader)) {\r
+               _mm_errno = MMERR_LOADING_PATTERN;\r
+               return 0;\r
+       }\r
+\r
+       for (i = 0; i < of.numchn; i++) {\r
+               for (u = 0; u < rows; u++) {\r
+                       okttrk[u].note = patbuf[(u * of.numchn + i) * sizeof(OKTNOTE)];\r
+                       okttrk[u].ins = patbuf[(u * of.numchn + i) * sizeof(OKTNOTE) + 1];\r
+                       okttrk[u].eff = patbuf[(u * of.numchn + i) * sizeof(OKTNOTE) + 2];\r
+                       okttrk[u].dat = patbuf[(u * of.numchn + i) * sizeof(OKTNOTE) + 3];\r
+               }\r
+\r
+               if (!(of.tracks[patnum * of.numchn + i] = OKT_ConvertTrack(rows)))\r
+                       return 0;\r
+       }\r
+       _mm_free(patbuf);\r
+       _mm_free(okttrk);\r
+       return 1;\r
+}\r
+\r
+static void OKT_doSBOD(int insnum)\r
+{\r
+       of.samples[insnum].seekpos = _mm_ftell(modreader);\r
+}\r
+\r
+BOOL OKT_Load(BOOL curious)\r
+{\r
+       UBYTE id[4];\r
+       ULONG len;\r
+       ULONG fp;\r
+       BOOL seen_cmod = 0, seen_samp = 0, seen_slen = 0, seen_plen = 0, seen_patt\r
+                       = 0, seen_spee = 0;\r
+       int patnum = 0, insnum = 0;\r
+\r
+       /* skip OKTALYZER header */\r
+       _mm_fseek(modreader, 8, SEEK_SET);\r
+       of.songname = strdup("");\r
+\r
+       of.modtype = strdup("Amiga Oktalyzer");\r
+       of.numpos = of.reppos = 0;\r
+       \r
+       /* default values */\r
+       of.initspeed = 6;\r
+       of.inittempo = 125;\r
+       \r
+       while (1) {\r
+               /* read block header */\r
+               _mm_read_UBYTES(id, 4, modreader);\r
+               len = _mm_read_M_ULONG(modreader);\r
+               \r
+               if (_mm_eof(modreader))\r
+                       break;\r
+               fp = _mm_ftell(modreader);\r
+               \r
+               if (!memcmp(id, "CMOD", 4)) {\r
+                       if (!seen_cmod) {\r
+                               OKT_doCMOD();\r
+                               seen_cmod = 1;\r
+                       } else {\r
+                               _mm_errno = MMERR_LOADING_HEADER;\r
+                               return 0;\r
+                       }\r
+               } else if (!memcmp(id, "SAMP", 4)) {\r
+                       if (!seen_samp && OKT_doSAMP(len))\r
+                               seen_samp = 1;\r
+                       else {\r
+                               _mm_errno = MMERR_LOADING_HEADER;\r
+                               return 0;\r
+                       }\r
+               } else if (!memcmp(id, "SPEE", 4)) {\r
+                       if (!seen_spee) {\r
+                               OKT_doSPEE();\r
+                               seen_spee = 1;\r
+                       } else {\r
+                               _mm_errno = MMERR_LOADING_HEADER;\r
+                               return 0;\r
+                       }\r
+               } else if (!memcmp(id, "SLEN", 4)) {\r
+                       if (!seen_slen) {\r
+                               OKT_doSLEN();\r
+                               seen_slen = 1;\r
+                       } else {\r
+                               _mm_errno = MMERR_LOADING_HEADER;\r
+                               return 0;\r
+                       }\r
+               } else if (!memcmp(id, "PLEN", 4)) {\r
+                       if (!seen_plen) {\r
+                               OKT_doPLEN();\r
+                               seen_plen = 1;\r
+                       } else {\r
+                               _mm_errno = MMERR_LOADING_HEADER;\r
+                               return 0;\r
+                       }\r
+               } else if (!memcmp(id, "PATT", 4)) {\r
+                       if (!seen_plen) {\r
+                               _mm_errno = MMERR_LOADING_HEADER;\r
+                               return 0;\r
+                       }\r
+                       if (!seen_patt && OKT_doPATT())\r
+                               seen_patt = 1;\r
+                       else {\r
+                               _mm_errno = MMERR_LOADING_HEADER;\r
+                               return 0;\r
+                       }\r
+               } else if (!memcmp(id,"PBOD", 4)) {\r
+                       /* need to know numpat and numchn */\r
+                       if (!seen_slen || !seen_cmod || (patnum >= of.numpat)) {\r
+                               _mm_errno = MMERR_LOADING_HEADER;\r
+                               return 0;\r
+                       }\r
+                       if (!OKT_doPBOD(patnum++)) {\r
+                               _mm_errno = MMERR_LOADING_PATTERN;\r
+                               return 0;\r
+                       }\r
+               } else if (!memcmp(id,"SBOD",4)) {\r
+                       /* need to know numsmp */\r
+                       if (!seen_samp) {\r
+                               _mm_errno = MMERR_LOADING_HEADER;\r
+                               return 0;\r
+                       }\r
+                       while ((insnum < of.numins) && !of.samples[insnum].length)\r
+                               insnum++;\r
+                       if (insnum >= of.numins) {\r
+                               _mm_errno = MMERR_LOADING_HEADER;\r
+                               return 0;\r
+                       }\r
+                       OKT_doSBOD(insnum++);\r
+               }\r
+\r
+               /* goto next block start position */\r
+               _mm_fseek(modreader, fp + len, SEEK_SET);\r
+       }\r
+\r
+       if (!seen_cmod || !seen_samp || !seen_patt ||\r
+               !seen_slen || !seen_plen || (patnum != of.numpat)) {\r
+               _mm_errno = MMERR_LOADING_HEADER;\r
+               return 0;\r
+       }\r
+\r
+       return 1;\r
+}\r
+\r
+CHAR *OKT_LoadTitle(void)\r
+{\r
+       return strdup("");\r
+}\r
+\r
+/*========== Loader information */\r
+\r
+MLOADER load_okt = {\r
+       NULL,\r
+       "OKT",\r
+       "OKT (Amiga Oktalyzer)",\r
+       NULL,\r
+       OKT_Test,\r
+       OKT_Load,\r
+       NULL,\r
+       OKT_LoadTitle\r
+};\r
+\r
+/* ex:set ts=4: */\r
index 7e6f36a..e842a6d 100644 (file)
@@ -83,41 +83,25 @@ STMNOTE;
 static STMNOTE *stmbuf = NULL;
 static STMHEADER *mh = NULL;
 
-/* tracker identifiers */
-#define NUMTRACKERS 3
-static CHAR mod2stm_sig[] = "BMOD2STM";
-static CHAR scream_sig[] = "!Scream!";
-static CHAR wuzamod_sig[] = "WUZAMOD!";
-static CHAR *STM_Signatures[NUMTRACKERS] =
-{
-  scream_sig,
-  mod2stm_sig,
-  wuzamod_sig
-};
-static CHAR *STM_Version[NUMTRACKERS] =
-{
-  "Screamtracker 2",
-  "Converted by MOD2STM (STM format)",
-  "Wuzamod (STM format)"
-};
-
 /*========== Loader code */
 
 BOOL 
 STM_Test (void)
 {
   UBYTE str[44];
+  int t;
 
   _mm_fseek (modreader, 20, SEEK_SET);
   _mm_read_UBYTES (str, 44, modreader);
   if (str[9] != 2)
     return 0;                  /* STM Module = filetype 2 */
 
-  if (!memcmp (str, mod2stm_sig, 8))
-    return 1;
+  if(!memcmp (str + 40, "SCRM", 4))
+    return 0;
 
-  if ((!memcmp (str, scream_sig, 8)) && (memcmp (str + 40, "SCRM", 4)))
-    return 1;
+  for (t=0;t<STM_NTRACKERS;t++)
+    if(!memcmp (str, STM_Signatures[t], 8))
+      return 1;
 
   return 0;
 }
@@ -323,7 +307,7 @@ STM_Load (BOOL curious)
     }
 
   /* set module variables */
-  for (t = 0; t < NUMTRACKERS; t++)
+  for (t = 0; t < STM_NTRACKERS; t++)
     if (!memcmp (mh->trackername, STM_Signatures[t], 8))
       break;
   of.modtype = strdup (STM_Version[t]);
@@ -361,7 +345,7 @@ STM_Load (BOOL curious)
     {
       /* load sample info */
       q->samplename = DupStr (mh->sample[t].filename, 12, 1);
-      q->speed = mh->sample[t].c2spd;
+      q->speed = (mh->sample[t].c2spd * 8363L) / 8448;
       q->volume = mh->sample[t].volume;
       q->length = mh->sample[t].length;
       if ( /*(!mh->sample[t].volume)|| */ (q->length == 1))
@@ -380,7 +364,7 @@ STM_Load (BOOL curious)
       if (q->loopstart >= q->length)
        q->loopstart = q->loopend = 0;
 
-      if ((q->loopend > 0) && (q->loopend != 0xffff))
+      if ((q->loopend > 0) && (q->loopend != 0xffff) && (q->loopend!=q->loopstart))
        q->flags |= SF_LOOP;
       /* fix replen if repend>length */
       if (q->loopend > q->length)
index ce1f3ec..e50d600 100644 (file)
@@ -46,7 +46,7 @@
 typedef struct STXHEADER
   {
     CHAR songname[20];
-    CHAR scream[8];
+    CHAR trackername[8];
     UWORD patsize;
     UWORD unknown1;
     UWORD patptr;
@@ -107,14 +107,16 @@ static BOOL
 STX_Test (void)
 {
   UBYTE id[8];
+  int t;
 
-  _mm_fseek (modreader, 0x14, SEEK_SET);
-  if (!_mm_read_UBYTES (id, 8, modreader))
-    return 0;
-  if (memcmp (id, "!Scream!", 8))
+  _mm_fseek(modreader,0x14,SEEK_SET);
+  if(!_mm_read_UBYTES(id, 8, modreader))
     return 0;
 
-  _mm_fseek (modreader, 0x20, SEEK_CUR);
+  for(t=0;t<STM_NTRACKERS;t++)
+    if(!memcmp(id,STM_Signatures[t],8)) return 1;
+
+  _mm_fseek (modreader, 0x3C, SEEK_SET);
   if (!_mm_read_UBYTES (id, 4, modreader))
     return 0;
   if (memcmp (id, "SCRM", 4))
@@ -180,7 +182,11 @@ STX_ReadPattern (void)
              n->ins = _mm_read_UBYTE (modreader);
            }
          if (flag & 64)
-           n->vol = _mm_read_UBYTE (modreader);
+           {
+             n->vol = _mm_read_UBYTE (modreader);
+             if (n->vol > 64)
+               n->vol = 64;
+           }
          if (flag & 128)
            {
              n->cmd = _mm_read_UBYTE (modreader);
@@ -291,7 +297,7 @@ STX_Load (BOOL curious)
 
   /* try to read module header */
   _mm_read_string (mh->songname, 20, modreader);
-  _mm_read_string (mh->scream, 8, modreader);
+  _mm_read_string (mh->trackername, 8, modreader);
   mh->patsize = _mm_read_I_UWORD (modreader);
   mh->unknown1 = _mm_read_I_UWORD (modreader);
   mh->patptr = _mm_read_I_UWORD (modreader);
@@ -317,6 +323,16 @@ STX_Load (BOOL curious)
       return 0;
     }
 
+  for (t = 0; t < STM_NTRACKERS; t++)
+    if (!memcmp (mh->trackername, STM_Signatures[t], 8))
+      break;
+
+  of.modtype = _mm_malloc(
+    strlen(STM_Version[t]) +
+    strlen("STM2STX 1.x ()") + 1);
+
+  sprintf(of.modtype, "STM2STX 1.x (%s)", STM_Version[t]);
+
   /* set module variables */
   of.songname = DupStr (mh->songname, 20, 1);
   of.numpat = mh->patnum;
@@ -342,12 +358,12 @@ STX_Load (BOOL curious)
   if (version == mh->patsize)
     {
       version = 0x10;
-      of.modtype = strdup ("STMIK 0.2 (STM2STX 1.0)");
+      of.modtype[10] = '0';
     }
   else
     {
       version = 0x11;
-      of.modtype = strdup ("STMIK 0.2 (STM2STX 1.1)");
+      of.modtype[10] = '1';
     }
 
   /* read the order data */
@@ -413,7 +429,7 @@ STX_Load (BOOL curious)
        }
 
       q->samplename = DupStr (s.sampname, 28, 1);
-      q->speed = s.c2spd;
+      q->speed = (s.c2spd * 8363) / 8448;
       q->length = s.length;
       q->loopstart = s.loopbeg;
       q->loopend = s.loopend;
@@ -423,12 +439,11 @@ STX_Load (BOOL curious)
 
       /* fix for bad converted STMs */
       if (q->loopstart >= q->length)
-       {
-         q->loopstart = q->loopend = 0;
-         s.flags &= ~1;
-       }
+       q->loopstart = q->loopend = 0;
 
-      if (s.flags & 1)
+      /* some modules come with loopstart == loopend == 0, yet have the
+       * looping flag set */
+      if ((s.flags & 1) && (q->loopstart != q->loopend))
        {
          q->flags |= SF_LOOP;
          if (q->loopend > q->length)
index 665a011..4bd4e2c 100644 (file)
@@ -118,7 +118,7 @@ UNI_Test (void)
   /* UNIMod created by APlayer */
   if (!(memcmp (id, "APUN\01", 5)))
     {
-      if ((id[5] >= 1) && (id[5] <= 3))
+      if ((id[5] >= 1) && (id[5] <= 4))
        return 1;
     }
   return 0;
index 9edbf62..4ed87b7 100644 (file)
@@ -524,9 +524,11 @@ LoadInstruments (void)
              for (u = headend - _mm_ftell (modreader); u; u--)
                _mm_read_UBYTE (modreader);
 
-             /* #@!$&% fix for K_OSPACE.XM */
-             if (pth.volpts == 32)
-               pth.volpts = XMENVCNT / 2;
+             /* #@!$&% fix for K_OSPACE.XM and possibly others */
+             if(pth.volpts > XMENVCNT/2)
+               pth.volpts = XMENVCNT/2;
+             if(pth.panpts > XMENVCNT/2)
+               pth.panpts = XMENVCNT/2;
 
              if ((_mm_eof (modreader)) || (pth.volpts > XMENVCNT / 2) || (pth.panpts > XMENVCNT / 2))
                {
@@ -549,6 +551,10 @@ LoadInstruments (void)
              d->volfade = pth.volfade;
 
 #define XM_ProcessEnvelope(name)                                                                                       \
+                               for (u = 0; u < (XMENVCNT / 2); u++) {                                          \
+                                       d->##name##env[u].pos = pth.##name##env[2*u];           \
+                                       d->##name##env[u].val = pth.##name##env[2*u + 1];       \
+                               }                                                                                                                       \
                                memcpy(d->##name##env,pth.##name##env,XMENVCNT);                        \
                                if (pth.##name##flg&1) d->##name##flg|=EF_ON;                           \
                                if (pth.##name##flg&2) d->##name##flg|=EF_SUSTAIN;                      \
index b62013a..5686e9a 100644 (file)
@@ -1181,6 +1181,7 @@ ML_RegisterAllLoaders (void)
   LOADER (load_imf);
   LOADER (load_med);
   LOADER (load_mtm);
+  LOADER (load_okt);
   LOADER (load_stm);
   LOADER (load_stx);
   LOADER (load_ult);
index b58dbb0..424f586 100644 (file)
@@ -48,6 +48,21 @@ UBYTE  activemacro;         /* active midi macro number for Sxx,xx<80h */
 UBYTE  filtermacros[16];    /* midi macros settings */
 FILTER filtersettings[256]; /* computed filter settings */
 
+/* tracker identifiers */
+CHAR *STM_Signatures[STM_NTRACKERS] =
+{
+  "!Scream",
+  "BMOD2STM",
+  "WUZAMOD!"
+};
+CHAR *STM_Version[STM_NTRACKERS] =
+{
+  "Screamtracker 2",
+  "Converted by MOD2STM (STM format)",
+  "Wuzamod (STM format)"
+};
+
+
 /*========== Linear periods stuff */
 
 
@@ -328,7 +343,7 @@ void S3MIT_CreateOrders(BOOL curious)
                if(origpositions[t]<254) of.numpos++;
                else
                        /* end of song special order */
-                       if((of.positions[t]==255)&&(!(curious--))) break;
+                       if((origpositions[t]==255)&&(!(curious--))) break;
        }
 }
 
@@ -506,7 +521,7 @@ void UniPTEffect(UBYTE eff, UBYTE dat)
                fprintf(stderr,"UniPTEffect called with incorrect eff value %d\n",eff);
        else
 #endif
-       if((eff)||(dat)) UniEffect(UNI_PTEFFECT0+eff,dat);
+       if((eff)||(dat)||(of.flags & UF_ARPMEM)) UniEffect(UNI_PTEFFECT0+eff,dat);
 }
 
 /* Appends UNI_VOLEFFECT + effect/dat to unistream. */
index 4aaf0df..eb4f844 100644 (file)
@@ -126,6 +126,12 @@ extern FILTER filtersettings[256]; /* computed filter settings */
 
 extern int *noteindex;
 
+/* tracker identifiers */
+#define STM_NTRACKERS 3
+extern CHAR *STM_Signatures[];
+extern CHAR *STM_Version[];
+
+
 /*========== Internal loader interface */
 
 extern BOOL ReadComment (UWORD);
index 8100ef9..d64d05a 100644 (file)
@@ -62,8 +62,7 @@ void do_effect(int32* buf, int32 count)
     effect_left_right_delay(buf, count);
 
     /* Noise shaping filter must apply at last */
-    if(
-       !(play_mode->encoding & (PE_16BIT|PE_ULAW|PE_ALAW)))
+    if(!(play_mode->encoding & (PE_16BIT|PE_ULAW|PE_ALAW)))
        ns_shaping8(buf, count);
 }
 
index 7a545f3..b834907 100644 (file)
@@ -83,6 +83,9 @@ int recompute_envelope(int v)
         *  it will take to decay a note at maximum volume.
         * 2000-3000 msec seem to be decent values to use.
         *
+        * 08/24/00 changed behavior to not begin the decay until
+        *  after the sample plays past it's loop start
+        *
         */
 
        if(min_sustain_time <= 0)       /* Default behavior */
@@ -91,7 +94,8 @@ int recompute_envelope(int v)
            vp->envelope_increment = 0;
        }
        else if((vp->status & VOICE_SUSTAINED) &&
-               (vp->sample->modes & MODES_LOOPING))
+               (vp->sample->modes & MODES_LOOPING) &&
+               (vp->sample_offset - vp->sample->loop_start >= 0))
        {
            if(min_sustain_time == 1)
                goto next_stage; /* Go to next stage.
index b866430..2e1a880 100644 (file)
@@ -370,9 +370,15 @@ MP_FindEmptyChannel (void)
   ULONG t, k, tvol, pp;
 
   for (t = 0; t < MOD_NUM_VOICES; t++)
-    if (((mp.voice[t].kick == KICK_ABSENT) || (mp.voice[t].kick == KICK_ENV)) &&
-       Voice_Stopped (t))
-      return t;
+    {
+      /* allow us to take over a nonexisting sample */
+      if (!a->s)
+        return k;
+
+      if (((mp.voice[t].kick == KICK_ABSENT) || (mp.voice[t].kick == KICK_ENV)) &&
+         Voice_Stopped (t))
+        return t;
+    }
 
   tvol = 0xffffffUL;
   t = 0;
@@ -393,6 +399,7 @@ MP_FindEmptyChannel (void)
 
   if (tvol > 8000 * 7)
     return -1;
+
   return t;
 }
 
@@ -844,8 +851,6 @@ DoS3MVolSlide (UBYTE inf)
 {
   UBYTE lo, hi;
 
-  mp.explicitslides = 1;
-
   if (inf)
     a->s3mvolslide = inf;
   else
@@ -1354,7 +1359,7 @@ DoITTempo (UBYTE tempo)
 {
   SWORD temp = mp.newbpm;
 
-  if (mp.vbtick || mp.patdly2)
+  if (mp.patdly2)
     return;
 
   if (tempo & 0x10)
@@ -1585,7 +1590,7 @@ DoSSEffects (UBYTE dat)
     case SS_PANNING:           /* S8x set panning position */
       DoEEffects (0x80 | inf);
       break;
-    case SS_SURROUND:          /* S9x set surround Sound */
+    case SS_SURROUND:          /* S9x set surround sound */
       a->panning = pf->panning[mp.channel] = PAN_SURROUND;
       break;
     case SS_HIOFFSET:          /* SAy set high order sample offset yxx00h */
@@ -1727,18 +1732,14 @@ pt_playeffects (void)
       a->sliding = 0;
       switch (c)
        {
-       case UNI_NOTE:
-       case UNI_INSTRUMENT:
-         a->sliding = oldsliding;
-         UniSkipOpcode (c);
-         break;
        case UNI_PTEFFECT0:
          dat = UniGetByte ();
          if (!mp.vbtick)
            {
              if ((!dat) && (pf->flags & UF_ARPMEM))
                dat = a->arpmem;
-             a->arpmem = dat;
+             else
+               a->arpmem = dat;
            }
          if (a->period)
            DoArpeggio (a->arpmem);
@@ -2055,10 +2056,14 @@ pt_playeffects (void)
 
              if ((aout = a->slave))
                {
-                 points = i->volenv[i->volpts - 1].pos;
-                 aout->venv.p = aout->venv.env[(dat > points) ? points : dat].pos;
-                 points = i->panenv[i->panpts - 1].pos;
-                 aout->penv.p = aout->penv.env[(dat > points) ? points : dat].pos;
+                 if (aout->venv.env) {
+                   points = i->volenv[i->volpts - 1].pos;
+                   aout->venv.p = aout->venv.env[(dat > points) ? points : dat].pos;
+                 }
+                 if (aout->penv.env) {
+                   points = i->panenv[i->panpts - 1].pos;
+                   aout->penv.p = aout->penv.env[(dat > points) ? points : dat].pos;
+                 }
                }
            }
          break;
@@ -2196,6 +2201,8 @@ pt_playeffects (void)
        case UNI_MEDEFFECTF3:
          DoEEffects (0x90 | (mp.sngspd / 3));
          break;
+       /* case UNI_NOTE: */
+       /* case UNI_INSTRUMENT: */
        default:
          a->sliding = oldsliding;
          UniSkipOpcode (c);
@@ -2311,6 +2318,10 @@ pt_UpdateVoices ()
          aout->aswppos = 0;
        }
 
+      /* check for a dead note (fadevol=0) */
+      if (!aout->fadevol || kick_voice)
+       Voice_Stop (mp.channel);
+
       if (i && ((aout->kick == KICK_NOTE) || (aout->kick == KICK_ENV)))
        {
          StartEnvelope (&aout->venv, aout->volflg, i->volpts, i->volsusbeg,
@@ -2454,16 +2465,12 @@ pt_UpdateVoices ()
 
       if (!aout->fadevol)
        {                       /* check for a dead note (fadevol=0) */
-         Voice_Stop (mp.channel);
          mp.totalchn--;
          if ((tmpvol) && (aout->master) && (aout->master->slave == aout))
            mp.realchn--;
        }
       else
        {
-         if (kick_voice)
-           Voice_Stop (mp.channel);
-
          Voice_SetPeriod (mp.channel,
                      getAmigaPeriod (pf->flags, playperiod));
 
@@ -2546,6 +2553,7 @@ pt_Notes (void)
            a->i = (pf->flags & UF_INST) ? &pf->instruments[inst] : NULL;
            a->retrig = 0;
            a->s3mtremor = 0;
+           a->ultoffset = 0;
            a->sample = inst;
            break;
          default:
@@ -2613,7 +2621,7 @@ pt_Notes (void)
              a->panflg = 0;
              a->nna = 0;
              a->dca = 0;
-             a->dct = 0;
+             a->dct = DCT_OFF;
            }
 
          if (funky & 2)        /* instrument change */
@@ -2680,16 +2688,8 @@ pt_EffectsPass1 (void)
       /* continue volume slide if necessary for XM and IT */
       if (pf->flags & UF_BGSLIDES)
        {
-         if (!mp.explicitslides)
-           switch (a->sliding)
-             {
-             case 1:
-               DoS3MVolSlide (0);
-               break;
-             case 2:
-               DoXMVolSlide (0);
-               break;
-             }
+         if (!mp.explicitslides && a->sliding)
+           DoS3MVolSlide(0);
          else if (a->tmpvolume)
            a->sliding = mp.explicitslides;
        }
@@ -2829,13 +2829,13 @@ pt_SetupVoices (void)
          else
            a->slave = &mp.voice[a->slavechn = mp.channel];
 
-         /* assign parts of MP_VOICE only done for a KICK ! */
+         /* assign parts of MP_VOICE only done for a KICK_NOTE */
          if ((aout = a->slave))
            {
              if (aout->mflag && aout->master)
                aout->master->slave = NULL;
-             a->slave = aout;
              aout->master = a;
+             a->slave = aout;
              aout->masterchn = mp.channel;
              aout->mflag = 1;
            }
@@ -2845,7 +2845,6 @@ pt_SetupVoices (void)
 
       if (aout)
        {
-         aout->kick = a->kick;
          aout->i = a->i;
          aout->s = a->s;
          aout->sample = a->sample;
@@ -2854,6 +2853,7 @@ pt_SetupVoices (void)
          aout->panning = a->panning;
          aout->chanvol = a->chanvol;
          aout->fadevol = a->fadevol;
+         aout->kick = a->kick;
          aout->start = a->start;
          aout->volflg = a->volflg;
          aout->panflg = a->panflg;
index 618d1d8..b29f29c 100644 (file)
@@ -504,7 +504,7 @@ NULL
   while(*cmp)
   {
 #ifdef IA_DYNAMIC
-      if((*cmp)->id_character != 0)
+      if((*cmp)->id_character != dynamic_interface_id)
 #endif /* IA_DYNAMIC */
          fprintf(fp, "  -i%c     %s" NLS,
                  (*cmp)->id_character, (*cmp)->id_name);
@@ -521,6 +521,7 @@ NULL
       for(cmp = ctl_list; *cmp; cmp++)
          mark[(int)(*cmp)->id_character] = 1;
 
+      if (dynamic_interface_id != 0) mark[(int)dynamic_interface_id] = 0;
       list_dyna_interface(fp, dynamic_lib_root, mark);
   }
 #endif /* IA_DYNAMIC */
@@ -777,7 +778,7 @@ int set_ctl(char *cp)
            return 0;
        }
 #ifdef IA_DYNAMIC
-       else if(cmp->id_character == 0) /* Dynamic interface loader */
+       else if(cmp->id_character == dynamic_interface_id) /* Dynamic interface loader */
        {
            if(dynamic_interface_module(*cp) != NULL)
            {
index adb78cb..516218a 100644 (file)
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
 */
-
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif /* HAVE_CONFIG_H */
 #include "timidity.h"
 #ifdef JAPANESE
+
 /** Network Kanji Filter. (PDS Version)
 ************************************************************************
 ** Copyright (C) 1987, Fujitsu LTD. (Itaru ICHIKAWA)
-** Ï¢ÍíÀ衧 ¡Ê³ô¡ËÉÙ»ÎÄ̸¦µæ½ê¡¡¥½¥Õ¥È£³¸¦¡¡»ÔÀî¡¡»ê
+** Ï¢ÍíÀ衧 ¡Ê³ô¡ËÉÙ»ÎÄ̸¦µæ½ê¡¡¥½¥Õ¥È£³¸¦¡¡»ÔÀî¡¡»ê 
 ** ¡ÊE-Mail Address: ichikawa@flab.fujitsu.co.jp¡Ë
-**    ±ÄÍø¤òÌÜŪ¤È¤·¤Ê¤¤¸Â¤ê¡¢¤³¤Î¥½¡¼¥¹¤Î¤¤¤«¤Ê¤ë
-**    Ê£¼Ì¡¤²þÊÑ¡¤½¤Àµ¤âµöÂú¤·¤Þ¤¹¡£¤½¤ÎºÝ¤Ë¤Ï¡¢¤³¤ÎÉôʬ¤ò»Ä¤¹¤³¤È¡£
+** Copyright (C) 1996,1998
+** Ï¢ÍíÀ衧 Î°µåÂç³Ø¾ðÊ󹩳زʠ²ÏÌî ¿¿¼£  mine/X0208 support
+** ¡ÊE-Mail Address: kono@ie.u-ryukyu.ac.jp¡Ë
+** Ï¢ÍíÀ衧 COW for DOS & Win16 & Win32 & OS/2
+** ¡ÊE-Mail Address: GHG00637@niftyserve.or.p¡Ë
+**    ¤³¤Î¥½¡¼¥¹¤Î¤¤¤«¤Ê¤ëÊ£¼Ì¡¤²þÊÑ¡¤½¤Àµ¤âµöÂú¤·¤Þ¤¹¡£¤¿¤À¤·¡¢
+**    ¤½¤ÎºÝ¤Ë¤Ï¡¢Ã¯¤¬¹×¸¥¤·¤¿¤ò¼¨¤¹¤³¤ÎÉôʬ¤ò»Ä¤¹¤³¤È¡£
+**    ºÆÇÛÉۤ仨»ï¤ÎÉÕÏ¿¤Ê¤É¤ÎÌ䤤¹ç¤ï¤»¤âɬÍפ¢¤ê¤Þ¤»¤ó¡£
 **    ¤³¤Î¥×¥í¥°¥é¥à¤Ë¤Ä¤¤¤Æ¤ÏÆä˲¿¤ÎÊݾڤ⤷¤Ê¤¤¡¢°­¤·¤«¤é¤º¡£
-**    Everyone is permitted to do anything on this program
-**    including copying, modifying, improving
-**    as long as you don't try to make money off it,
-**    or pretend that you wrote it.
+**    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.
 ***********************************************************************/
 
    ²þÊѼԠ½Ð±ÀÀµ¾° 1997
 */
 
+/*
+  1.7¥Ù¡¼¥¹¤ËÊѹ¹¡£
+  ²þÊѼԠÀÄÌÚÂçÊå 2000.10
+*/
+
 /* ¤â¤·¡¤EUC-Japan ¤Î´°Á´¤Ê¥Á¥§¥Ã¥¯¤ò¤¹¤ë¾ì¹ç¤Ï EUC_STRICT_CHECK ¤òÄêµÁ
  * ¤·¤Æ¤¯¤À¤µ¤¤¡¥¤¿¤À¤·¡¤1 ¥Ð¥¤¥È¤Ç¤â EUC-Japan ¤Î̤ÄêµÁʸ»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤È
  * EUC ¤È¤ß¤Ê¤µ¤ì¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤¤¤Þ¤¹¡¥Â¾¤Î¥×¥í¥°¥é¥à¤Ç´Á»ú¥³¡¼¥É¤ò EUC ¤ËÊÑ´¹
 
 #if 0
 static char *CopyRight =
-      "Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa)";
+      "Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa),1998 S. Kono, COW";
 static char *Version =
-      "1.5";
+      "1.7";
 static char *Patchlevel =
-      "1/9503/Shinji Kono";
+      "0/9711/Shinji Kono";
 #endif
 
+/*
+**
+**
+**
+** USAGE:       nkf [flags] [file] 
+**
+** Flags:
+** b    Output is bufferred             (DEFAULT)
+** u    Output is unbufferred
+**
+** t    no operation
+**
+** j    Outout code is JIS 7 bit        (DEFAULT SELECT) 
+** s    Output code is MS Kanji         (DEFAULT SELECT) 
+** e    Output code is AT&T JIS         (DEFAULT SELECT) 
+** l    Output code is JIS 7bit and ISO8859-1 Latin-1
+**
+** m    MIME conversion for ISO-2022-JP
+** i_ Output sequence to designate JIS-kanji (DEFAULT_J)
+** o_ Output sequence to designate single-byte roman characters (DEFAULT_R)
+**
+** r  {de/en}crypt ROT13/47
+**
+** v  display Version
+**
+** T  Text mode output        (for MS-DOS)
+**
+** x    Do not convert X0201 kana into X0208
+** Z    Convert X0208 alphabet to ASCII
+**
+** f60  fold option
+**
+** m    MIME decode
+** B    try to fix broken JIS, missing Escape
+** B[1-9]  broken level
+**
+** O   Output to 'nkf.out' file 
+** d   Delete \r in line feed 
+** c   Add \r in line feed 
+**/
+/******************************/
+/* ¥Ç¥Õ¥©¥ë¥È¤Î½ÐÎÏ¥³¡¼¥ÉÁªÂò */
+/* Select DEFAULT_CODE */
+#define DEFAULT_CODE_JIS
+/* #define DEFAULT_CODE_SJIS */
+/* #define DEFAULT_CODE_EUC */
+/******************************/
+
 #if (defined(__TURBOC__) || defined(LSI_C)) && !defined(MSDOS)
 #define MSDOS
 #endif
@@ -103,9 +162,27 @@ static char *Patchlevel =
 #include <strings.h>
 #endif
 
+#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
+
+#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
+
 #include "common.h"
 #include "nkflib.h"
 
+#define VOIDVOID 0
+
 #ifndef FALSE
 #define        FALSE   0
 #endif /* FALSE */
@@ -114,33 +191,38 @@ static char *Patchlevel =
 #define        TRUE    1
 #endif /* TRUE */
 
-/* state of output_mode and input_mode */
+/* state of output_mode and input_mode  */
+
+#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
+#define         EUC_INPUT       8
 
-#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                EUC_INPUT       7
+#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
 
-#define                ESC     0x1b
-#define                SP      0x20
-#define                AT      0x40
-#define                SSP     0xa0
-#define                DEL     0x7f
-#define                SI      0x0f
-#define                SO      0x0e
-#define                SSO     0x8e
+#define         HOLD_SIZE       32
+#define         IOBUF_SIZE      16384
 
-#define                HOLD_SIZE       32
+#define         DEFAULT_J       'B'
+#define         DEFAULT_R       'B'
 
-#define                DEFAULT_J       'B'
-#define                DEFAULT_R       'B'
+#define         SJ0162  0x00e1          /* 01 - 62 ku offset */
+#define         SJ6394  0x0161          /* 63 - 94 ku offset */
 
-#define                SJ0162  0x00e1          /* 01 - 62 ku offset */
-#define                SJ6394  0x0161          /* 63 - 94 ku offset */
 
 /* SFILE begin */
 /* Ê¸»úÎó ¤ò FILE ¤ß¤¿¤¤¤Ë°·¤¦¾®ºÙ¹© */
@@ -210,87 +292,123 @@ static int sputc(int c,SFILE *sf);
 char *nkf_convert(char *si,char *so,int maxsize,char *in_mode,char *out_mode);
 char *nkf_conv(char *si,char *so,char *out_mode);
 
-/* mime related */
-static int     base64decode(int c);
-static int     mime_getc(SFILE *f);
-static int     mime_begin(SFILE *f);
-static int     mime_ungetc(unsigned int c);
-#define VOIDVOID 0
+static int check_kanji_code(unsigned char *p);
 
 /* MIME preprocessor */
-#define GETC(p)        ((!mime_mode)?sgetc(p):mime_getc(p))
-#define UNGETC(c,p)    ((!mime_mode)?sungetc(c,p):mime_ungetc(c))
+
+#undef STRICT_MIME       /* do stupid strict mime integrity check */
+#define GETC(p) ((!mime_mode)?sgetc(p):mime_getc(p))
+#define UNGETC(c,p)     ((!mime_mode)?sungetc(c,p):mime_ungetc(c))
+
+
+#ifdef EASYWIN /*Easy Win */
+extern POINT _BufferSize;
+#endif
+
+/*      function prototype  */
+
+static  int     noconvert(SFILE *f);
+static  int     kanji_convert(SFILE *f);
+static  int     h_conv(SFILE *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(SFILE *f);
+static  int     mime_getc(SFILE *f);
+static  int     mime_ungetc(unsigned int c);
+static  int     mime_integrity(SFILE *f,unsigned char *p);
+static  int     base64decode(int c);
+static  int     usage(void);
+static  void    arguments(char *c);
+static  void    reinit();
 
 /* buffers */
+
+static char            stdibuf[IOBUF_SIZE];
+static char            stdobuf[IOBUF_SIZE];
 static unsigned char   hold_buf[HOLD_SIZE*2];
-static int            hold_count;
+static int             hold_count;
 
 /* MIME preprocessor fifo */
-#define MIME_BUF_SIZE  4    /* 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;
+
+#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 */
 
 /* flags */
-static int     unbuf_f = FALSE,
-               estab_f = FALSE;
-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 = FALSE;         /* convert MIME base64 */
-static int     broken_f = FALSE;       /* convert ESC-less broken JIS */
-static int     iso8859_f = FALSE;      /* ISO8859 through */
-#ifdef MSDOS
-static int     x0201_f = TRUE;         /* Assume JISX0201 kana */
+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 */
+static int             x0201_f = NO_X0201;     /* Assume NO JISX0201 */
 #endif
 
 /* X0208 -> ASCII converter */
 
-static int     c1_return;
+static int             c1_return;
 
 /* fold parameter */
-static int line = 0;   /* chars in line */
+static int line = 0;    /* chars in line */
 static int prev = 0;
-static int fold_f  = FALSE;
-static int fold_len  = 0;
+static int             fold_f  = FALSE;
+static int             fold_len  = 0;
 
 /* options */
-static char    kanji_intro = DEFAULT_J,
-               ascii_intro = DEFAULT_R;
+static char            kanji_intro = DEFAULT_J,
+                ascii_intro = DEFAULT_R;
 
 /* Folding */
-static int fold(int c2, int c1);
+
+int line_fold();
 #define FOLD_MARGIN  10
+#define DEFAULT_FOLD 60
 
 /* converters */
-static int     s_iconv (int c2, int c1);
-static int     e_oconv (int c2, int c1);
-static int     j_oconv (int c2, int c1);
-static int     s_oconv (int c2, int c1);
-static int     convert (SFILE *f);
-static int     h_conv (SFILE *f, int c1, int c2);
-static int     push_hold_buf (int c2, int c1);
-static int     (*iconv) (int c2, int c1);   /* s_iconv or oconv */
-static int     (*oconv) (int c2, int c1);   /* [ejs]_oconv */
-static int     pre_convert(int c1, int c2);/* rot13 or JISX0201 -> JISX0208 */
-static int     check_kanji_code(unsigned char *p);
+
+#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
+
+static int             (*iconv)(int c2,int c1);   
+                                       /* s_iconv or oconv */
+static int             (*oconv)(int c2,int c1) = DEFAULT_CONV; 
+                                         /* [ejs]_oconv */
 
 /* Global states */
-static int     output_mode = ASCII,    /* output kanji mode */
-               input_mode = ASCII,     /* input kanji mode */
-               shift_mode = FALSE;     /* TRUE shift out, or X0201  */
-static int     mime_mode = FALSE;      /* MIME mode B base64, Q hex */
+static int             output_mode = ASCII,    /* output kanji mode */
+                input_mode =  ASCII,    /* input kanji mode */
+                shift_mode =  FALSE;    /* TRUE shift out, or X0201  */
+static int             mime_mode =   FALSE;    /* MIME mode B base64, Q hex */
 
-/* X0208 -> ASCII translation table */
 /* X0201 / X0208 conversion tables */
 
 /* X0201 kana conversion table */
 /* 90-9F A0-DF */
-static unsigned char cv[]= {
+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,
@@ -309,9 +427,10 @@ static unsigned char cv[]= {
 0x25,0x6f,0x25,0x73,0x21,0x2b,0x21,0x2c,
 0x00,0x00};
 
+
 /* X0201 kana conversion table for daguten */
 /* 90-9F A0-DF */
-static unsigned char dv[]= {
+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,
@@ -332,7 +451,7 @@ static unsigned char dv[]= {
 
 /* X0201 kana conversion table for han-daguten */
 /* 90-9F A0-DF */
-static unsigned char ev[]= {
+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,
@@ -351,14 +470,16 @@ static unsigned char ev[]= {
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00};
 
+
 /* X0208 kigou conversion table */
 /* 0x8140 - 0x819e */
-static unsigned char fv[] = {
+unsigned char fv[] = {
+
 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,0x7e,0x00,0x7c,0x00,0x00,0x60,0x27,
+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,
@@ -366,7 +487,7 @@ static unsigned char fv[] = {
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x24,0x00,0x00,0x25,0x23,0x26,0x2a,0x40,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-};
+} ;
 
 
 /* SFILE ´ØÏ¢´Ø¿ô */
@@ -454,6 +575,8 @@ nkf_convert(char *si, char *so, int maxsize, char *in_mode, char *out_mode)
   SFILE xfi,xfo;
   int a;
 
+  reinit(); /* »ÈÍÑ¡© */
+
   if(maxsize == -1)
     maxsize = SAFE_CONVERT_LENGTH(strlen(si));
   else if(maxsize == 0)
@@ -551,9 +674,8 @@ nkf_convert(char *si, char *so, int maxsize, char *in_mode, char *out_mode)
          x0201_f = TRUE;
   }
 
-
   /* ¥³¥ó¥Ð¡¼¥È */
-  convert(fi);
+  kanji_convert(fi);
 
 /* ¸å½èÍý */
   sputchar('\0');
@@ -625,7 +747,7 @@ static int check_kanji_code(unsigned char *p)
     mode = ASCII;
     while(*p)
     {
-       if(*p < SP || *p >= DEL)
+       if(*p < SPACE || *p >= DEL)
        {
            if(*p == ESC)
                return JIS_INPUT;
@@ -728,407 +850,682 @@ static void fix_euc_code(unsigned char *s, int len)
 }
 #endif /* EUC_STRICT_CHECK */
 
-static int
-convert(SFILE *f)
+
+static int             file_out = FALSE;
+static int             add_cr = FALSE;
+static int             del_cr = FALSE;
+static int             end_check;
+
+#if 0
+#ifndef PERL_XS
+int
+main(argc, argv)
+    int             argc;
+    char          **argv;
+{
+    FILE  *fin;
+    char  *cp;
+
+#ifdef EASYWIN /*Easy Win */
+    _BufferSize.y = 400;/*Set Scroll Buffer Size*/
+#endif
+
+    for (argc--,argv++; (argc > 0) && **argv == '-'; argc--, argv++) {
+        cp = *argv;
+       arguments(cp);
+    }
+
+    if(iso8859_f && (oconv != j_oconv || !x0201_f )) {
+        fprintf(stderr,"Mixed ISO8859/JISX0201/SJIS/EUC output is not allowed.\n");
+        exit(1);
+    }
+
+    if(binmode_f == TRUE)
+#ifdef __OS2__
+    if(freopen("","wb",stdout) == NULL) 
+        return (-1);
+#else
+    setbinmode(stdout);
+#endif
+
+    if(unbuf_f)
+      setbuf(stdout, (char *) NULL);
+    else
+      setvbuffer(stdout, stdobuf, IOBUF_SIZE);
+
+    if(argc == 0) {
+      if(binmode_f == TRUE)
+#ifdef __OS2__
+      if(freopen("","rb",stdin) == NULL) return (-1);
+#else
+      setbinmode(stdin);
+#endif
+      setvbuffer(stdin, stdibuf, IOBUF_SIZE);
+      if(nop_f)
+          noconvert(stdin);
+      else
+          kanji_convert(stdin);
+    } else {
+      while (argc--) {
+          if((fin = fopen(*argv++, "r")) == NULL) {
+              perror(*--argv);
+              return(-1);
+          } else {
+/* reopen file for stdout */
+              if(file_out == TRUE){ 
+                  if(argc == 1 ) {
+                      if(freopen(*argv++, "w", stdout) == NULL) {
+                          perror(*--argv);
+                          return (-1);
+                      }
+                      argc--;
+                  } else {
+                      if(freopen("nkf.out", "w", stdout) == NULL) {
+                         perror(*--argv);
+                         return (-1);
+                      }
+                  }
+                  if(binmode_f == TRUE) {
+#ifdef __OS2__
+                      if(freopen("","wb",stdout) == NULL) 
+                           return (-1);
+#else
+                      setbinmode(stdout);
+#endif
+                  }
+              }
+              if(binmode_f == TRUE)
+#ifdef __OS2__
+                 if(freopen("","rb",fin) == NULL) 
+                    return (-1);
+#else
+                 setbinmode(fin);
+#endif 
+              setvbuffer(fin, stdibuf, IOBUF_SIZE);
+              if(nop_f)
+                  noconvert(fin);
+              else
+                  kanji_convert(fin);
+              fclose(fin);
+          }
+      }
+    }
+#ifdef EASYWIN /*Easy Win */
+    if(file_out == FALSE) 
+        scanf("%d",&end_check);
+    else 
+        fclose(stdout);
+#else /* for Other OS */
+    if(file_out == TRUE) 
+        fclose(stdout);
+#endif 
+    return (0);
+}
+#endif
+
+void
+arguments(char *cp) 
+{
+    while (*cp) {
+       switch (*cp++) {
+       case 'b':           /* buffered mode */
+           unbuf_f = FALSE;
+           continue;
+       case 'u':           /* non bufferd mode */
+           unbuf_f = TRUE;
+           continue;
+       case 't':           /* transparent mode */
+           nop_f = TRUE;
+           continue;
+       case 'j':           /* JIS output */
+       case 'n':
+           oconv = j_oconv;
+           continue;
+       case 'e':           /* AT&T EUC output */
+           oconv = e_oconv;
+           continue;
+       case 's':           /* SJIS output */
+           oconv = s_oconv;
+           continue;
+       case 'l':           /* ISO8859 Latin-1 support, no conversion */
+           iso8859_f = TRUE;  /* Only compatible with ISO-2022-JP */
+           input_f = LATIN1_INPUT;
+           continue;
+       case 'i':           /* Kanji IN ESC-$-@/B */
+           if(*cp=='@'||*cp=='B') 
+               kanji_intro = *cp++;
+           continue;
+       case 'o':           /* ASCII IN ESC-(-J/B */
+           if(*cp=='J'||*cp=='B'||*cp=='H') 
+               ascii_intro = *cp++;
+           continue;
+       case 'r':
+           rot_f = TRUE;
+           continue;
+#if defined(MSDOS) || defined(__OS2__) 
+       case 'T':
+           binmode_f = FALSE;
+           continue;
+#endif
+#ifndef PERL_XS
+       case 'v':
+           usage();
+           exit(1);
+           break;
+#endif
+       /* Input code assumption */
+       case 'J':   /* JIS input */
+       case 'E':   /* AT&T EUC input */
+           input_f = JIS_INPUT;
+           continue;
+       case 'S':   /* MS Kanji input */
+           input_f = SJIS_INPUT;
+           if(x0201_f==NO_X0201) x0201_f=TRUE;
+           continue;
+       case 'Z':   /* Convert X0208 alphabet to asii */
+           /*  bit:0   Convert X0208
+               bit:1   Convert Kankaku to one space
+               bit:2   Convert Kankaku to two spaces
+           */
+           if('9'>= *cp && *cp>='0') 
+               alpha_f |= 1<<(*cp++ -'0');
+           else 
+               alpha_f |= TRUE;
+           continue;
+       case 'x':   /* Convert X0201 kana to X0208 or X0201 Conversion */
+           x0201_f = FALSE;    /* No X0201->X0208 conversion */
+           /* accept  X0201
+                   ESC-(-I     in JIS, EUC, MS Kanji
+                   SI/SO       in JIS, EUC, MS Kanji
+                   SSO         in EUC, JIS, not in MS Kanji
+                   MS Kanji (0xa0-0xdf) 
+              output  X0201
+                   ESC-(-I     in JIS (0x20-0x5f)
+                   SSO         in EUC (0xa0-0xdf)
+                   0xa0-0xd    in MS Kanji (0xa0-0xdf) 
+           */
+           continue;
+       case 'X':   /* Assume X0201 kana */
+           /* Default value is NO_X0201 for EUC/MS-Kanji mix */
+           x0201_f = TRUE;
+           continue;
+       case 'f':   /* folding -f60 or -f */
+           fold_f = TRUE;
+           fold_len = atoi(cp);
+           if(!(0<fold_len && fold_len<BUFSIZ)) 
+               fold_len = DEFAULT_FOLD;
+           while('0'<= *cp && *cp <='9') cp++;
+           continue;
+       case 'm':   /* MIME support */
+           mime_f = TRUE;
+           if(*cp=='B'||*cp=='Q') {
+               mime_mode = *cp++;
+               mimebuf_f = FIXED_MIME;
+           } else if (*cp=='0') {
+               mime_f = FALSE;
+           }
+           continue;
+       case 'M':   /* MIME output */
+           oconv = j_oconv;    /* sorry... not yet done.. */
+           continue;
+       case 'B':   /* Broken JIS support */
+           /*  bit:0   no ESC JIS
+               bit:1   allow any x on ESC-(-x or ESC-$-x
+               bit:2   reset to ascii on NL
+           */
+           if('9'>= *cp && *cp>='0') 
+               broken_f |= 1<<(*cp++ -'0');
+           else 
+               broken_f |= TRUE;
+           continue;
+#ifndef PERL_XS
+       case 'O':/* for Output file */
+           file_out = TRUE;
+           continue;
+#endif
+       case 'c':/* add cr code */
+           add_cr = TRUE;
+           continue;
+       case 'd':/* delete cr code */
+           del_cr = TRUE;
+           continue;
+       default:
+           /* bogus option but ignored */
+           continue;
+       }
+    }
+}
+#endif
+
+int
+noconvert(f)
+    SFILE  *f;
+{
+    int    c;
+
+    while ((c = sgetc(f)) != EOF)
+      sputchar(c);
+    return 1;
+}
+
+
+
+
+int
+kanji_convert(SFILE  *f)
 {
-    register int    c1,
-                   c2;
+    int    c1, c2;
 
     c2 = 0;
 
-    if (input_f == JIS_INPUT || input_f == LATIN1_INPUT) {
-       estab_f = TRUE; iconv = oconv;
-    } else if (input_f == SJIS_INPUT) {
-       estab_f = TRUE;  iconv = s_iconv;
+    if(input_f == JIS_INPUT || input_f == LATIN1_INPUT) {
+        estab_f = TRUE; iconv = oconv;
+    } else if(input_f == SJIS_INPUT) {
+        estab_f = TRUE;  iconv = s_iconv;
     } else {
-       estab_f = FALSE; iconv = oconv;
+        estab_f = FALSE; iconv = oconv;
     }
     input_mode = ASCII;
     output_mode = ASCII;
     shift_mode = FALSE;
-    mime_mode = FALSE;
 
-#define NEXT continue  /* no output, get next */
-#define SEND  ;                /* output c1 and c2, get next */
-#define LAST break     /* end of loop, go closing  */
-
-    while ((c1 = GETC (f)) != SEOF) {
-       if (!c2 && !input_mode && c1<DEL && !mime_mode && !output_mode
-               && !shift_mode && !fold_f && !rot_f) {
-           /* plain ASCII loop, no conversion and no fold  */
-           while(c1!='=' && c1!=SO && c1!=SEOF &&
-                   c1!=ESC && c1!='$' && c1<DEL) {
-               sputchar(c1);
-               c1 = sgetc(f);
-           }
-           if(c1==SEOF) LAST;
-       }
-       if (c2) {
-           /* second byte */
-           if (c2 > DEL) {
-               /* in case of 8th bit is on */
-               if (!estab_f) {
-                   /* in case of not established yet */
-                   if (c1 > SSP) {
-                       /* It is still ambiguious */
-                       h_conv (f, c2, c1);
-                       c2 = 0;
-                       NEXT;
-                   } else if (c1 < AT) {
-                       /* ignore bogus code */
-                       c2 = 0;
-                       NEXT;
-                   } else {
-                       /* established */
-                       /* it seems to be MS Kanji */
-                       estab_f = TRUE;
-                       iconv = s_iconv;
-                       SEND;
-                   }
-               } else
-                   /* in case of already established */
-                   if (c1 < AT) {
-                       /* ignore bogus code */
-                       c2 = 0;
-                       NEXT;
-                   } else
-                       SEND;
-           } else
-               /* 7 bit code */
-               /* it might be kanji shitfted */
-               if ((c1 == DEL) || (c1 <= SP)) {
-                   /* ignore bogus first code */
-                   c2 = 0;
-                   NEXT;
-               } else
-                   SEND;
-       } else {
-           /* first byte */
-           if (c1 > DEL) {
-               /* 8 bit code */
-               if (!estab_f && !iso8859_f) {
-                   /* not established yet */
-                   if (c1 < SSP) {
-                       /* it seems to be MS Kanji */
-                       estab_f = TRUE;
-                       iconv = s_iconv;
-                   } else if (c1 < 0xe0) {
-                       /* it seems to be EUC */
-                       estab_f = TRUE;
-                       iconv = oconv;
-                   } else {
-                       /* still ambiguious */
-                   }
-                   c2 = c1;
-                   NEXT;
-               } else { /* estab_f==TRUE */
-                   if(iso8859_f) {
-                       SEND;
-                   } else if(SSP<=c1 && c1<0xe0 && iconv == s_iconv) {
-                       /* SJIS X0201 Case... */
-                       /* This is too arrogant, but ... */
-                       if(x0201_f==NO_X0201) {
-                           iconv = oconv;
-                           c2 = c1;
-                           NEXT;
-                       } else
-                       if(x0201_f) {
-                           if(dv[(c1-SSP)*2]||ev[(c1-SSP)*2]) {
-                           /* look ahead for X0201/X0208conversion */
-                               if ((c2 = GETC (f)) == SEOF) {
-                                   (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
-                                   LAST;
-                               } else if (c2==(0xde)) { /* ÂùÅÀ */
-                                   (*oconv)(dv[(c1-SSP)*2],dv[(c1-SSP)*2+1]);
-                                   c2=0;
-                                   NEXT;
-                               } else if (c2==(0xdf)&&ev[(c1-SSP)*2]) {
-                                   /* È¾ÂùÅÀ */
-                                   (*oconv)(ev[(c1-SSP)*2],ev[(c1-SSP)*2+1]);
-                                   c2=0;
-                                   NEXT;
-                               }
-                               UNGETC(c2,f); c2 = 0;
-                           }
-                           (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
-                           NEXT;
-                       } else
-                           SEND;
-                   } else if(c1==SSO && iconv != s_iconv) {
-                       /* EUC X0201 Case */
-                       /* This is too arrogant
-                       if(x0201_f == NO_X0201) {
-                           estab_f = FALSE;
-                           c2 = 0;
-                           NEXT;
-                       } */
-                       c1 = GETC (f);  /* skip SSO */
-                       euc_1byte_check:
-                       if(x0201_f && SSP<=c1 && c1<0xe0) {
-                           if(dv[(c1-SSP)*2]||ev[(c1-SSP)*2]) {
-                               if ((c2 = GETC (f)) == SEOF) {
-                                   (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
-                                   LAST;
-                               }
-                               /* forward lookup ÂùÅÀ/ȾÂùÅÀ */
-                               if (c2 != SSO) {
-                                   UNGETC(c2,f); c2 = 0;
-                                   (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
-                                   NEXT;
-                               } else if ((c2 = GETC (f)) == SEOF) {
-                                   (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
-                                   (*oconv)(0,SSO);
-                                   LAST;
-                               } else if (c2==(0xde)) { /* ÂùÅÀ */
-                                   (*oconv)(dv[(c1-SSP)*2],dv[(c1-SSP)*2+1]);
-                                   c2=0;
-                                   NEXT;
-                               } else if (c2==(0xdf)&&ev[(c1-SSP)*2]) {
-                                   /* È¾ÂùÅÀ */
-                                   (*oconv)(ev[(c1-SSP)*2],ev[(c1-SSP)*2+1]);
-                                   c2=0;
-                                   NEXT;
-                               } else {
-                                   (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
-                                   /* we have to check this c2 */
-                                   /* and no way to push back SSO */
-                                   c1 = c2; c2 = 0;
-                                   goto euc_1byte_check;
-                               }
-                           }
-                           (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
-                           NEXT;
-                       } else
-                           SEND;
-                   } else if(c1 < SSP && iconv != s_iconv) {
-                       /* strange code in EUC */
-                       iconv = s_iconv;  /* try SJIS */
-                       c2 = c1;
-                       NEXT;
-                   } else {
-                      /* already established */
-                      c2 = c1;
-                      NEXT;
-                   }
-               }
-           } else if ((c1 > SP) && (c1 != DEL)) {
-               /* in case of Roman characters */
-               if (shift_mode) {
-                   c1 |= 0x80;
-                   /* output 1 shifted byte */
-                   if(x0201_f && (!iso8859_f||input_mode==X0201) &&
-                           SSP<=c1 && c1<0xe0 ) {
-                       if(dv[(c1-SSP)*2]||ev[(c1-SSP)*2]) {
-                           if ((c2 = GETC (f)) == SEOF) {
-                               (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
-                               LAST;
-                           } else if (c2==(0xde&0x7f)) { /* ÂùÅÀ */
-                               (*oconv)(dv[(c1-SSP)*2],dv[(c1-SSP)*2+1]);
-                               c2=0;
-                               NEXT;
-                           } else if (c2==(0xdf&0x7f)&&ev[(c1-SSP)*2]) {
-                               /* È¾ÂùÅÀ */
-                               (*oconv)(ev[(c1-SSP)*2],ev[(c1-SSP)*2+1]);
-                               c2=0;
-                               NEXT;
-                           }
-                           UNGETC(c2,f); c2 = 0;
-                       }
-                       (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
-                       NEXT;
-                   } else
-                       SEND;
-               } else if(c1 == '(' && broken_f && input_mode == X0208
-                       && !mime_mode ) {
-                   /* Try to recover missing escape */
-                   if ((c1 = GETC (f)) == SEOF) {
-                       (*oconv) (0, '(');
-                       LAST;
-                   } else {
-                       if (c1 == 'B' || c1 == 'J' || c1 == 'H') {
-                           input_mode = ASCII; shift_mode = FALSE;
-                           NEXT;
-                       } else {
-                           (*oconv) (0, '(');
-                           /* do not modify various input_mode */
-                           /* It can be vt100 sequence */
-                           SEND;
-                       }
-                   }
-               } else if (input_mode == X0208) {
-                   /* in case of Kanji shifted */
-                   c2 = c1;
-                   NEXT;
-                   /* goto next_byte */
-               } else if(mime_f && !mime_mode && c1 == '=') {
-                   if ((c1 = sgetc (f)) == SEOF) {
-                       (*oconv) (0, '=');
-                       LAST;
-                   } else if (c1 == '?') {
-                       /* =? is mime conversion start sequence */
-                       if(mime_begin(f) == SEOF) /* check in detail */
+#define NEXT continue      /* no output, get next */
+#define SEND ;             /* output c1 and c2, get next */
+#define LAST break         /* end of loop, go closing  */
+
+    while ((c1 = GETC(f)) != EOF) {
+        if(c2) {
+            /* second byte */
+            if(c2 > DEL) {
+                /* in case of 8th bit is on */
+                if(!estab_f) {
+                    /* in case of not established yet */
+                    if(c1 > SSP) {
+                        /* It is still ambiguious */
+                        h_conv(f, c2, c1);
+                        c2 = 0;
+                        NEXT;
+                    } else if(c1 < AT) {
+                        /* ignore bogus code */
+                        c2 = 0;
+                        NEXT;
+                    } else {
+                        /* established */
+                        /* it seems to be MS Kanji */
+                        estab_f = TRUE;
+                        iconv = s_iconv;
+                        SEND;
+                    }
+                } else
+                    /* in case of already established */
+                    if(c1 < AT) {
+                        /* ignore bogus code */
+                        c2 = 0;
+                        NEXT;
+                    } else
+                        SEND;
+            } else
+                /* 7 bit code */
+                /* it might be kanji shitfted */
+                if((c1 == DEL) || (c1 <= SPACE)) {
+                    /* ignore bogus first code */
+                    c2 = 0;
+                    NEXT;
+                } else
+                    SEND;
+        } else {
+            /* first byte */
+            if(c1 > DEL) {
+                /* 8 bit code */
+                if(!estab_f && !iso8859_f) {
+                    /* not established yet */
+                    if(c1 < SSP) {
+                        /* it seems to be MS Kanji */
+                        estab_f = TRUE;
+                        iconv = s_iconv;
+                    } else if(c1 < 0xe0) {
+                        /* it seems to be EUC */
+                        estab_f = TRUE;
+                        iconv = oconv;
+                    } else {
+                        /* still ambiguious */
+                    }
+                    c2 = c1;
+                    NEXT;
+                } else { /* estab_f==TRUE */
+                    if(iso8859_f) {
+                        SEND;
+                    } else if(SSP<=c1 && c1<0xe0 && iconv == s_iconv) {
+                        /* SJIS X0201 Case... */
+                        /* This is too arrogant, but ... */
+                        if(x0201_f==NO_X0201) {
+                            iconv = oconv;
+                            c2 = c1;
+                            NEXT;
+                        } else 
+                        if(x0201_f) {
+                            if(dv[(c1-SSP)*2]||ev[(c1-SSP)*2]) {
+                            /* look ahead for X0201/X0208conversion */
+                                if((c2 = GETC(f)) == EOF) {
+                                    (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
+                                    LAST;
+                                } else if(c2==(0xde)) { /* ÂùÅÀ */
+                                    (*oconv)(dv[(c1-SSP)*2],dv[(c1-SSP)*2+1]);
+                                    c2=0; 
+                                    NEXT;
+                                } else if(c2==(0xdf)&&ev[(c1-SSP)*2]) { 
+                                    /* È¾ÂùÅÀ */
+                                    (*oconv)(ev[(c1-SSP)*2],ev[(c1-SSP)*2+1]);
+                                    c2=0; 
+                                    NEXT;
+                                } 
+                                UNGETC(c2,f); c2 = 0;
+                            }
+                            (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
+                            NEXT;
+                        } else
+                            SEND;
+                    } else if(c1==SSO && iconv != s_iconv) {
+                        /* EUC X0201 Case */
+                        /* This is too arrogant
+                        if(x0201_f == NO_X0201) {
+                            estab_f = FALSE; 
+                            c2 = 0;  
+                            NEXT;
+                        } */
+                        c1 = GETC(f);  /* skip SSO */
+                        euc_1byte_check:
+                        if(x0201_f && SSP<=c1 && c1<0xe0) {
+                            if(dv[(c1-SSP)*2]||ev[(c1-SSP)*2]) {
+                                if((c2 = GETC(f)) == EOF) {
+                                    (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
+                                    LAST;
+                                }
+                                /* forward lookup ÂùÅÀ/ȾÂùÅÀ */
+                                if(c2 != SSO) {
+                                    UNGETC(c2,f); c2 = 0; 
+                                    (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
+                                    NEXT;
+                                } else if((c2 = GETC(f)) == EOF) {
+                                    (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
+                                    (*oconv)(0,SSO); 
+                                    LAST;
+                                } else if(c2==(0xde)) { /* ÂùÅÀ */
+                                    (*oconv)(dv[(c1-SSP)*2],dv[(c1-SSP)*2+1]);
+                                    c2=0; 
+                                    NEXT;
+                                } else if(c2==(0xdf)&&ev[(c1-SSP)*2]) { 
+                                    /* È¾ÂùÅÀ */
+                                    (*oconv)(ev[(c1-SSP)*2],ev[(c1-SSP)*2+1]);
+                                    c2=0; 
+                                    NEXT;
+                                } else {
+                                    (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
+                                    /* we have to check this c2 */
+                                    /* and no way to push back SSO */
+                                    c1 = c2; c2 = 0;
+                                    goto euc_1byte_check;
+                                }
+                            }
+                            (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
+                            NEXT;
+                        } else 
+                            SEND;
+                    } else if(c1 < SSP && iconv != s_iconv) {
+                        /* strange code in EUC */
+                        iconv = s_iconv;  /* try SJIS */
+                        c2 = c1;
+                        NEXT;
+                    } else {
+                       /* already established */
+                       c2 = c1;
+                       NEXT;
+                    }
+                }
+            } else if((c1 > SPACE) && (c1 != DEL)) {
+                /* in case of Roman characters */
+                if(shift_mode) { 
+                    c1 |= 0x80;
+                    /* output 1 shifted byte */
+                    if(x0201_f && (!iso8859_f||input_mode==X0201) && 
+                            SSP<=c1 && c1<0xe0 ) {
+                        if(dv[(c1-SSP)*2]||ev[(c1-SSP)*2]) {
+                            if((c2 = GETC(f)) == EOF) {
+                                (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
+                                LAST;
+                            } else if(c2==(0xde&0x7f)) { /* ÂùÅÀ */
+                                (*oconv)(dv[(c1-SSP)*2],dv[(c1-SSP)*2+1]);
+                                c2=0; 
+                                NEXT;
+                            } else if(c2==(0xdf&0x7f)&&ev[(c1-SSP)*2]) {  
+                                /* È¾ÂùÅÀ */
+                                (*oconv)(ev[(c1-SSP)*2],ev[(c1-SSP)*2+1]);
+                                c2=0; 
+                                NEXT;
+                            }
+                            UNGETC(c2,f); c2 = 0;
+                        }
+                        (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
+                        NEXT;
+                    } else
+                        SEND;
+                } else if(c1 == '(' && broken_f && input_mode == X0208
+                        && !mime_mode ) {
+                    /* Try to recover missing escape */
+                    if((c1 = GETC(f)) == EOF) {
+                        (*oconv)(0, '(');
+                        LAST;
+                    } else {
+                        if(c1 == 'B' || c1 == 'J' || c1 == 'H') {
+                            input_mode = ASCII; shift_mode = FALSE;
+                            NEXT;
+                        } else {
+                            (*oconv)(0, '(');
+                            /* do not modify various input_mode */
+                            /* It can be vt100 sequence */
+                            SEND;
+                        }
+                    }
+                } else if(input_mode == X0208) {
+                    /* in case of Kanji shifted */
+                    c2 = c1;
+                    NEXT;
+                    /* goto next_byte */
+                } else if(c1 == '=' && mime_f && !mime_mode ) {
+                    if((c1 = sgetc(f)) == EOF) {
+                        (*oconv)(0, '=');
+                        LAST;
+                    } else if(c1 == '?') {
+                        /* =? is mime conversion start sequence */
+                        if(mime_begin(f) == EOF) /* check in detail */
+                            LAST;
+                        else
+                            NEXT;
+                    } else {
+                        (*oconv)(0, '=');
+                        sungetc(c1,f);
+                        NEXT;
+                    }
+                } else if(c1 == '$' && broken_f && !mime_mode) {
+                    /* try to recover missing escape */
+                    if((c1 = GETC(f)) == EOF) {
+                        (*oconv)(0, '$');
+                        LAST;
+                    } else if(c1 == '@'|| c1 == 'B') {
+                        /* in case of Kanji in ESC sequence */
+                        input_mode = X0208;
+                        shift_mode = FALSE;
+                        NEXT;
+                    } else {
+                        /* sorry */
+                        (*oconv)(0, '$');
+                        (*oconv)(0, c1);
+                        NEXT;
+                    }
+                } else
+                    SEND;
+            } else if(c1 == SI) {
+                shift_mode = FALSE; 
+                NEXT;
+            } else if(c1 == SO) {
+                shift_mode = TRUE; 
+                NEXT;
+            } else if(c1 == ESC ) {
+                if((c1 = GETC(f)) == EOF) {
+                    (*oconv)(0, ESC);
+                    LAST;
+                } else if(c1 == '$') {
+                    if((c1 = GETC(f)) == EOF) {
+                        (*oconv)(0, ESC);
+                        (*oconv)(0, '$');
+                        LAST;
+                    } else if(c1 == '@'|| c1 == 'B') {
+                        /* This is kanji introduction */
+                        input_mode = X0208;
+                        shift_mode = FALSE;
+                        NEXT;
+                    } else if(c1 == '(') {
+                       if((c1 = GETC(f)) == EOF) {
+                           (*oconv)(0, ESC);
+                           (*oconv)(0, '$');
+                           (*oconv)(0, '(');
                            LAST;
-                       else
-                           NEXT;
-                   } else {
-                       (*oconv) (0, '=');
-                       sungetc(c1,f);
-                       NEXT;
-                   }
-               } else if(c1 == '$' && broken_f && !mime_mode) {
-                   /* try to recover missing escape */
-                   if ((c1 = GETC (f)) == SEOF) {
-                       (*oconv) (0, '$');
-                       LAST;
-                   } else if(c1 == '@'|| c1 == 'B') {
-                       /* in case of Kanji in ESC sequence */
-                       input_mode = X0208;
-                       shift_mode = FALSE;
-                       NEXT;
-                   } else {
-                       /* sorry */
-                       (*oconv) (0, '$');
-                       (*oconv) (0, c1);
-                       NEXT;
-                   }
-               } else
-                   SEND;
-           } else if (c1 == SI) {
-               shift_mode = FALSE;
-               NEXT;
-           } else if (c1 == SO) {
-               shift_mode = TRUE;
-               NEXT;
-           } else if (c1 == ESC ) {
-               if ((c1 = GETC (f)) == SEOF) {
-                   (*oconv) (0, ESC);
-                   LAST;
-               } else if (c1 == '$') {
-                   if ((c1 = GETC (f)) == SEOF) {
-                       (*oconv) (0, ESC);
-                       (*oconv) (0, '$');
-                       LAST;
-                   } else if(c1 == '@'|| c1 == 'B') {
-                       /* This is kanji introduction */
-                       input_mode = X0208;
-                       shift_mode = FALSE;
-                       NEXT;
-                   } else {
-                       (*oconv) (0, ESC);
-                       (*oconv) (0, '$');
-                       (*oconv) (0, c1);
-                       NEXT;
-                   }
-               } else if (c1 == '(') {
-                   if ((c1 = GETC (f)) == SEOF) {
-                       (*oconv) (0, ESC);
-                       (*oconv) (0, '(');
-                       LAST;
-                   } else {
-                       if (c1 == 'I') {
-                           /* This is X0201 kana introduction */
-                           input_mode = X0201; shift_mode = X0201;
-                           NEXT;
-                       } else if (c1 == 'B' || c1 == 'J' || c1 == 'H') {
-                           /* This is X0208 kanji introduction */
-                           input_mode = ASCII; shift_mode = FALSE;
+                       } else if(c1 == '@'|| c1 == 'B') {
+                           /* This is kanji introduction */
+                           input_mode = X0208;
+                           shift_mode = FALSE;
                            NEXT;
                        } else {
-                           (*oconv) (0, ESC);
-                           (*oconv) (0, '(');
-                           /* maintain various input_mode here */
-                           SEND;
+                           (*oconv)(0, ESC);
+                           (*oconv)(0, '$');
+                           (*oconv)(0, '(');
+                           (*oconv)(0, c1);
+                           NEXT;
                        }
-                   }
-               } else {
-                   /* lonely ESC  */
-                   (*oconv) (0, ESC);
-                   SEND;
-               }
-           } else
-               SEND;
-       }
-       /* send: */
-       if (input_mode == X0208)
-           (*oconv) (c2, c1);  /* this is JIS, not SJIS/EUC case */
-       else
-           (*iconv) (c2, c1);  /* can be EUC/SJIS */
-       c2 = 0;
-       continue;
-       /* goto next_word */
+                    } else if(broken_f&0x2) {
+                        input_mode = X0208;
+                        shift_mode = FALSE;
+                        NEXT;
+                    } else {
+                        (*oconv)(0, ESC);
+                        (*oconv)(0, '$');
+                        (*oconv)(0, c1);
+                        NEXT;
+                    }
+                } else if(c1 == '(') {
+                    if((c1 = GETC(f)) == EOF) {
+                        (*oconv)(0, ESC);
+                        (*oconv)(0, '(');
+                        LAST;
+                    } else {
+                        if(c1 == 'I') {
+                            /* This is X0201 kana introduction */
+                            input_mode = X0201; shift_mode = X0201;
+                            NEXT;
+                        } else if(c1 == 'B' || c1 == 'J' || c1 == 'H') {
+                            /* This is X0208 kanji introduction */
+                            input_mode = ASCII; shift_mode = FALSE;
+                            NEXT;
+                        } else if(broken_f&0x2) {
+                            input_mode = ASCII; shift_mode = FALSE;
+                            NEXT;
+                        } else {
+                            (*oconv)(0, ESC);
+                            (*oconv)(0, '(');
+                            /* maintain various input_mode here */
+                            SEND;
+                        }
+                    }
+                } else {
+                    /* lonely ESC  */
+                    (*oconv)(0, ESC);
+                    SEND;
+                }
+            } else if(c1 == NL && broken_f&4) {
+                input_mode = ASCII; 
+                SEND;
+            } else
+                SEND;
+        }
+        /* send: */
+        if(input_mode == X0208) 
+            (*oconv)(c2, c1);  /* this is JIS, not SJIS/EUC case */
+        else
+            (*iconv)(c2, c1);  /* can be EUC/SJIS */
+        c2 = 0;
+        continue;
+        /* goto next_word */
     }
 
     /* epilogue */
-    (*iconv) (SEOF, 0);
-
-#ifdef EUC_STRICT_CHECK
-    if(oconv == e_oconv)
-       fix_euc_code(sstdout->pointer, sstdout->tail - sstdout->head);
-#endif /* EUC_STRICT_CHECK */
+    (*iconv)(EOF, 0);
     return 1;
 }
 
-static int
-h_conv(SFILE *f, int c2, int c1)
+
+
+
+int
+h_conv(SFILE  *f, int c2, int c1)
 {
-    register int    wc;
+    int    wc;
 
 
-    /** it must NOT be in the kanji shifte sequence     */
-    /** it must NOT be written in JIS7                  */
-    /** and it must be after 2 byte 8bit code           */
+    /** it must NOT be in the kanji shifte sequence      */
+    /** it must NOT be written in JIS7                   */
+    /** and it must be after 2 byte 8bit code            */
 
     hold_count = 0;
-    push_hold_buf (c2, c1);
+    push_hold_buf(c2, c1);
     c2 = 0;
 
-    while ((c1 = GETC (f)) != SEOF) {
-       if (c2) {
-           /* second byte */
-           if (!estab_f) {
-               /* not established */
-               if (c1 > SSP) {
-                   /* it is still ambiguious yet */
-                   SEND;
-               } else if (c1 < AT) {
-                   /* ignore bogus first byte */
-                   c2 = 0;
-                   SEND;
-               } else {
-                   /* now established */
-                   /* it seems to be MS Kanji */
-                   estab_f = TRUE;
-                   iconv = s_iconv;
-                   SEND;
-               }
-           } else
-               SEND;
-       } else {
-           /* First byte */
-           if (c1 > DEL) {
-               /* 8th bit is on */
-               if (c1 < SSP) {
-                   /* it seems to be MS Kanji */
-                   estab_f = TRUE;
-                   iconv = s_iconv;
-               } else if (c1 < 0xe0) {
-                   /* it seems to be EUC */
-                   estab_f = TRUE;
-                   iconv = oconv;
-               } else {
-                   /* still ambiguious */
-               }
-               c2 = c1;
-               NEXT;
-           } else
-           /* 7 bit code , then send without any process */
-               SEND;
-       }
-       /* send: */
-       if ((push_hold_buf (c2, c1) == SEOF) || estab_f)
-           break;
-       c2 = 0;
-       continue;
+    while ((c1 = GETC(f)) != EOF) {
+        if(c2) {
+            /* second byte */
+            if(!estab_f) {
+                /* not established */
+                if(c1 > SSP) {
+                    /* it is still ambiguious yet */
+                    SEND;
+                } else if(c1 < AT) {
+                    /* ignore bogus first byte */
+                    c2 = 0;
+                    SEND;
+                } else {
+                    /* now established */
+                    /* it seems to be MS Kanji */
+                    estab_f = TRUE;
+                    iconv = s_iconv;
+                    SEND;
+                }
+            } else
+                SEND;
+        } else {
+            /* First byte */
+            if(c1 > DEL) {
+                /* 8th bit is on */
+                if(c1 < SSP) {
+                    /* it seems to be MS Kanji */
+                    estab_f = TRUE;
+                    iconv = s_iconv;
+                } else if(c1 < 0xe0) {
+                    /* it seems to be EUC */
+                    estab_f = TRUE;
+                    iconv = oconv;
+                } else {
+                    /* still ambiguious */
+                }
+                c2 = c1;
+                NEXT;
+            } else
+            /* 7 bit code , then send without any process */
+                SEND;
+        }
+        /* send: */
+        if((push_hold_buf(c2, c1) == EOF) || estab_f)
+            break;
+        c2 = 0;
+        continue;
     }
 
     /** now,
@@ -1141,192 +1538,256 @@ h_conv(SFILE *f, int c2, int c1)
      **/
 
     for (wc = 0; wc < hold_count; wc += 2) {
-       c2 = hold_buf[wc];
-       c1 = hold_buf[wc+1];
-       (*iconv) (c2, c1);
+        c2 = hold_buf[wc];
+        c1 = hold_buf[wc+1];
+        (*iconv)(c2, c1);
     }
-    return VOIDVOID ;
+    return VOIDVOID;
 }
 
-static int
+
+
+int
 push_hold_buf(int c2, int c1)
 {
-    if (hold_count >= HOLD_SIZE*2)
-       return (SEOF);
+    if(hold_count >= HOLD_SIZE*2)
+        return (EOF);
     hold_buf[hold_count++] = c2;
     hold_buf[hold_count++] = c1;
-    return ((hold_count >= HOLD_SIZE*2) ? SEOF : hold_count);
+    return ((hold_count >= HOLD_SIZE*2) ? EOF : hold_count);
 }
 
 
-static int
+int
 s_iconv(int c2, int c1)
 {
-    if ((c2 == SEOF) || (c2 == 0)) {
-       /* NOP */
+    if((c2 == EOF) || (c2 == 0)) {
+        /* NOP */
     } else {
-       c2 = c2 + c2 - ((c2 <= 0x9f) ? SJ0162 : SJ6394);
-       if (c1 < 0x9f)
-           c1 = c1 - ((c1 > DEL) ? SP : 0x1f);
-       else {
-           c1 = c1 - 0x7e;
-           c2++;
-       }
+        c2 = c2 + c2 - ((c2 <= 0x9f) ? SJ0162 : SJ6394);
+        if(c1 < 0x9f)
+            c1 = c1 - ((c1 > DEL) ? SPACE : 0x1f);
+        else {
+            c1 = c1 - 0x7e;
+            c2++;
+        }
     }
-    (*oconv) (c2, c1);
+    (*oconv)(c2, c1);
     return 1;
 }
 
-static int
+
 e_oconv(int c2, int c1)
 {
     c2 = pre_convert(c1,c2); c1 = c1_return;
     if(fold_f) {
-       switch(fold(c2,c1)) {
-           case '\n': sputchar('\n');
-               break;
-           case 0:    return VOIDVOID;
-           case '\r':
-               c1 = '\n'; c2 = 0;
-               break;
-           case '\t':
-           case ' ':
-               c1 = ' '; c2 = 0;
-               break;
-       }
+        switch(line_fold(c2,c1)) {
+            case '\n': 
+                if(add_cr == TRUE) {
+                    sputchar('\r');
+                    c1 = '\n';
+                }
+                sputchar('\n');
+                break;
+            case 0:    return VOIDVOID;
+            case '\r': 
+                c1 = '\n'; c2 = 0;
+                break;
+            case '\t': 
+            case ' ': 
+                c1 = ' '; c2 = 0;
+                break;
+        }
+    }
+    if(c2==DOUBLE_SPACE) {
+        sputchar(' '); sputchar(' ');
+        return VOIDVOID;
     }
-    if (c2 == SEOF)
-       return VOIDVOID;
-    else if (c2 == 0 && (c1&0x80)) {
-       sputchar(SSO); sputchar(c1);
-    } else if (c2 == 0) {
-       sputchar(c1);
+    if(c2 == EOF)
+        return VOIDVOID;
+    else if(c2 == 0 && (c1&0x80)) {
+        sputchar(SSO); sputchar(c1);
+    } else if(c2 == 0) {
+        if(c1 == '\n' && add_cr == TRUE) 
+            sputchar('\r');
+        if(c1 != '\r') 
+            sputchar(c1);
+        else if(del_cr == FALSE) 
+            sputchar(c1);
     } else {
-       if((c1<0x20 || 0x7e<c1) ||
-          (c2<0x20 || 0x7e<c2)) {
-           estab_f = FALSE;
-           return VOIDVOID; /* too late to rescue this char */
-       }
-       sputchar(c2 | 0x080);
-       sputchar(c1 | 0x080);
+        if((c1<0x20 || 0x7e<c1) ||
+           (c2<0x20 || 0x7e<c2)) {
+            estab_f = FALSE;
+            return VOIDVOID; /* too late to rescue this char */
+        }
+        sputchar(c2 | 0x080);
+        sputchar(c1 | 0x080);
     }
     return VOIDVOID;
 }
 
-static int
+
+
+int
 s_oconv(int c2, int c1)
 {
     c2 = pre_convert(c1,c2); c1 = c1_return;
     if(fold_f) {
-       switch(fold(c2,c1)) {
-           case '\n': sputchar('\n');
-               break;
-           case '\r':
-               c1 = '\n'; c2 = 0;
-               break;
-           case 0:    return VOIDVOID;
-           case '\t':
-           case ' ':
-               c1 = ' '; c2 = 0;
-               break;
-       }
+        switch(line_fold(c2,c1)) {
+            case '\n': 
+                if(add_cr == TRUE) {
+                   sputchar('\r');
+                   c1 = '\n';
+                }
+                sputchar('\n');
+                break;
+            case '\r': 
+                c1 = '\n'; c2 = 0;
+                break;
+            case 0:    return VOIDVOID;
+            case '\t': 
+            case ' ': 
+                c1 = ' '; c2 = 0;
+                break;
+        }
     }
-    if (c2 == SEOF)
-       return VOIDVOID;
-    else if (c2 == 0) {
-       sputchar(c1);
+    if(c2==DOUBLE_SPACE) {
+        sputchar(' '); sputchar(' ');
+        return VOIDVOID;
+    }
+    if(c2 == EOF)
+        return VOIDVOID;
+    else if(c2 == 0) {
+        if(c1 == '\n' && add_cr == TRUE) 
+            sputchar('\r');
+        if(c1 != '\r') 
+            sputchar(c1);
+        else if(del_cr == FALSE) 
+            sputchar(c1);
     } else {
-       if((c1<0x20 || 0x7e<c1) ||
-          (c2<0x20 || 0x7e<c2)) {
-           estab_f = FALSE;
-           return VOIDVOID; /* too late to rescue this char */
-       }
-       sputchar((((c2 - 1) >> 1) + ((c2 <= 0x5e) ? 0x71 : 0xb1)));
-       sputchar((c1 + ((c2 & 1) ? ((c1 < 0x60) ? 0x1f : 0x20) : 0x7e)));
+        if((c1<0x20 || 0x7e<c1) ||
+           (c2<0x20 || 0x7e<c2)) {
+            estab_f = FALSE;
+            return VOIDVOID; /* too late to rescue this char */
+        }
+        sputchar((((c2 - 1) >> 1) + ((c2 <= 0x5e) ? 0x71 : 0xb1)));
+        sputchar((c1 + ((c2 & 1) ? ((c1 < 0x60) ? 0x1f : 0x20) : 0x7e)));
     }
     return VOIDVOID;
 }
 
-static int
+int
 j_oconv(int c2, int c1)
 {
     c2 = pre_convert(c1,c2); c1 = c1_return;
     if(fold_f) {
-       switch(fold(c2,c1)) {
-           case '\n':
-               if (output_mode) {
-                   sputchar(ESC);
-                   sputchar('(');
-                   sputchar(ascii_intro);
-               }
-               sputchar('\n');
-               output_mode = ASCII;
-               break;
-           case '\r':
-               c1 = '\n'; c2 = 0;
-               break;
-           case '\t':
-           case ' ':
-               c1 = ' '; c2 = 0;
-               break;
-           case 0:    return VOIDVOID;
-       }
+        switch(line_fold(c2,c1)) {
+            case '\n': 
+                if(output_mode) {
+                    sputchar(ESC);
+                    sputchar('(');
+                    sputchar(ascii_intro);
+                }
+                if(add_cr == TRUE) {
+                    sputchar('\r');
+                    c1 = '\n';
+                }
+                sputchar('\n');
+                output_mode = ASCII;
+                break;
+            case '\r': 
+                c1 = '\n'; c2 = 0;
+                break;
+            case '\t': 
+            case ' ': 
+                c1 = ' '; c2 = 0;
+                break;
+            case 0:    return VOIDVOID;
+        }
      }
-    if (c2 == SEOF) {
-       if (output_mode) {
-           sputchar(ESC);
-           sputchar('(');
-           sputchar(ascii_intro);
-       }
-    } else if (c2 == 0 && (c1 & 0x80)) {
-       if(input_mode==X0201 || !iso8859_f) {
-           if(output_mode!=X0201) {
-               sputchar(ESC);
-               sputchar('(');
-               sputchar('I');
-               output_mode = X0201;
-           }
-           c1 &= 0x7f;
-       } else {
-           /* iso8859 introduction, or 8th bit on */
-           /* Can we convert in 7bit form using ESC-'-'-A ?
-              Is this popular? */
-       }
-       sputchar(c1);
-    } else if (c2 == 0) {
-       if (output_mode) {
-           sputchar(ESC);
-           sputchar('(');
-           sputchar(ascii_intro);
-           output_mode = ASCII;
-       }
-       sputchar(c1);
+    if(c2 == EOF) {
+        if(output_mode) {
+            sputchar(ESC);
+            sputchar('(');
+            sputchar(ascii_intro);
+        }
+    } else if(c2 == 0 && (c1 & 0x80)) {
+        if(input_mode==X0201 || !iso8859_f) {
+            if(output_mode!=X0201) {
+                sputchar(ESC);
+                sputchar('(');
+                sputchar('I');
+                output_mode = X0201;
+            }
+            c1 &= 0x7f;
+        } else {
+            /* iso8859 introduction, or 8th bit on */
+            /* Can we convert in 7bit form using ESC-'-'-A ? 
+               Is this popular? */
+        }
+        sputchar(c1);
+    } else if(c2 == 0) {
+        if(output_mode) {
+            sputchar(ESC);
+            sputchar('(');
+            sputchar(ascii_intro);
+            output_mode = ASCII;
+        }
+        if(c1 == '\n' && add_cr == TRUE) 
+            sputchar('\r');
+        if(c1 != '\r') 
+            sputchar(c1);
+        else if(del_cr == FALSE) 
+            sputchar(c1);
+    } else if(c2 == DOUBLE_SPACE) {
+        if(output_mode) {
+            sputchar(ESC);
+            sputchar('(');
+            sputchar(ascii_intro);
+            output_mode = ASCII;
+        }
+        sputchar(' ');
+        if(c1 == '\n' && add_cr == TRUE) 
+            sputchar('\r');
+        if(c1 != '\r') 
+            sputchar(c1);
+        else if(del_cr == FALSE) 
+            sputchar(c1);
     } else {
-       if (output_mode != X0208) {
-           sputchar(ESC);
-           sputchar('$');
-           sputchar(kanji_intro);
-           output_mode = X0208;
-       }
-       if(c1<0x20 || 0x7e<c1) return VOIDVOID;
-       if(c2<0x20 || 0x7e<c2) return VOIDVOID;
-       sputchar(c2);
-       sputchar(c1);
+        if(output_mode != X0208) {
+            sputchar(ESC);
+            sputchar('$');
+            sputchar(kanji_intro);
+            output_mode = X0208;
+        }
+        if(c1<0x20 || 0x7e<c1) 
+            return VOIDVOID;
+        if(c2<0x20 || 0x7e<c2) 
+            return VOIDVOID;
+        sputchar(c2);
+        if(c1 == '\n' && add_cr == TRUE) 
+            sputchar('\r');
+        if(c1 != '\r') 
+            sputchar(c1);
+        else if(del_cr == FALSE) 
+            sputchar(c1);
     }
     return VOIDVOID;
 }
 
+
+
 #define rot13(c)  ( \
       ( c < 'A' ) ? c: \
       (c <= 'M')  ? (c + 13): \
       (c <= 'Z')  ? (c - 13): \
-      (c < 'a')          ? (c): \
+      (c < 'a')   ? (c): \
       (c <= 'm')  ? (c + 13): \
       (c <= 'z')  ? (c - 13): \
       (c) \
 )
 
-#define         rot47(c) ( \
+#define  rot47(c) ( \
       ( c < '!' ) ? c: \
       ( c <= 'O' ) ? (c + 47) : \
       ( c <= '~' ) ?  (c - 47) : \
@@ -1334,288 +1795,404 @@ j_oconv(int c2, int c1)
 )
 
 
-/*
-  Return value of fold()
+/* 
+  Return value of line_fold()
 
-       \n  add newline and output char
-       \r  add newline and output nothing
+       \n  add newline  and output char
+       \r  add newline  and output nothing
        ' ' space
-       0   skip
-       1   (or else) normal output
+       0   skip  
+       1   (or else) normal output 
 
   fold state in prev (previous character)
 
       >0x80 Japanese (X0208/X0201)
       <0x80 ASCII
-      \n    new line
+      \n    new line 
       ' '   space
 
-  This fold algorthm does not conserve heading space in a line.
+  This fold algorthm does not preserve heading space in a line.
   This is the main difference from fmt.
 */
 
-static int
-fold(int c2, int c1)
-{
+int
+line_fold(int c2, int c1) 
+{ 
     int prev0;
-    if(c1=='\r')
-       return 0;               /* ignore cr */
+    if(c1=='\r') 
+        return 0;               /* ignore cr */
     if(c1== 8) {
-       if(line>0) line--;
-       return 1;
+        if(line>0) line--;
+        return 1;
     }
-    if(c2==SEOF && line != 0)   /* close open last line */
-       return '\n';
+    if(c2==EOF && line != 0)    /* close open last line */
+        return '\n';
     /* new line */
     if(c1=='\n') {
-       if(prev == c1) {        /* duplicate newline */
-           if(line) {
-               line = 0;
-               return '\n';    /* output two newline */
-           } else {
-               line = 0;
-               return 1;
-           }
-       } else  {
-           if(prev&0x80) {     /* Japanese? */
-               prev = c1;
-               return 0;       /* ignore given single newline */
-           } else if(prev==' ') {
-               return 0;
-           } else {
-               prev = c1;
-               if(++line<=fold_len)
-                   return ' ';
-               else {
-                   line = 0;
-                   return '\r';        /* fold and output nothing */
-               }
-           }
-       }
+        if(prev == c1) {        /* duplicate newline */
+            if(line) {
+                line = 0;
+                return '\n';    /* output two newline */
+            } else {
+                line = 0;
+                return 1;
+            }
+        } else  {
+            if(prev&0x80) {     /* Japanese? */
+                prev = c1;
+                return 0;       /* ignore given single newline */
+            } else if(prev==' ') {
+                return 0;
+            } else {
+                prev = c1;
+                if(++line<=fold_len) 
+                    return ' ';
+                else {
+                    line = 0;
+                    return '\r';        /* fold and output nothing */
+                }
+            }
+        }
     }
     if(c1=='\f') {
-       prev = '\n';
-       if(line==0)
-           return 1;
-       line = 0;
-       return '\n';            /* output newline and clear */
+        prev = '\n';
+        if(line==0)
+            return 1;
+        line = 0;
+        return '\n';            /* output newline and clear */
     }
     /* X0208 kankaku or ascii space */
-    if((c2==0&&c1==' ')||
-       (c2==0&&c1=='\t')||
-       (c2=='!'&& c1=='!')) {
-       if(prev == ' ') {
-           return 0;           /* remove duplicate spaces */
-       }
-       prev = ' ';
-       if(++line<=fold_len)
-           return ' ';         /* output ASCII space only */
-       else {
-           prev = ' '; line = 0;
-           return '\r';        /* fold and output nothing */
-       }
-    }
+    if( (c2==0&&c1==' ')||
+        (c2==0&&c1=='\t')||
+        (c2==DOUBLE_SPACE)||
+        (c2=='!'&& c1=='!')) {
+        if(prev == ' ') {
+            return 0;           /* remove duplicate spaces */
+        } 
+        prev = ' ';    
+        if(++line<=fold_len) 
+            return ' ';         /* output ASCII space only */
+        else {
+            prev = ' '; line = 0;
+            return '\r';        /* fold and output nothing */
+        }
+    } 
     prev0 = prev; /* we still need this one... , but almost done */
     prev = c1;
-    if (c2 || (SSP<=c1 && c1<=0xdf))
-       prev |= 0x80;  /* this is Japanese */
+    if(c2 || (SSP<=c1 && c1<=0xdf)) 
+        prev |= 0x80;  /* this is Japanese */
     line += (c2==0)?1:2;
     if(line<=fold_len) {   /* normal case */
-       return 1;
+        return 1;
     }
     if(line>=fold_len+FOLD_MARGIN) { /* too many kinsou suspension */
-       line = (c2==0)?1:2;
-       return '\n';       /* We can't wait, do fold now */
+        line = (c2==0)?1:2;
+        return '\n';       /* We can't wait, do fold now */
     }
-    /* simple kinsoku rules  return 1 means no folding */
+    /* simple kinsoku rules  return 1 means no folding  */
     if(c2==0) {
-       if(c1==0xde) return 1; /* ¡«*/
-       if(c1==0xdf) return 1; /* ¡¬*/
-       if(c1==0xa4) return 1; /* ¡£*/
-       if(c1==0xa3) return 1; /* ¡¤*/
-       if(c1==0xa1) return 1; /* ¡×*/
-       if(c1==0xb0) return 1; /* - */
-       if(SSP<=c1 && c1<=0xdf) {               /* X0201 */
-           line = 1;
-           return '\n';/* add one new line before this character */
-       }
-       /* fold point in ASCII { [ ( */
-       if(( c1!=')'&&
-            c1!=']'&&
-            c1!='}'&&
-            c1!='.'&&
-            c1!=','&&
-            c1!='!'&&
-            c1!='?'&&
-            c1!='/'&&
-            c1!=':'&&
-            c1!=';')&&
-           ((prev0=='\n')|| (prev0==' ')||     /* ignored new line */
-           (prev0&0x80))                       /* X0208 - ASCII */
-           ) {
-           line = 1;
-           return '\n';/* add one new line before this character */
-       }
-       return 1;  /* default no fold in ASCII */
+        if(c1==0xde) return 1; /* ¡«*/
+        if(c1==0xdf) return 1; /* ¡¬*/
+        if(c1==0xa4) return 1; /* ¡£*/
+        if(c1==0xa3) return 1; /* ¡¤*/
+        if(c1==0xa1) return 1; /* ¡×*/
+        if(c1==0xb0) return 1; /* - */
+        if(SSP<=c1 && c1<=0xdf) {               /* X0201 */
+            line = 1;
+            return '\n';/* add one new line before this character */
+        }
+        /* fold point in ASCII { [ ( */
+        if(( c1!=')'&&
+             c1!=']'&&
+             c1!='}'&&
+             c1!='.'&&
+             c1!=','&&
+             c1!='!'&&
+             c1!='?'&&
+             c1!='/'&&
+             c1!=':'&&
+             c1!=';')&&
+            ((prev0=='\n')|| (prev0==' ')||     /* ignored new line */
+            (prev0&0x80))                       /* X0208 - ASCII */
+            ) {
+            line = 1;
+            return '\n';/* add one new line before this character */
+        }
+        return 1;  /* default no fold in ASCII */
     } else {
-       if(c2=='!') {
-           if(c1=='"')  return 1; /* ¡¢ */
-           if(c1=='#')  return 1; /* ¡£ */
-           if(c1=='$')  return 1; /* ¡¤ */
-           if(c1=='%')  return 1; /* ¡¥ */
-           if(c1=='\'') return 1; /* ¡Ü */
-           if(c1=='(')  return 1; /* ¡¨ */
-           if(c1==')')  return 1; /* ¡© */
-           if(c1=='*')  return 1; /* ¡ª */
-           if(c1=='+')  return 1; /* ¡« */
-           if(c1==',')  return 1; /* ¡¬ */
-       }
-       line = 2;
-       return '\n'; /* add one new line before this character */
+        if(c2=='!') {
+            if(c1=='"')  return 1; /* ¡¢ */
+            if(c1=='#')  return 1; /* ¡£ */
+            if(c1=='$')  return 1; /* ¡¤ */
+            if(c1=='%')  return 1; /* ¡¥ */
+            if(c1=='\'') return 1; /* ¡Ü */
+            if(c1=='(')  return 1; /* ¡¨ */
+            if(c1==')')  return 1; /* ¡© */
+            if(c1=='*')  return 1; /* ¡ª */
+            if(c1=='+')  return 1; /* ¡« */
+            if(c1==',')  return 1; /* ¡¬ */
+        }
+        line = 2;
+        return '\n'; /* add one new line before this character */
     }
 }
 
-static int
+int
 pre_convert(int c1, int c2)
 {
-       if(c2) c1 &= 0x7f;
-       c1_return = c1;
-       if(c2==SEOF) return c2;
-       c2 &= 0x7f;
-       if(rot_f) {
-           if(c2) {
-               c1 = rot47(c1);
-               c2 = rot47(c2);
-           } else {
-               if (!(c1 & 0x80))
-                   c1 = rot13(c1);
-           }
-           c1_return = c1;
-       }
-       /* JISX0208 Alphabet */
-       if (alpha_f && c2 == 0x23 ) return 0;
-       /* JISX0208 Kigou */
-       if (alpha_f && c2 == 0x21 ) {
-          if(0x20<c1 && c1<0x7f && fv[c1-0x20]) {
-              c1_return = fv[c1-0x20];
-              return 0;
-          }
-       }
-       return c2;
+        if(c2) c1 &= 0x7f;
+        c1_return = c1;
+        if(c2==EOF) return c2;
+        c2 &= 0x7f;
+        if(rot_f) {
+            if(c2) {
+                c1 = rot47(c1);
+                c2 = rot47(c2);
+            } else {
+                if(!(c1 & 0x80)) 
+                    c1 = rot13(c1);
+            }
+            c1_return = c1;
+        }
+        /* JISX0208 Alphabet */
+        if(alpha_f && c2 == 0x23 ) return 0; 
+        /* JISX0208 Kigou */
+        if(alpha_f && c2 == 0x21 ) { 
+           if(0x21==c1) {
+               if(alpha_f&0x2) {
+                   c1_return = ' ';
+                   return 0;
+               } else if(alpha_f&0x4) {
+                   c1_return = ' ';
+                   return DOUBLE_SPACE;
+               } else {
+                   return c2;
+               }
+           } else if(0x20<c1 && c1<0x7f && fv[c1-0x20]) {
+               c1_return = fv[c1-0x20];
+               return 0;
+           } 
+        }
+        return c2;
 }
 
 
+#ifdef STRICT_MIME
+/* This converts  =?ISO-2022-JP?B?HOGE HOGE?= */
 
-/* This ONLY converts  =?ISO-2022-JP?B?HOGEHOGE?= to adequate form */
-/* Quickly programmed by I.Ichikawa (( )) 1994, Dec. */
-/* You may freely use this, unless you pretend you build this */
-
-static unsigned char *mime_pattern[] = {
-   (unsigned char *)"=?ISO-8859-1?Q?",
-   (unsigned char *)"=?ISO-2022-JP?B?",
+unsigned char *mime_pattern[] = {
+   (unsigned char *)"\075?ISO-8859-1?Q?",
+   (unsigned char *)"\075?ISO-2022-JP?B?",
+   (unsigned char *)"\075?ISO-2022-JP?Q?",
+   (unsigned char *)"\075?JAPANESE_EUC?B?",
+   (unsigned char *)"\075?SHIFT_JIS?B?",
    NULL
 };
 
-static int mime_encode[] = {
-    'Q',
-    'B',
+int      mime_encode[] = {
+    'Q', 'B', 'Q',
     0
 };
+#endif
 
-static int iso8859_f_save;
+#define MAXRECOVER 20
+int iso8859_f_save;
 
-static int
+#ifdef STRICT_MIME
+
+#define nkf_toupper(c)  (('a'<=c && c<='z')?(c-('a'-'A')):c)
+/* I don't trust portablity of toupper */
+
+int
 mime_begin(SFILE *f)
 {
-    int c1=0;
+    int c1;
     int i,j,k;
     unsigned char *p,*q;
+    int r[MAXRECOVER];    /* recovery buffer, max mime pattern lenght */
 
     mime_mode = FALSE;
     /* =? has been checked */
     j = 0;
     p = mime_pattern[j];
+    r[0]='='; r[1]='?';
+
+    for(i=2;p[i]>' ';i++) {                   /* start at =? */
+        if( ((r[i] = c1 = sgetc(f))==EOF) || nkf_toupper(c1) != p[i] ) {
+            /* pattern fails, try next one */
+            q = p;
+            while (p = mime_pattern[++j]) {
+                for(k=2;k<i;k++)              /* assume length(p) > i */
+                    if(p[k]!=q[k]) break;
+                if(k==i && nkf_toupper(c1)==p[k]) break;
+            }
+            if(p) continue;  /* found next one, continue */
+            /* all fails, output from recovery buffer */
+            sungetc(c1,f);
+            for(j=0;j<i;j++) {
+                (*oconv)(0,r[j]);
+            }
+            return c1;
+        }
+    }
+    mime_mode = mime_encode[j];
+    iso8859_f_save = iso8859_f;
+    if(j==0) {
+        iso8859_f = TRUE;
+    }
+    if(mime_mode=='B') {
+        mimebuf_f = unbuf_f;
+        if(!unbuf_f) {
+            /* do MIME integrity check */
+            return mime_integrity(f,mime_pattern[j]);
+        } 
+    }
+    mimebuf_f = TRUE;
+    return c1;
+}
 
-    for(i=2;p[i]>' ';i++) {
-       if( ((c1 = sgetc(f))==SEOF) || c1 != p[i] ) {
-           q = p;
-/*         while (p = mime_pattern[++j]) { */
-           while ((p = mime_pattern[++j])!=NULL) {
-               for(k=2;k<i;k++) /* assume length(p) > i */
-                   if(p[k]!=q[k]) break; if(k==i && c1==p[k]) break; }
-                   if(p) continue; sungetc(c1,f); for(j=0;j<i;j++) {
-                   (*oconv)(0,q[j]); } return c1; } } iso8859_f_save
-                   = iso8859_f; if(j==0) { iso8859_f = TRUE; }
-                   mime_mode = mime_encode[j]; return c1; }
+#define mime_getc0(f)   (mimebuf_f?sgetc(f):Fifo(mime_input++))
+#define mime_ungetc0(c,f) (mimebuf_f?sungetc(c,f):mime_input--)
 
-static int
+#else
+int
+mime_begin(SFILE *f)
+{
+    int c1;
+    int i,j;
+    int r[MAXRECOVER];    /* recovery buffer, max mime pattern lenght */
+
+    mime_mode = FALSE;
+    /* =? has been checked */
+    j = 0;
+    r[0]='='; r[1]='?';
+    for(i=2;i<MAXRECOVER;i++) {                   /* start at =? */
+       /* We accept any charcter type even if it is breaked by new lines */
+        if( (r[i] = c1 = sgetc(f))==EOF) break;
+       if(c1=='=') break;
+       if(c1<' '&& c1!='\r' && c1!='\n') break;
+       if(c1=='?') {
+           i++;
+           if(!(i<MAXRECOVER) || (r[i] = c1 = sgetc(f))==EOF) break;
+           if(c1=='b'||c1=='B') {
+               mime_mode = 'B';
+           } else if(c1=='q'||c1=='Q') {
+               mime_mode = 'Q';
+           } else {
+               break;
+           }
+           i++;
+           if(!(i<MAXRECOVER) || (r[i] = c1 = sgetc(f))==EOF) break;
+           if(c1=='?') {
+               break;
+           } else {
+               mime_mode = FALSE;
+           }
+           break;
+       }
+    }
+    if(!mime_mode || c1==EOF || i==MAXRECOVER) {
+       sungetc(c1,f);
+       for(j=0;j<i;j++) {
+           (*oconv)(0,r[j]);
+       }
+       return c1;
+    }
+    iso8859_f_save = iso8859_f;
+    /* do no MIME integrity check */
+    return c1;   /* used only for checking EOF */
+}
+
+#define mime_getc0(f)   sgetc(f)
+#define mime_ungetc0(c,f) sungetc(c,f)
+
+#endif
+
+int 
 mime_getc(SFILE *f)
 {
     int c1, c2, c3, c4, cc;
-    int t1, t2, t3, t4, mode;
+    int t1, t2, t3, t4, mode, exit_mode;
 
-    if(mime_top != mime_last) {         /* Something is in FIFO */
-       return  Fifo(mime_top++);
+    if(mime_top != mime_last) {  /* Something is in FIFO */
+        return  Fifo(mime_top++);
     }
 
+    if(mimebuf_f == FIXED_MIME)
+        exit_mode = mime_mode;
+    else
+        exit_mode = FALSE;
     if(mime_mode == 'Q') {
-       if ((c1 = sgetc(f)) == SEOF) return (SEOF);
-       if(c1!='=' && c1!='?') return c1;
-       if ((c2 = sgetc(f)) == SEOF) return (SEOF);
-       if(c1=='?'&&c2=='=') {
-           /* end Q encoding */
-           iso8859_f = iso8859_f_save;
-           mime_mode = 0; return sgetc(f);
-       }
-       if ((c3 = sgetc(f)) == SEOF) return (SEOF);
-#define hex(c)  (('0'<=c&&c<='9')?(c-'0'):\
+        if((c1 = mime_getc0(f)) == EOF) return (EOF);
+        if(c1=='_') return ' ';
+        if(c1!='=' && c1!='?') 
+            return c1;
+        mime_mode = exit_mode; /* prepare for quit */
+        if(c1<=' ') return c1;
+        if((c2 = mime_getc0(f)) == EOF) return (EOF);
+        if(c2<=' ') return c2;
+        if(c1=='?'&&c2=='=') {
+            /* end Q encoding */
+            input_mode = exit_mode;
+            iso8859_f = iso8859_f_save;
+            return sgetc(f);
+        }
+        if(c1=='?') {
+            mime_mode = 'Q'; /* still in MIME */
+            mime_ungetc0(c2,f);
+            return c1;
+        }
+        if((c3 = mime_getc0(f)) == EOF) return (EOF);
+        if(c2<=' ') return c2;
+        mime_mode = 'Q'; /* still in MIME */
+#define hex(c)   (('0'<=c&&c<='9')?(c-'0'):\
      ('A'<=c&&c<='F')?(c-'A'+10):('a'<=c&&c<='f')?(c-'a'+10):0)
-       return ((hex(c2)<<4) + hex(c3));
+        return ((hex(c2)<<4) + hex(c3));
     }
 
-    if(mime_mode != 'B')
-       return sgetc(f);
+    if(mime_mode != 'B') {
+        mime_mode = FALSE;
+        return sgetc(f);
+    }
 
 
     /* Base64 encoding */
-    /*
-       MIME allows line break in the middle of
-       Base64, but we are very pessimistic in decoding
-       in unbuf mode because MIME encoded code may broken by
-       less or editor's control sequence (such as ESC-[-K in unbuffered
-       mode. ignore incomplete MIME.
+    /* 
+        MIME allows line break in the middle of 
+        Base64, but we are very pessimistic in decoding
+        in unbuf mode because MIME encoded code may broken by 
+        less or editor's control sequence (such as ESC-[-K in unbuffered
+        mode. ignore incomplete MIME.
     */
     mode = mime_mode;
-    mime_mode = FALSE; /* prepare for quit */
+    mime_mode = exit_mode;  /* prepare for quit */
 
-    while ((c1 = sgetc(f))<=' ') {
-       if(c1==SEOF)
-           return (SEOF);
-       if(unbuf_f) {
-           input_mode = ASCII;  return c1;
-       }
+    while ((c1 = mime_getc0(f))<=' ') {
+        if(c1==EOF)
+            return (EOF);
     }
-    while ((c2 = sgetc(f))<=' ') {
-       if(c2==SEOF)
-           return (SEOF);
-       if(unbuf_f) {
-           input_mode = ASCII;  return c2;
-       }
+    if((c2 = mime_getc0(f))<=' ') {
+        if(c2==EOF)
+            return (EOF);
+        if(mimebuf_f!=FIXED_MIME) input_mode = ASCII;  
+        return c2;
     }
-    if ((c1 == '?') && (c2 == '=')) return sgetc(f);
-    while ((c3 = sgetc(f))<=' ') {
-       if(c3==SEOF)
-           return (SEOF);
-       if(unbuf_f) {
-           input_mode = ASCII;  return c3;
-       }
+    if((c1 == '?') && (c2 == '=')) {
+        input_mode = ASCII;
+        while((c1 =  sgetc(f))==' ' /* || c1=='\n' || c1=='\r' */);
+        return c1;
     }
-    while ((c4 = sgetc(f))<=' ') {
-       if(c4==SEOF)
-           return (SEOF);
-       if(unbuf_f) {
-           input_mode = ASCII;  return c4;
-       }
+    if((c3 = mime_getc0(f))<=' ') {
+        if(c3==EOF)
+            return (EOF);
+        if(mimebuf_f!=FIXED_MIME) input_mode = ASCII;  
+        return c3;
+    }
+    if((c4 = mime_getc0(f))<=' ') {
+        if(c4==EOF)
+            return (EOF);
+        if(mimebuf_f!=FIXED_MIME) input_mode = ASCII;  
+        return c4;
     }
 
     mime_mode = mode; /* still in MIME sigh... */
@@ -1627,49 +2204,166 @@ mime_getc(SFILE *f)
     t3 = 0x3f & base64decode(c3);
     t4 = 0x3f & base64decode(c4);
     cc = ((t1 << 2) & 0x0fc) | ((t2 >> 4) & 0x03);
-    if (c2 != '=') {
-       Fifo(mime_last++) = cc;
-       cc = ((t2 << 4) & 0x0f0) | ((t3 >> 2) & 0x0f);
-       if (c3 != '=') {
-           Fifo(mime_last++) = cc;
-           cc = ((t3 << 6) & 0x0c0) | (t4 & 0x3f);
-           if (c4 != '=')
-               Fifo(mime_last++) = cc;
-       }
+    if(c2 != '=') {
+        Fifo(mime_last++) = cc;
+        cc = ((t2 << 4) & 0x0f0) | ((t3 >> 2) & 0x0f);
+        if(c3 != '=') {
+            Fifo(mime_last++) = cc;
+            cc = ((t3 << 6) & 0x0c0) | (t4 & 0x3f);
+            if(c4 != '=') 
+                Fifo(mime_last++) = cc;
+        }
     } else {
-       return c1;
+        return c1;
     }
     return  Fifo(mime_top++);
 }
 
-static int
-mime_ungetc(unsigned int c)
+int
+mime_ungetc(c) 
+unsigned int   c;
 {
     Fifo(mime_last++) = c;
     return c;
 }
 
-static int
-base64decode(int c)
+#ifdef STRICT_MIME
+int
+mime_integrity(SFILE *f, unsigned char *p)
 {
-    int                    i;
-    if (c > '@')
-    {
-       if (c < '[')
-           i = c - 'A';        /* A..Z 0-25 */
-       else
-           i = c - 'G' /* - 'a' + 26 */ ;      /* a..z 26-51 */
+    int c,d;
+    unsigned int q;
+    /* In buffered mode, read until =? or NL or buffer full
+     */
+    mime_input = mime_top;
+    mime_last = mime_top;
+    while(*p) Fifo(mime_input++) = *p++;
+    d = 0;
+    q = mime_input;
+    while((c=sgetc(f))!=EOF) {
+        if(((mime_input-mime_top)&MIME_BUF_MASK)==0) break;
+        if(c=='=' && d=='?') {
+            /* checked. skip header, start decode */
+            Fifo(mime_input++) = c;
+            mime_input = q; 
+            return 1;
+        }
+        if(!( (c=='+'||c=='/'|| c=='=' || c=='?' ||
+            ('a'<=c && c<='z')||('A'<= c && c<='Z')||('0'<=c && c<='9'))))
+            break;
+        /* Should we check length mod 4? */
+        Fifo(mime_input++) = c;
+        d=c;
     }
-    else if (c > '/')
-       i = c - '0' + '4' /* - '0' + 52 */ ;    /* 0..9 52-61 */
-    else if (c == '+')
-       i = '>' /* 62 */ ;      /* +  62 */
-    else
-       i = '?' /* 63 */ ;      /* / 63 */
+    /* In case of Incomplete MIME, no MIME decode  */
+    Fifo(mime_input++) = c;
+    mime_last = mime_input;     /* point undecoded buffer */
+    mime_mode = 1;              /* no decode on Fifo last in mime_getc */
+    return 1;
+}
+#endif
 
+int
+base64decode(int c)
+{
+    int             i;
+    if(c > '@')
+        if(c < '[')
+            i = c - 'A';                        /* A..Z 0-25 */
+        else
+            i = c - 'G'     /* - 'a' + 26 */ ;  /* a..z 26-51 */
+    else if(c > '/')
+        i = c - '0' + '4'   /* - '0' + 52 */ ;  /* 0..9 52-61 */
+    else if(c == '+')
+        i = '>'             /* 62 */ ;          /* +  62 */
+    else
+        i = '?'             /* 63 */ ;          /* / 63 */
     return (i);
 }
 
+void 
+reinit()
+{
+    unbuf_f = FALSE;
+    estab_f = FALSE;
+    nop_f = FALSE;
+    binmode_f = TRUE;       
+    rot_f = FALSE;         
+    input_f = FALSE;      
+    alpha_f = FALSE;     
+    mime_f = TRUE;      
+    mimebuf_f = FALSE; 
+    broken_f = FALSE;  
+    iso8859_f = FALSE; 
+    x0201_f = TRUE;    
+    x0201_f = NO_X0201; 
+    fold_f  = FALSE;
+    kanji_intro = DEFAULT_J;
+    ascii_intro = DEFAULT_R;
+    oconv = DEFAULT_CONV; 
+    output_mode = ASCII;
+    input_mode =  ASCII;
+    shift_mode =  FALSE;
+    mime_mode =   FALSE;
+    file_out = FALSE;
+    add_cr = FALSE;
+    del_cr = FALSE;
+}
+
+#if 0
+#ifndef PERL_XS
+int 
+usage()   
+{
+    fprintf(stderr,"USAGE:  nkf(nkf32,wnkf,nkf2) -[flags] [in file] .. [out file for -O flag]\n");
+    fprintf(stderr,"Flags:\n");
+    fprintf(stderr,"b,u      Output is bufferred (DEFAULT),Output is unbufferred\n");
+#ifdef DEFAULT_CODE_SJIS
+    fprintf(stderr,"j,s,e    Outout code is JIS 7 bit, Shift JIS (DEFAULT), AT&T JIS (EUC)\n");
+#endif
+#ifdef DEFAULT_CODE_JIS
+    fprintf(stderr,"j,s,e    Outout code is JIS 7 bit (DEFAULT), Shift JIS, AT&T JIS (EUC)\n");
+#endif
+#ifdef DEFAULT_CODE_EUC
+    fprintf(stderr,"j,s,e    Outout code is JIS 7 bit, Shift JIS, AT&T JIS (EUC) (DEFAULT)\n");
+#endif
+    fprintf(stderr,"J,S,E    Input assumption is JIS 7 bit , Shift JIS, AT&T JIS (EUC)\n");
+    fprintf(stderr,"t        no conversion\n");
+    fprintf(stderr,"i_       Output sequence to designate JIS-kanji (DEFAULT B)\n");
+    fprintf(stderr,"o_       Output sequence to designate ASCII (DEFAULT B)\n");
+    fprintf(stderr,"r        {de/en}crypt ROT13/47\n");
+    fprintf(stderr,"v        Show this usage\n");
+    fprintf(stderr,"m[BQ0]   MIME decode [B:base64,Q:quoted,0:no decode]\n");
+    fprintf(stderr,"l        ISO8859-1 (Latin-1) support\n");
+    fprintf(stderr,"f        Folding: -f60 or -f\n");
+    fprintf(stderr,"Z[0-2]   Convert X0208 alphabet to ASCII  1: Kankaku to space,2: 2 spaces\n");
+    fprintf(stderr,"X,x      Assume X0201 kana in MS-Kanji, -x preserves X0201\n");
+    fprintf(stderr,"B[0-2]   Broken input  0: missing ESC,1: any X on ESC-[($]-X,2: ASCII on NL\n");
+#ifdef MSDOS
+    fprintf(stderr,"T        Text mode output\n");
+#endif
+    fprintf(stderr,"O        Output to File (DEFAULT 'nkf.out')\n");
+    fprintf(stderr,"d,c      Delete \\r in line feed, Add \\r in line feed\n");
+    fprintf(stderr,"Network Kanji Filter Version %s (%s) "
+#if defined(MSDOS) && !defined(_Windows)
+                  "for DOS"
+#endif
+#if !defined(__WIN32__) && defined(_Windows)
+                  "for Win16"
+#endif
+#if defined(__WIN32__) && defined(_Windows)
+                  "for Win32"
+#endif
+#ifdef __OS2__
+                  "for OS/2"
+#endif
+                  ,Version,Patchlevel);
+    fprintf(stderr,"\n%s\n",CopyRight);
+    return 0;
+}
+#endif
+#endif
+
 /**
  ** ¥Ñ¥Ã¥ÁÀ©ºî¼Ô
  **  void@merope.pleiades.or.jp (Kusakabe Youichi)
@@ -1679,11 +2373,13 @@ base64decode(int c)
  **  kiri@pulser.win.or.jp (Tetsuaki Kiriyama)
  **  Kimihiko Sato <sato@sail.t.u-tokyo.ac.jp>
  **  a_kuroe@kuroe.aoba.yokohama.jp (Akihiko Kuroe)
- **  kono@csl.sony.co.jp (Shinji Kono)
+ **  kono@ie.u-ryukyu.ac.jp (Shinji Kono)
+ **  GHG00637@nifty-serve.or.jp (COW)
  **
  ** ºÇ½ª¹¹¿·Æü
- **  1994.12.21
+ **  1998.11.7
  **/
 
 /* end */
 #endif /* JAPANESE */
+