diff -ruN TiMidity++-2.10.0/ChangeLog TiMidity++-2.10.1/ChangeLog --- TiMidity++-2.10.0/ChangeLog Wed Aug 9 16:53:57 2000 +++ TiMidity++-2.10.1/ChangeLog Wed Oct 18 09:09:36 2000 @@ -1,3 +1,66 @@ +2000-10-18 Masanao Izumo + + * Version 2.10.1 released. + +2000-10-17 Paolo Bonzini + + 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 + + * utils/nkflib.c: Update newer version. + +2000-08-30 Masanao Izumo + + * interface/{Makefile.am,Makefile.in}: + Added target of interface_r.so and interface_A.so. + +2000-08-29 Masanao Izumo + + * interface/x_sherry.c: Remove memory leak. + +2000-08-26 Henrique M. Holschuh + + * Bug fixed about dynamic_interface_id + * Added interface_?.txt files + +2000-08-20 Eric A. Welsh + + * 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 * Version 2.10.0 released. diff -ruN TiMidity++-2.10.0/Makefile.am TiMidity++-2.10.1/Makefile.am --- TiMidity++-2.10.0/Makefile.am Wed Jul 5 22:54:37 2000 +++ TiMidity++-2.10.1/Makefile.am Wed Aug 30 14:24:47 2000 @@ -93,7 +93,7 @@ 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 diff -ruN TiMidity++-2.10.0/Makefile.in TiMidity++-2.10.1/Makefile.in --- TiMidity++-2.10.0/Makefile.in Wed Aug 9 16:54:06 2000 +++ TiMidity++-2.10.1/Makefile.in Wed Oct 18 09:09:50 2000 @@ -465,7 +465,7 @@ 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 -ruN TiMidity++-2.10.0/NEWS TiMidity++-2.10.1/NEWS --- TiMidity++-2.10.0/NEWS Wed Aug 9 16:54:02 2000 +++ TiMidity++-2.10.1/NEWS Wed Oct 18 09:09:16 2000 @@ -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 diff -ruN TiMidity++-2.10.0/configs/msc-config.h TiMidity++-2.10.1/configs/msc-config.h --- TiMidity++-2.10.0/configs/msc-config.h Wed Aug 9 16:54:16 2000 +++ TiMidity++-2.10.1/configs/msc-config.h Wed Oct 18 09:10:01 2000 @@ -261,7 +261,7 @@ /* In VDS Macro AAA=BBB is not available. */ #define __W32__ -#define TIMID_VERSION "2.10.0" +#define TIMID_VERSION "2.10.1" #define DEFAULT_PATH ".\\" #define AU_W32 #define WINSOCK diff -ruN TiMidity++-2.10.0/configure TiMidity++-2.10.1/configure --- TiMidity++-2.10.0/configure Tue Aug 8 10:49:22 2000 +++ TiMidity++-2.10.1/configure Wed Oct 18 08:39:15 2000 @@ -891,7 +891,7 @@ 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 @@ - if false; then ENABLE_ALSASEQ_TRUE= ENABLE_ALSASEQ_FALSE='#' @@ -7566,17 +7565,17 @@ 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 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 @@ 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 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 @@ 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 @@ ac_save_LIBS="$LIBS" LIBS="-lXpm $LIBS" cat > conftest.$ac_ext <&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 @@ 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 @@ ac_save_LIBS="$LIBS" LIBS="-lDnd $LIBS" cat > conftest.$ac_ext <&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 @@ 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 @@ ac_save_LIBS="$LIBS" LIBS="-lz $LIBS" cat > conftest.$ac_ext <&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 @@ 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 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 @@ 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 @@ ac_save_LIBS="$LIBS" LIBS="-lpng -lz $LIBS" cat > conftest.$ac_ext <&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 diff -ruN TiMidity++-2.10.0/configure.in TiMidity++-2.10.1/configure.in --- TiMidity++-2.10.0/configure.in Tue Aug 8 10:48:52 2000 +++ TiMidity++-2.10.1/configure.in Wed Oct 18 08:38:25 2000 @@ -55,7 +55,7 @@ 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 @@ -1192,7 +1192,6 @@ [ INTERFACE_SRCS="$INTERFACE_SRCS server_c.c" AC_CHECK_HEADERS(sys/soundcard.h) ]) - dnl TiMidity ALSA sequencer server AM_CONDITIONAL(ENABLE_ALSASEQ, false) diff -ruN TiMidity++-2.10.0/interface/Makefile.am TiMidity++-2.10.1/interface/Makefile.am --- TiMidity++-2.10.0/interface/Makefile.am Fri Jul 14 19:47:35 2000 +++ TiMidity++-2.10.1/interface/Makefile.am Wed Oct 18 08:32:00 2000 @@ -113,7 +113,6 @@ w32g_sleep.bmp \ w32g_subbtn.bmp - if ENABLE_WRD WRD_OBJS = \ wrdt_x.o \ @@ -167,7 +166,15 @@ 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' $< > $@ @@ -281,6 +288,12 @@ 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 diff -ruN TiMidity++-2.10.0/interface/Makefile.in TiMidity++-2.10.1/interface/Makefile.in --- TiMidity++-2.10.0/interface/Makefile.in Wed Aug 9 16:54:09 2000 +++ TiMidity++-2.10.1/interface/Makefile.in Wed Oct 18 09:09:54 2000 @@ -149,7 +149,7 @@ 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 @@ -656,6 +656,12 @@ @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 -ruN TiMidity++-2.10.0/interface/interface_T.txt TiMidity++-2.10.1/interface/interface_T.txt --- TiMidity++-2.10.0/interface/interface_T.txt Thu Jan 1 09:00:00 1970 +++ TiMidity++-2.10.1/interface/interface_T.txt Wed Aug 30 13:58:13 2000 @@ -0,0 +1 @@ +vt100 interface diff -ruN TiMidity++-2.10.0/interface/interface_a.txt TiMidity++-2.10.1/interface/interface_a.txt --- TiMidity++-2.10.0/interface/interface_a.txt Thu Jan 1 09:00:00 1970 +++ TiMidity++-2.10.1/interface/interface_a.txt Wed Aug 30 13:58:13 2000 @@ -0,0 +1 @@ +Xaw interface diff -ruN TiMidity++-2.10.0/interface/interface_e.txt TiMidity++-2.10.1/interface/interface_e.txt --- TiMidity++-2.10.0/interface/interface_e.txt Thu Jan 1 09:00:00 1970 +++ TiMidity++-2.10.1/interface/interface_e.txt Wed Aug 30 13:58:13 2000 @@ -0,0 +1 @@ +Emacs interface (invoked from `M-x timidity') diff -ruN TiMidity++-2.10.0/interface/interface_g.txt TiMidity++-2.10.1/interface/interface_g.txt --- TiMidity++-2.10.0/interface/interface_g.txt Thu Jan 1 09:00:00 1970 +++ TiMidity++-2.10.1/interface/interface_g.txt Wed Aug 30 13:58:13 2000 @@ -0,0 +1 @@ +gtk+ interface diff -ruN TiMidity++-2.10.0/interface/interface_i.txt TiMidity++-2.10.1/interface/interface_i.txt --- TiMidity++-2.10.0/interface/interface_i.txt Thu Jan 1 09:00:00 1970 +++ TiMidity++-2.10.1/interface/interface_i.txt Wed Aug 30 13:58:13 2000 @@ -0,0 +1 @@ +X Skin interface diff -ruN TiMidity++-2.10.0/interface/interface_m.txt TiMidity++-2.10.1/interface/interface_m.txt --- TiMidity++-2.10.0/interface/interface_m.txt Thu Jan 1 09:00:00 1970 +++ TiMidity++-2.10.1/interface/interface_m.txt Wed Aug 30 13:58:13 2000 @@ -0,0 +1 @@ +Motif interface diff -ruN TiMidity++-2.10.0/interface/interface_n.txt TiMidity++-2.10.1/interface/interface_n.txt --- TiMidity++-2.10.0/interface/interface_n.txt Thu Jan 1 09:00:00 1970 +++ TiMidity++-2.10.1/interface/interface_n.txt Wed Aug 30 13:58:13 2000 @@ -0,0 +1 @@ +ncurses interface diff -ruN TiMidity++-2.10.0/interface/interface_s.txt TiMidity++-2.10.1/interface/interface_s.txt --- TiMidity++-2.10.0/interface/interface_s.txt Thu Jan 1 09:00:00 1970 +++ TiMidity++-2.10.1/interface/interface_s.txt Wed Aug 30 13:58:13 2000 @@ -0,0 +1 @@ +slang interface diff -ruN TiMidity++-2.10.0/interface/x_sherry.c TiMidity++-2.10.1/interface/x_sherry.c --- TiMidity++-2.10.0/interface/x_sherry.c Sat Feb 19 20:44:53 2000 +++ TiMidity++-2.10.1/interface/x_sherry.c Tue Aug 29 15:20:56 2000 @@ -1956,6 +1956,7 @@ case 0x1d: case 0x1e: case 0x1f: + case 0x20: case 0x71: case 0x72: case 0x7f: @@ -2051,10 +2052,6 @@ shm_error = -1; 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 diff -ruN TiMidity++-2.10.0/libunimod/Makefile.am TiMidity++-2.10.1/libunimod/Makefile.am --- TiMidity++-2.10.0/libunimod/Makefile.am Wed Jul 5 22:51:48 2000 +++ TiMidity++-2.10.1/libunimod/Makefile.am Tue Oct 17 19:29:08 2000 @@ -40,6 +40,7 @@ load_med.c \ load_mod.c \ load_mtm.c \ + load_okt.c \ load_s3m.c \ load_stm.c \ load_stx.c \ diff -ruN TiMidity++-2.10.0/libunimod/Makefile.in TiMidity++-2.10.1/libunimod/Makefile.in --- TiMidity++-2.10.0/libunimod/Makefile.in Wed Aug 9 16:54:12 2000 +++ TiMidity++-2.10.1/libunimod/Makefile.in Wed Oct 18 09:09:57 2000 @@ -117,7 +117,7 @@ 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 @@ 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) @@ -261,6 +261,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 diff -ruN TiMidity++-2.10.0/libunimod/load_imf.c TiMidity++-2.10.1/libunimod/load_imf.c --- TiMidity++-2.10.0/libunimod/load_imf.c Thu Feb 17 23:22:34 2000 +++ TiMidity++-2.10.1/libunimod/load_imf.c Tue Oct 17 19:59:15 2000 @@ -611,7 +611,10 @@ 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; \ diff -ruN TiMidity++-2.10.0/libunimod/load_m15.c TiMidity++-2.10.1/libunimod/load_m15.c --- TiMidity++-2.10.0/libunimod/load_m15.c Thu Feb 17 23:22:34 2000 +++ TiMidity++-2.10.1/libunimod/load_m15.c Tue Oct 17 19:01:07 2000 @@ -240,10 +240,10 @@ 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 @@ 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 @@ 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 @@ 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 @@ { NULL, "15-instrument module", - "MOD (15 instrument)", + "MOD (15 instruments)", M15_Init, M15_Test, M15_Load, diff -ruN TiMidity++-2.10.0/libunimod/load_med.c TiMidity++-2.10.1/libunimod/load_med.c --- TiMidity++-2.10.0/libunimod/load_med.c Thu Feb 17 23:22:34 2000 +++ TiMidity++-2.10.1/libunimod/load_med.c Tue Oct 17 18:54:57 2000 @@ -36,18 +36,18 @@ /*========== 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 @@ 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 @@ 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 @@ 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 @@ ULONG dumps; ULONG reserved2[7]; } -MMD0exp; +MEDEXP; typedef struct MMD0NOTE { @@ -120,37 +120,37 @@ } 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 @@ 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 @@ { 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 @@ 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 @@ } /* 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 @@ } /* 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 @@ /* 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 @@ 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 @@ } 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 @@ 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 @@ 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); diff -ruN TiMidity++-2.10.0/libunimod/load_mod.c TiMidity++-2.10.1/libunimod/load_mod.c --- TiMidity++-2.10.0/libunimod/load_mod.c Fri Feb 18 10:33:38 2000 +++ TiMidity++-2.10.1/libunimod/load_mod.c Tue Oct 17 19:01:02 2000 @@ -259,6 +259,14 @@ 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 @@ { NULL, "Standard module", - "MOD (31 instrument)", + "MOD (31 instruments)", MOD_Init, MOD_Test, MOD_Load, diff -ruN TiMidity++-2.10.0/libunimod/load_okt.c TiMidity++-2.10.1/libunimod/load_okt.c --- TiMidity++-2.10.0/libunimod/load_okt.c Thu Jan 1 09:00:00 1970 +++ TiMidity++-2.10.1/libunimod/load_okt.c Tue Oct 17 19:47:13 2000 @@ -0,0 +1,446 @@ +/* MikMod sound library + (c) 1999, 2000 Miodrag Vallat and others - see file AUTHORS for + complete list. + + This library is free software; you can redistribute it and/or modify + it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ + +/*============================================================================== + + $Id: load_okt.c,v 1.3 2000/02/14 22:10:22 miod Exp $ + + Oktalyzer (OKT) module loader + +==============================================================================*/ + +/* + Written by UFO + based on the file description compiled by Harald Zappe + + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include +#include + +#include "unimod_priv.h" + +/*========== Module blocks */ + +/* sample information */ +typedef struct OKTSAMPLE { + CHAR sampname[20]; + ULONG len; + UWORD loopbeg; + UWORD looplen; + UBYTE volume; +} OKTSAMPLE; + +typedef struct OKTNOTE { + UBYTE note, ins, eff, dat; +} OKTNOTE; + +/*========== Loader variables */ + +static OKTNOTE *okttrk = NULL; + +/*========== Loader code */ + +BOOL OKT_Test(void) +{ + CHAR id[8]; + + if (!_mm_read_UBYTES(id, 8, modreader)) + return 0; + if (!memcmp(id, "OKTASONG", 8)) + return 1; + + return 0; +} + +/* Pattern analysis routine. + Effects not implemented (yet) : (in decimal) + 11 Arpeggio 4: Change note every 50Hz tick between N,H,N,L + 12 Arpeggio 5: Change note every 50Hz tick between H,H,N + N = normal note being played in this channel (1-36) + L = normal note number minus upper four bits of 'data'. + H = normal note number plus lower four bits of 'data'. + 13 Decrease note number by 'data' once per tick. + 17 Increase note number by 'data' once per tick. + 21 Decrease note number by 'data' once per line. + 30 Increase note number by 'data' once per line. +*/ +static UBYTE *OKT_ConvertTrack(UBYTE patrows) +{ + int t; + UBYTE ins, note, eff, dat; + + UniReset(); + for (t = 0; t < patrows; t++) { + note = okttrk[t].note; + ins = okttrk[t].ins; + eff = okttrk[t].eff; + dat = okttrk[t].dat; + + if (note) { + UniNote(note + 3*OCTAVE - 1); + UniInstrument(ins); + } + + if (eff) + switch (eff) { + case 1: /* Porta Up */ + UniPTEffect(0x1, dat); + break; + case 2: /* Portamento Down */ + UniPTEffect(0x2, dat); + break; + case 10: /* Arpeggio 3 supported */ + UniPTEffect(0x0, dat); + break; + case 15: /* Amiga filter toggle, ignored */ + break; + case 25: /* Pattern Jump */ + UniPTEffect(0xb, dat); + break; + case 27: /* Release - similar to Keyoff */ + UniWriteByte(UNI_KEYOFF); + break; + case 28: /* Set Tempo */ + UniPTEffect(0xf, dat); + break; + case 31: /* volume Control */ + if (dat <= 0x40) + UniPTEffect(0xc, dat); + else if (dat <= 0x50) + UniEffect(UNI_XMEFFECTA, (dat - 0x40)); /* fast fade out */ + else if (dat <= 0x60) + UniEffect(UNI_XMEFFECTA, (dat - 0x50) << 4); /* fast fade in */ + else if (dat <= 0x70) + UniEffect(UNI_XMEFFECTEB, (dat - 0x60)); /* slow fade out */ + else if (dat <= 0x80) + UniEffect(UNI_XMEFFECTEA, (dat - 0x70)); /* slow fade in */ + break; +#ifdef MIKMOD_DEBUG + default: + fprintf(stderr, "\rUnimplemented effect (%02d,%02x)\n", + eff, dat); +#endif + } + + UniNewline(); + } + return UniDup(); +} + +/* Read "channel modes" i.e. channel number and panning information */ +static void OKT_doCMOD(void) +{ + /* amiga channel panning table */ + UBYTE amigapan[4] = { 0x00, 0xff, 0xff, 0x00 }; + int t; + + of.numchn = 0; + + for (t = 0; t < 4; t++) + if (_mm_read_M_UWORD(modreader)) { + /* two channels tied to the same Amiga hardware voice */ + of.panning[of.numchn++] = amigapan[t]; + of.panning[of.numchn++] = amigapan[t]; + } else + /* one channel tied to the Amiga hardware voice */ + of.panning[of.numchn++] = amigapan[t]; +} + +/* Read sample information */ +static BOOL OKT_doSAMP(int len) +{ + int t; + SAMPLE *q; + OKTSAMPLE s; + + of.numins = of.numsmp = (len / 0x20); + if (!AllocSamples()) + return 0; + + for (t = 0, q = of.samples; t < of.numins; t++, q++) { + _mm_read_UBYTES(s.sampname, 20, modreader); + s.len = _mm_read_M_ULONG(modreader); + s.loopbeg = _mm_read_M_UWORD(modreader); + s.looplen = _mm_read_M_UWORD(modreader); + _mm_read_UBYTE(modreader); + s.volume = _mm_read_UBYTE(modreader); + _mm_read_M_UWORD(modreader); + + if (_mm_eof(modreader)) { + _mm_errno = MMERR_LOADING_SAMPLEINFO; + return 0; + } + + if (!s.len) + q->seekpos = q->length = q->loopstart = q->loopend = q->flags = 0; + else { + s.len--; + /* sanity checks */ + if (s.loopbeg > s.len) + s.loopbeg = s.len; + if (s.loopbeg + s.looplen > s.len) + s.looplen = s.len - s.loopbeg; + if (s.looplen < 2) + s.looplen = 0; + + q->length = s.len; + q->loopstart = s.loopbeg; + q->loopend = s.looplen + q->loopstart; + q->volume = s.volume; + q->flags = SF_SIGNED; + + if (s.looplen) + q->flags |= SF_LOOP; + } + q->samplename = DupStr(s.sampname, 20, 1); + q->speed = 8363; + } + return 1; +} + +/* Read speed information */ +static void OKT_doSPEE(void) +{ + int tempo = _mm_read_M_UWORD(modreader); + + of.initspeed = tempo; +} + +/* Read song length information */ +static void OKT_doSLEN(void) +{ + of.numpat = _mm_read_M_UWORD(modreader); +} + +/* Read pattern length information */ +static void OKT_doPLEN(void) +{ + of.numpos = _mm_read_M_UWORD(modreader); +} + +/* Read order table */ +static BOOL OKT_doPATT(void) +{ + int t; + + if (!of.numpos || !AllocPositions(of.numpos)) + return 0; + + for (t = 0; t < 128; t++) + if (t < of.numpos) + of.positions[t] = (UWORD)_mm_read_UBYTE(modreader); + else + break; + + return 1; +} + +static BOOL OKT_doPBOD(int patnum) +{ + char *patbuf; + int rows, i; + int u; + + if (!patnum) { + of.numtrk = of.numpat * of.numchn; + + if (!AllocTracks() || !AllocPatterns()) + return 0; + } + + /* Read pattern */ + of.pattrows[patnum] = rows = _mm_read_M_UWORD(modreader); + + if (!(okttrk = (OKTNOTE *) _mm_calloc(rows, sizeof(OKTNOTE))) || + !(patbuf = (char *)_mm_calloc(rows * of.numchn, sizeof(OKTNOTE)))) + return 0; + _mm_read_UBYTES(patbuf, rows * of.numchn * sizeof(OKTNOTE), modreader); + if (_mm_eof(modreader)) { + _mm_errno = MMERR_LOADING_PATTERN; + return 0; + } + + for (i = 0; i < of.numchn; i++) { + for (u = 0; u < rows; u++) { + okttrk[u].note = patbuf[(u * of.numchn + i) * sizeof(OKTNOTE)]; + okttrk[u].ins = patbuf[(u * of.numchn + i) * sizeof(OKTNOTE) + 1]; + okttrk[u].eff = patbuf[(u * of.numchn + i) * sizeof(OKTNOTE) + 2]; + okttrk[u].dat = patbuf[(u * of.numchn + i) * sizeof(OKTNOTE) + 3]; + } + + if (!(of.tracks[patnum * of.numchn + i] = OKT_ConvertTrack(rows))) + return 0; + } + _mm_free(patbuf); + _mm_free(okttrk); + return 1; +} + +static void OKT_doSBOD(int insnum) +{ + of.samples[insnum].seekpos = _mm_ftell(modreader); +} + +BOOL OKT_Load(BOOL curious) +{ + UBYTE id[4]; + ULONG len; + ULONG fp; + BOOL seen_cmod = 0, seen_samp = 0, seen_slen = 0, seen_plen = 0, seen_patt + = 0, seen_spee = 0; + int patnum = 0, insnum = 0; + + /* skip OKTALYZER header */ + _mm_fseek(modreader, 8, SEEK_SET); + of.songname = strdup(""); + + of.modtype = strdup("Amiga Oktalyzer"); + of.numpos = of.reppos = 0; + + /* default values */ + of.initspeed = 6; + of.inittempo = 125; + + while (1) { + /* read block header */ + _mm_read_UBYTES(id, 4, modreader); + len = _mm_read_M_ULONG(modreader); + + if (_mm_eof(modreader)) + break; + fp = _mm_ftell(modreader); + + if (!memcmp(id, "CMOD", 4)) { + if (!seen_cmod) { + OKT_doCMOD(); + seen_cmod = 1; + } else { + _mm_errno = MMERR_LOADING_HEADER; + return 0; + } + } else if (!memcmp(id, "SAMP", 4)) { + if (!seen_samp && OKT_doSAMP(len)) + seen_samp = 1; + else { + _mm_errno = MMERR_LOADING_HEADER; + return 0; + } + } else if (!memcmp(id, "SPEE", 4)) { + if (!seen_spee) { + OKT_doSPEE(); + seen_spee = 1; + } else { + _mm_errno = MMERR_LOADING_HEADER; + return 0; + } + } else if (!memcmp(id, "SLEN", 4)) { + if (!seen_slen) { + OKT_doSLEN(); + seen_slen = 1; + } else { + _mm_errno = MMERR_LOADING_HEADER; + return 0; + } + } else if (!memcmp(id, "PLEN", 4)) { + if (!seen_plen) { + OKT_doPLEN(); + seen_plen = 1; + } else { + _mm_errno = MMERR_LOADING_HEADER; + return 0; + } + } else if (!memcmp(id, "PATT", 4)) { + if (!seen_plen) { + _mm_errno = MMERR_LOADING_HEADER; + return 0; + } + if (!seen_patt && OKT_doPATT()) + seen_patt = 1; + else { + _mm_errno = MMERR_LOADING_HEADER; + return 0; + } + } else if (!memcmp(id,"PBOD", 4)) { + /* need to know numpat and numchn */ + if (!seen_slen || !seen_cmod || (patnum >= of.numpat)) { + _mm_errno = MMERR_LOADING_HEADER; + return 0; + } + if (!OKT_doPBOD(patnum++)) { + _mm_errno = MMERR_LOADING_PATTERN; + return 0; + } + } else if (!memcmp(id,"SBOD",4)) { + /* need to know numsmp */ + if (!seen_samp) { + _mm_errno = MMERR_LOADING_HEADER; + return 0; + } + while ((insnum < of.numins) && !of.samples[insnum].length) + insnum++; + if (insnum >= of.numins) { + _mm_errno = MMERR_LOADING_HEADER; + return 0; + } + OKT_doSBOD(insnum++); + } + + /* goto next block start position */ + _mm_fseek(modreader, fp + len, SEEK_SET); + } + + if (!seen_cmod || !seen_samp || !seen_patt || + !seen_slen || !seen_plen || (patnum != of.numpat)) { + _mm_errno = MMERR_LOADING_HEADER; + return 0; + } + + return 1; +} + +CHAR *OKT_LoadTitle(void) +{ + return strdup(""); +} + +/*========== Loader information */ + +MLOADER load_okt = { + NULL, + "OKT", + "OKT (Amiga Oktalyzer)", + NULL, + OKT_Test, + OKT_Load, + NULL, + OKT_LoadTitle +}; + +/* ex:set ts=4: */ diff -ruN TiMidity++-2.10.0/libunimod/load_stm.c TiMidity++-2.10.1/libunimod/load_stm.c --- TiMidity++-2.10.0/libunimod/load_stm.c Thu Feb 17 23:22:34 2000 +++ TiMidity++-2.10.1/libunimod/load_stm.c Tue Oct 17 19:41:45 2000 @@ -83,41 +83,25 @@ 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;ttrackername, STM_Signatures[t], 8)) break; of.modtype = strdup (STM_Version[t]); @@ -361,7 +345,7 @@ { /* 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 @@ 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) diff -ruN TiMidity++-2.10.0/libunimod/load_stx.c TiMidity++-2.10.1/libunimod/load_stx.c --- TiMidity++-2.10.0/libunimod/load_stx.c Thu Feb 17 23:22:34 2000 +++ TiMidity++-2.10.1/libunimod/load_stx.c Tue Oct 17 19:43:59 2000 @@ -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 @@ 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;tins = _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 @@ /* 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 @@ 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 @@ 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 @@ } 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 @@ /* 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) diff -ruN TiMidity++-2.10.0/libunimod/load_uni.c TiMidity++-2.10.1/libunimod/load_uni.c --- TiMidity++-2.10.0/libunimod/load_uni.c Thu Feb 17 23:22:34 2000 +++ TiMidity++-2.10.1/libunimod/load_uni.c Tue Oct 17 19:16:06 2000 @@ -118,7 +118,7 @@ /* 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; diff -ruN TiMidity++-2.10.0/libunimod/load_xm.c TiMidity++-2.10.1/libunimod/load_xm.c --- TiMidity++-2.10.0/libunimod/load_xm.c Thu Feb 17 23:22:34 2000 +++ TiMidity++-2.10.1/libunimod/load_xm.c Tue Oct 17 19:17:46 2000 @@ -524,9 +524,11 @@ 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 @@ 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; \ diff -ruN TiMidity++-2.10.0/libunimod/mloader.c TiMidity++-2.10.1/libunimod/mloader.c --- TiMidity++-2.10.0/libunimod/mloader.c Sat Feb 19 20:49:54 2000 +++ TiMidity++-2.10.1/libunimod/mloader.c Tue Oct 17 19:28:50 2000 @@ -1181,6 +1181,7 @@ LOADER (load_imf); LOADER (load_med); LOADER (load_mtm); + LOADER (load_okt); LOADER (load_stm); LOADER (load_stx); LOADER (load_ult); diff -ruN TiMidity++-2.10.0/libunimod/mlutil.c TiMidity++-2.10.1/libunimod/mlutil.c --- TiMidity++-2.10.0/libunimod/mlutil.c Thu Feb 17 23:22:34 2000 +++ TiMidity++-2.10.1/libunimod/mlutil.c Tue Oct 17 19:23:57 2000 @@ -48,6 +48,21 @@ 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 @@ 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 @@ 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. */ diff -ruN TiMidity++-2.10.0/libunimod/unimod_priv.h TiMidity++-2.10.1/libunimod/unimod_priv.h --- TiMidity++-2.10.0/libunimod/unimod_priv.h Thu Feb 24 14:15:25 2000 +++ TiMidity++-2.10.1/libunimod/unimod_priv.h Tue Oct 17 19:22:23 2000 @@ -126,6 +126,12 @@ extern int *noteindex; +/* tracker identifiers */ +#define STM_NTRACKERS 3 +extern CHAR *STM_Signatures[]; +extern CHAR *STM_Version[]; + + /*========== Internal loader interface */ extern BOOL ReadComment (UWORD); diff -ruN TiMidity++-2.10.0/timidity/effect.c TiMidity++-2.10.1/timidity/effect.c --- TiMidity++-2.10.0/timidity/effect.c Mon Jul 17 13:14:17 2000 +++ TiMidity++-2.10.1/timidity/effect.c Wed Aug 30 12:15:19 2000 @@ -62,8 +62,7 @@ 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); } diff -ruN TiMidity++-2.10.0/timidity/mix.c TiMidity++-2.10.1/timidity/mix.c --- TiMidity++-2.10.0/timidity/mix.c Fri Feb 18 02:02:50 2000 +++ TiMidity++-2.10.1/timidity/mix.c Wed Aug 30 13:22:04 2000 @@ -83,6 +83,9 @@ * 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 @@ 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. diff -ruN TiMidity++-2.10.0/timidity/mod.c TiMidity++-2.10.1/timidity/mod.c --- TiMidity++-2.10.0/timidity/mod.c Mon Mar 20 15:47:32 2000 +++ TiMidity++-2.10.1/timidity/mod.c Tue Oct 17 19:45:21 2000 @@ -370,9 +370,15 @@ 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 @@ if (tvol > 8000 * 7) return -1; + return t; } @@ -844,8 +851,6 @@ { UBYTE lo, hi; - mp.explicitslides = 1; - if (inf) a->s3mvolslide = inf; else @@ -1354,7 +1359,7 @@ { SWORD temp = mp.newbpm; - if (mp.vbtick || mp.patdly2) + if (mp.patdly2) return; if (tempo & 0x10) @@ -1585,7 +1590,7 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ /* 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 @@ 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 @@ if (aout) { - aout->kick = a->kick; aout->i = a->i; aout->s = a->s; aout->sample = a->sample; @@ -2854,6 +2853,7 @@ 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; diff -ruN TiMidity++-2.10.0/timidity/timidity.c TiMidity++-2.10.1/timidity/timidity.c --- TiMidity++-2.10.0/timidity/timidity.c Thu Jul 20 02:42:35 2000 +++ TiMidity++-2.10.1/timidity/timidity.c Wed Aug 30 13:58:01 2000 @@ -504,7 +504,7 @@ 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 @@ 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 @@ 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) { diff -ruN TiMidity++-2.10.0/utils/nkflib.c TiMidity++-2.10.1/utils/nkflib.c --- TiMidity++-2.10.0/utils/nkflib.c Mon Feb 7 07:32:56 2000 +++ TiMidity++-2.10.1/utils/nkflib.c Wed Oct 18 08:42:18 2000 @@ -19,25 +19,31 @@ 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) -** 連絡先: (株)富士通研究所 ソフト3研 市川 至 +** 連絡先: (株)富士通研究所 ソフト3研 市川 至 ** (E-Mail Address: ichikawa@flab.fujitsu.co.jp) -** 営利を目的としない限り、このソースのいかなる -** 複写,改変,修正も許諾します。その際には、この部分を残すこと。 +** Copyright (C) 1996,1998 +** 連絡先: 琉球大学情報工学科 河野 真治 mine/X0208 support +** (E-Mail Address: kono@ie.u-ryukyu.ac.jp) +** 連絡先: COW for DOS & Win16 & Win32 & OS/2 +** (E-Mail Address: GHG00637@niftyserve.or.p) +** このソースのいかなる複写,改変,修正も許諾します。ただし、 +** その際には、誰が貢献したを示すこの部分を残すこと。 +** 再配布や雑誌の付録などの問い合わせも必要ありません。 ** このプログラムについては特に何の保証もしない、悪しからず。 -** Everyone is permitted to do anything on this program -** including copying, modifying, improving -** as long as you don't try to 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. ***********************************************************************/ @@ -75,6 +81,11 @@ 改変者 出雲正尚 1997 */ +/* + 1.7ベースに変更。 + 改変者 青木大輔 2000.10 +*/ + /* もし,EUC-Japan の完全なチェックをする場合は EUC_STRICT_CHECK を定義 * してください.ただし,1 バイトでも EUC-Japan の未定義文字が含まれていると * EUC とみなされなくなってしまいます.他のプログラムで漢字コードを EUC に変換 @@ -84,13 +95,61 @@ #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 @@ #include #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 @@ #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 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 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 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 @@ 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 @@ 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 @@ /* 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 @@ 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 @@ 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 @@ SFILE xfi,xfo; int a; + reinit(); /* 使用? */ + if(maxsize == -1) maxsize = SAFE_CONVERT_LENGTH(strlen(si)); else if(maxsize == 0) @@ -551,9 +674,8 @@ x0201_f = TRUE; } - /* コンバート */ - convert(fi); + kanji_convert(fi); /* 後処理 */ sputchar('\0'); @@ -625,7 +747,7 @@ mode = ASCII; while(*p) { - if(*p < SP || *p >= DEL) + if(*p < SPACE || *p >= DEL) { if(*p == ESC) return JIS_INPUT; @@ -728,407 +850,682 @@ } #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; { - register int c1, - c2; + 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= *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) +{ + 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) { - /* 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 @@ **/ 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; - } - } - if (c2 == SEOF) - return VOIDVOID; - else if (c2 == 0 && (c1&0x80)) { - sputchar(SSO); sputchar(c1); - } else if (c2 == 0) { - sputchar(c1); + 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 == 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> 1) + ((c2 <= 0x5e) ? 0x71 : 0xb1))); - sputchar((c1 + ((c2 & 1) ? ((c1 < 0x60) ? 0x1f : 0x20) : 0x7e))); + if((c1<0x20 || 0x7e> 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 || 0x7e0x80 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' ';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 */ - if(p[k]!=q[k]) break; if(k==i && c1==p[k]) break; } - if(p) continue; sungetc(c1,f); for(j=0;j' ';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 */ + 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> 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 +#ifdef STRICT_MIME +int +mime_integrity(SFILE *f, unsigned char *p) +{ + 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; + } + /* 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 */ + 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 */ - + 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 @@ ** kiri@pulser.win.or.jp (Tetsuaki Kiriyama) ** Kimihiko Sato ** 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 */ +