#include "config.h"
static char *CopyRight =
- "Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa),2000 S. Kono, COW, 2002 Kono, Furukawa";
+ "Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa),2000 S. Kono, COW, 2002-2003 Kono, Furukawa";
static char *Version =
"2.0";
static char *Patchlevel =
- "1/0209/Shinji Kono";
+ "3/0310/Shinji Kono";
/*
**
** B[1-9] broken level
**
** O Output to 'nkf.out' file or last file name
-** OW Overwrite rewrite original file by converted result
** d Delete \r in line feed
** c Add \r in line feed
** -- other long option
**
**/
-/******************************/
-/* \e$B%G%U%)%k%H$N=PNO%3!<%IA*Br\e(B */
-/* Select DEFAULT_CODE */
-#define DEFAULT_CODE_JIS
-/* #define DEFAULT_CODE_SJIS */
-/* #define DEFAULT_CODE_EUC */
-/* #define DEFAULT_CODE_UTF8 */
-/******************************/
-
-#if (defined(__TURBOC__) || defined(LSI_C)) && !defined(MSDOS)
+#if (defined(__TURBOC__) || defined(_MSC_VER) || defined(LSI_C) || defined(__MINGW32__)) && !defined(MSDOS)
#define MSDOS
+#if (defined(__Win32__) || defined(_WIN32)) && !defined(__WIN32__)
+#define __WIN32__
+#endif
#endif
#ifdef PERL_XS
#include <stdlib.h>
#include <string.h>
-#include <ctype.h>
#if defined(MSDOS) || defined(__OS2__)
#include <fcntl.h>
#define setbinmode(fp)
#endif
-#ifdef _IOFBF /* SysV and MSDOS */
+#ifdef _IOFBF /* SysV and MSDOS, Windows */
#define setvbuffer(fp, buf, size) setvbuf(fp, buf, _IOFBF, size)
#else /* BSD */
#define setvbuffer(fp, buf, size) setbuffer(fp, buf, size)
/*Borland C++ 4.5 EasyWin*/
#if defined(__TURBOC__) && defined(_Windows) && !defined(__WIN32__) /*Easy Win */
#define EASYWIN
+#ifndef __WIN16__
+#define __WIN16__
+#endif
#include <windows.h>
#endif
#ifdef OVERWRITE
/* added by satoru@isoternet.org */
#include <sys/stat.h>
-#ifndef MSDOS
+#ifndef MSDOS /* UNIX, OS/2 */
#include <unistd.h>
#include <utime.h>
+#else
+#if defined(_MSC_VER) || defined(__MINGW32__) /* VC++, MinGW */
+#include <sys/utime.h>
+#elif defined(__TURBOC__) /* BCC */
+#include <utime.h>
+#elif defined(LSI_C) /* LSI C */
+#endif
#endif
#endif
+#ifdef INT_IS_SHORT
+#define int long
+#endif
+
#define FALSE 0
#define TRUE 1
#define sizeof_euc_utf8 94
#define sizeof_euc_to_utf8_1byte 94
#define sizeof_euc_to_utf8_2bytes 94
-#define sizeof_utf8_to_euc_C2 94
+#define sizeof_utf8_to_euc_C2 64
#define sizeof_utf8_to_euc_E5B8 64
#define sizeof_utf8_to_euc_2bytes 112
#define sizeof_utf8_to_euc_3bytes 112
/* function prototype */
-/* #define PROTO(x) () */
+#ifdef ANSI_C_PROTOTYPE
#define PROTO(x) x
-static int noconvert PROTO((FILE *f));
-static int kanji_convert PROTO((FILE *f));
-static int h_conv PROTO((FILE *f,int c2,int c1));
-static int push_hold_buf PROTO((int c2));
-static void set_iconv PROTO((int f, int (*iconv_func)()));
-static int s_iconv PROTO((int c2,int c1,int c0));
-static int e_iconv PROTO((int c2,int c1,int c0));
+#define STATIC static
+#else
+#define PROTO(x) ()
+#define STATIC
+#endif
+
+struct input_code{
+ char *name;
+ int stat;
+ int score;
+ int index;
+ int buf[3];
+ void (*status_func)PROTO((struct input_code *, int));
+ int (*iconv_func)PROTO((int c2, int c1, int c0));
+ int _file_stat;
+};
+
+STATIC char *input_codename = "";
+
+STATIC int noconvert PROTO((FILE *f));
+STATIC int kanji_convert PROTO((FILE *f));
+STATIC int h_conv PROTO((FILE *f,int c2,int c1));
+STATIC int push_hold_buf PROTO((int c2));
+STATIC void set_iconv PROTO((int f, int (*iconv_func)()));
+STATIC int s_iconv PROTO((int c2,int c1,int c0));
+STATIC int s2e_conv PROTO((int c2, int c1, int *p2, int *p1));
+STATIC int e_iconv PROTO((int c2,int c1,int c0));
#ifdef UTF8_INPUT_ENABLE
-static int w_iconv PROTO((int c2,int c1,int c0));
-static int w_iconv16 PROTO((int c2,int c1,int c0));
-static int w_iconv_common PROTO((int c2,int c1,int c0,unsigned short **pp));
+STATIC int w2e_conv PROTO((int c2,int c1,int c0,int *p2,int *p1));
+STATIC int w_iconv PROTO((int c2,int c1,int c0));
+STATIC int w_iconv16 PROTO((int c2,int c1,int c0));
+STATIC int w_iconv_common PROTO((int c1,int c0,unsigned short **pp,int psize,int *p2,int *p1));
+STATIC int ww16_conv PROTO((int c2, int c1, int c0));
#endif
#ifdef UTF8_OUTPUT_ENABLE
-static int e2w_conv PROTO((int c2,int c1));
-static void w_oconv PROTO((int c2,int c1));
-static void w_oconv16 PROTO((int c2,int c1));
-#endif
-static void e_oconv PROTO((int c2,int c1));
-static void s_oconv PROTO((int c2,int c1));
-static void j_oconv PROTO((int c2,int c1));
-static void fold_conv PROTO((int c2,int c1));
-static void cr_conv PROTO((int c2,int c1));
-static void z_conv PROTO((int c2,int c1));
-static void rot_conv PROTO((int c2,int c1));
-static void hira_conv PROTO((int c2,int c1));
-static void base64_conv PROTO((int c2,int c1));
-static void iso2022jp_check_conv PROTO((int c2,int c1));
-static void no_connection PROTO((int c2,int c1));
-static int no_connection2 PROTO((int c2,int c1,int c0));
-
-static void code_status PROTO((int c));
-
-static void std_putc PROTO((int c));
-static int std_getc PROTO((FILE *f));
-static int std_ungetc PROTO((int c,FILE *f));
-
-static int broken_getc PROTO((FILE *f));
-static int broken_ungetc PROTO((int c,FILE *f));
-
-static int mime_begin PROTO((FILE *f));
-static int mime_getc PROTO((FILE *f));
-static int mime_ungetc PROTO((int c,FILE *f));
-
-static int mime_begin_strict PROTO((FILE *f));
-static int mime_getc_buf PROTO((FILE *f));
-static int mime_ungetc_buf PROTO((int c,FILE *f));
-static int mime_integrity PROTO((FILE *f,unsigned char *p));
-
-static int base64decode PROTO((int c));
-static void mime_putc PROTO((int c));
-static void open_mime PROTO((int c));
-static void close_mime PROTO(());
-static void usage PROTO(());
-static void version PROTO(());
-static void options PROTO((unsigned char *c));
+STATIC int e2w_conv PROTO((int c2,int c1));
+STATIC void w_oconv PROTO((int c2,int c1));
+STATIC void w_oconv16 PROTO((int c2,int c1));
+#endif
+STATIC void e_oconv PROTO((int c2,int c1));
+STATIC void e2s_conv PROTO((int c2, int c1, int *p2, int *p1));
+STATIC void s_oconv PROTO((int c2,int c1));
+STATIC void j_oconv PROTO((int c2,int c1));
+STATIC void fold_conv PROTO((int c2,int c1));
+STATIC void cr_conv PROTO((int c2,int c1));
+STATIC void z_conv PROTO((int c2,int c1));
+STATIC void rot_conv PROTO((int c2,int c1));
+STATIC void hira_conv PROTO((int c2,int c1));
+STATIC void base64_conv PROTO((int c2,int c1));
+STATIC void iso2022jp_check_conv PROTO((int c2,int c1));
+STATIC void no_connection PROTO((int c2,int c1));
+STATIC int no_connection2 PROTO((int c2,int c1,int c0));
+
+STATIC void code_score PROTO((struct input_code *ptr));
+STATIC void code_status PROTO((int c));
+
+STATIC void std_putc PROTO((int c));
+STATIC int std_getc PROTO((FILE *f));
+STATIC int std_ungetc PROTO((int c,FILE *f));
+
+STATIC int broken_getc PROTO((FILE *f));
+STATIC int broken_ungetc PROTO((int c,FILE *f));
+
+STATIC int mime_begin PROTO((FILE *f));
+STATIC int mime_getc PROTO((FILE *f));
+STATIC int mime_ungetc PROTO((int c,FILE *f));
+
+STATIC int mime_begin_strict PROTO((FILE *f));
+STATIC int mime_getc_buf PROTO((FILE *f));
+STATIC int mime_ungetc_buf PROTO((int c,FILE *f));
+STATIC int mime_integrity PROTO((FILE *f,unsigned char *p));
+
+STATIC int base64decode PROTO((int c));
+STATIC void mime_putc PROTO((int c));
+STATIC void open_mime PROTO((int c));
+STATIC void close_mime PROTO(());
+STATIC void usage PROTO(());
+STATIC void version PROTO(());
+STATIC void options PROTO((unsigned char *c));
#ifdef PERL_XS
-static void reinit PROTO(());
+STATIC void reinit PROTO(());
#endif
/* buffers */
static int iso2022jp_f = FALSE; /* convert ISO-2022-JP */
#ifdef UTF8_OUTPUT_ENABLE
static int w_oconv16_begin_f= 0; /* utf-16 header */
+static int w_oconv16_LE = 0; /* utf-16 little endian */
#endif
-#ifdef CAP_URL_OPTION
+#ifdef NUMCHAR_OPTION
+
+#define CLASS_MASK 0x0f000000
+#define CLASS_UTF16 0x01000000
+#endif
+
+#ifdef INPUT_OPTION
static int cap_f = FALSE;
static int (*i_cgetc)PROTO((FILE *)) = std_getc; /* input of cgetc */
static int (*i_cungetc)PROTO((int c ,FILE *f)) = std_ungetc;
-static int cap_getc PROTO((FILE *f));
-static int cap_ungetc PROTO((int c,FILE *f));
+STATIC int cap_getc PROTO((FILE *f));
+STATIC int cap_ungetc PROTO((int c,FILE *f));
static int url_f = FALSE;
static int (*i_ugetc)PROTO((FILE *)) = std_getc; /* input of ugetc */
static int (*i_uungetc)PROTO((int c ,FILE *f)) = std_ungetc;
-static int url_getc PROTO((FILE *f));
-static int url_ungetc PROTO((int c,FILE *f));
+STATIC int url_getc PROTO((FILE *f));
+STATIC int url_ungetc PROTO((int c,FILE *f));
+
+static int numchar_f = FALSE;
+static int (*i_ngetc)PROTO((FILE *)) = std_getc; /* input of ugetc */
+static int (*i_nungetc)PROTO((int c ,FILE *f)) = std_ungetc;
+STATIC int numchar_getc PROTO((FILE *f));
+STATIC int numchar_ungetc PROTO((int c,FILE *f));
#endif
#ifdef CHECK_OPTION
static int noout_f = FALSE;
-static void no_putc PROTO((int c));
+STATIC void no_putc PROTO((int c));
static int debug_f = FALSE;
-static void debug PROTO((char *str));
+STATIC void debug PROTO((char *str));
+#endif
+
+#ifdef EXEC_IO
+static int exec_f = 0;
#endif
-static int e_stat = 0;
-static int s_stat = 0;
+#ifdef SHIFTJIS_CP932
+STATIC int cp932_f = TRUE;
+#define CP932_TABLE_BEGIN (0xfa)
+#define CP932_TABLE_END (0xfc)
+
+#endif /* SHIFTJIS_CP932 */
+
+STATIC void e_status PROTO((struct input_code *, int));
+STATIC void s_status PROTO((struct input_code *, int));
+
#ifdef UTF8_INPUT_ENABLE
-static int w_stat = 0;
+STATIC void w_status PROTO((struct input_code *, int));
+STATIC void w16_status PROTO((struct input_code *, int));
static int utf16_mode = UTF16_INPUT;
-#else
-static int w_stat = -1;
#endif
+struct input_code input_code_list[] = {
+ {"EUC-JP", 0, 0, 0, {0, 0, 0}, e_status, e_iconv, 0},
+ {"Shift_JIS", 0, 0, 0, {0, 0, 0}, s_status, s_iconv, 0},
+ {"UTF-8", 0, 0, 0, {0, 0, 0}, w_status, w_iconv, 0},
+ {"UTF-16", 0, 0, 0, {0, 0, 0}, w16_status, w_iconv16, 0},
+ {0}
+};
+
static int mimeout_mode = 0;
static int base64_count = 0;
#endif
for (argc--,argv++; (argc > 0) && **argv == '-'; argc--, argv++) {
- cp = *argv;
+ cp = (unsigned char *)*argv;
options(cp);
+#ifdef EXEC_IO
+ if (exec_f){
+ int fds[2], pid;
+ if (pipe(fds) < 0 || (pid = fork()) < 0){
+ abort();
+ }
+ if (pid == 0){
+ if (exec_f > 0){
+ close(fds[0]);
+ dup2(fds[1], 1);
+ }else{
+ close(fds[1]);
+ dup2(fds[0], 0);
+ }
+ execvp(argv[1], &argv[1]);
+ }
+ if (exec_f > 0){
+ close(fds[1]);
+ dup2(fds[0], 0);
+ }else{
+ close(fds[0]);
+ dup2(fds[1], 1);
+ }
+ argc = 0;
+ break;
+ }
+#endif
}
if(x0201_f == WISH_TRUE)
x0201_f = ((!iso2022jp_f)? TRUE : NO_X0201);
#ifdef OVERWRITE
if (overwrite) {
struct stat sb;
-#ifdef MSDOS
+#if defined(MSDOS) && !defined(__MINGW32__)
time_t tb[2];
#else
struct utimbuf tb;
if (chmod(outfname, sb.st_mode)) {
fprintf(stderr, "Can't set permission %s\n", outfname);
}
-#ifdef MSDOS
- tb[0] = tb[1] = sb.st_mtime;
+
/* \e$B%?%$%`%9%?%s%W$rI|85\e(B */
+#if defined(MSDOS) && !defined(__MINGW32__)
+ tb[0] = tb[1] = sb.st_mtime;
if (utime(outfname, tb)) {
fprintf(stderr, "Can't set timestamp %s\n", outfname);
}
-
- if (unlink(origfname)){
- perror(origfname);
- }
#else
tb.actime = sb.st_atime;
tb.modtime = sb.st_mtime;
- /* \e$B%?%$%`%9%?%s%W$rI|85\e(B */
if (utime(outfname, &tb)) {
fprintf(stderr, "Can't set timestamp %s\n", outfname);
}
#endif
+#ifdef MSDOS
+ if (unlink(origfname)){
+ perror(origfname);
+ }
+#endif
if (rename(outfname, origfname)) {
perror(origfname);
fprintf(stderr, "Can't rename %s to %s\n",
static
struct {
- unsigned char *name;
- unsigned char *alias;
+ char *name;
+ char *alias;
} long_option[] = {
{"base64","jMB"},
{"euc","e"},
{"utf8-input", "W"},
{"utf16-input", "W16"},
#endif
-#ifdef CAP_URL_OPTION
- {"cap-input", "\0"},
- {"url-input", "\0"},
+#ifdef OVERWRITE
+ {"overwrite", ""},
+#endif
+#ifdef INPUT_OPTION
+ {"cap-input", ""},
+ {"url-input", ""},
+#endif
+#ifdef NUMCHAR_OPTION
+ {"numchar-input", ""},
#endif
#ifdef CHECK_OPTION
- {"no-output", "\0"},
- {"debug", "\0"},
+ {"no-output", ""},
+ {"debug", ""},
+#endif
+#ifdef SHIFTJIS_CP932
+ {"no-cp932", ""},
+#endif
+#ifdef EXEC_IO
+ {"exec-in", ""},
+ {"exec-out", ""},
#endif
};
static int option_mode;
void
-options(unsigned char *cp)
+options(cp)
+ unsigned char *cp;
{
int i;
unsigned char *p;
}
for (i=0;i<sizeof(long_option)/sizeof(long_option[0]);i++) {
int j;
- p = long_option[i].name;
+ p = (unsigned char *)long_option[i].name;
for (j=0;*p && *p++ == cp[j];j++);
if (! *p && !cp[j]) break;
}
if (*p) return;
- cp = long_option[i].alias;
+ cp = (unsigned char *)long_option[i].alias;
if (!*cp){
-#ifdef CAP_URL_OPTION
+#ifdef OVERWRITE
+ if (strcmp(long_option[i].name, "overwrite") == 0){
+ file_out = TRUE;
+ overwrite = TRUE;
+ continue;
+ }
+#endif
+#ifdef INPUT_OPTION
if (strcmp(long_option[i].name, "cap-input") == 0){
cap_f = TRUE;
continue;
continue;
}
#endif
+#ifdef NUMCHAR_OPTION
+ if (strcmp(long_option[i].name, "numchar-input") == 0){
+ numchar_f = TRUE;
+ continue;
+ }
+#endif
#ifdef CHECK_OPTION
if (strcmp(long_option[i].name, "no-output") == 0){
noout_f = TRUE;
continue;
}
#endif
+#ifdef SHIFTJIS_CP932
+ if (strcmp(long_option[i].name, "no-cp932") == 0){
+ cp932_f = FALSE;
+ continue;
+ }
+#endif
+#ifdef EXEC_IO
+ if (strcmp(long_option[i].name, "exec-in") == 0){
+ exec_f = 1;
+ return;
+ }
+ if (strcmp(long_option[i].name, "exec-out") == 0){
+ exec_f = -1;
+ return;
+ }
+#endif
}
continue;
case 'b': /* buffered mode */
output_conv = w_oconv16; cp+=2;
if (cp[0]=='L') {
w_oconv16_begin_f=2; cp++;
- }
- } else
- output_conv = w_oconv;
+ w_oconv16_LE = 1;
+ if (cp[0] == '0'){
+ w_oconv16_begin_f=1; cp++;
+ }
+ } else if (cp[0] == 'B') {
+ w_oconv16_begin_f=2; cp++;
+ if (cp[0] == '0'){
+ w_oconv16_begin_f=1; cp++;
+ }
+ }
+ } else
+ output_conv = w_oconv;
continue;
#endif
#ifdef UTF8_INPUT_ENABLE
if ('1'== cp[0] && '6'==cp[1]) {
input_f = UTF16_INPUT;
} else
- input_f = UTF8_INPUT;
+ input_f = UTF8_INPUT;
continue;
#endif
/* Input code assumption */
} else if (*cp=='S') {
mime_f = STRICT_MIME; cp++;
} else if (*cp=='0') {
- mime_f = FALSE;
+ mime_f = FALSE; cp++;
}
continue;
case 'M': /* MIME output */
#ifndef PERL_XS
case 'O':/* for Output file */
file_out = TRUE;
-#ifdef OVERWRITE
- if (*cp=='W') {
- overwrite = TRUE;
- cp++;
- }
-#endif
continue;
#endif
case 'c':/* add cr code */
continue;
case 'L': /* line mode */
if (*cp=='u') { /* unix */
- crmode_f = NL;
+ crmode_f = NL; cp++;
} else if (*cp=='m') { /* mac */
- crmode_f = CR;
+ crmode_f = CR; cp++;
} else if (*cp=='w') { /* windows */
- crmode_f = CRLF;
+ crmode_f = CRLF; cp++;
} else if (*cp=='0') { /* no conversion */
- crmode_f = 0;
+ crmode_f = 0; cp++;
}
continue;
case ' ':
}
}
-void set_iconv(int f, int (*iconv_func)(int c2,int c1,int c0)){
+#ifdef ANSI_C_PROTOTYPE
+struct input_code * find_inputcode_byfunc(int (*iconv_func)(int c2,int c1,int c0))
+#else
+struct input_code * find_inputcode_byfunc(iconv_func)
+ int (*iconv_func)();
+#endif
+{
+ if (iconv_func){
+ struct input_code *p = input_code_list;
+ while (p->name){
+ if (iconv_func == p->iconv_func){
+ return p;
+ }
+ p++;
+ }
+ }
+ return 0;
+}
+
+#ifdef ANSI_C_PROTOTYPE
+void set_iconv(int f, int (*iconv_func)(int c2,int c1,int c0))
+#else
+void set_iconv(f, iconv_func)
+ int f;
+ int (*iconv_func)();
+#endif
+{
#ifdef CHECK_OPTION
static int (*iconv_for_check)() = 0;
#endif
}
#ifdef CHECK_OPTION
if (estab_f && iconv_for_check != iconv){
-#ifdef UTF8_INPUT_ENABLE
- if (iconv == w_iconv) debug("UTF-8\n");
- if (iconv == w_iconv16) debug("UTF-16\n");
-#endif
- if (iconv == s_iconv) debug("Shift_JIS\n");
- if (iconv == e_iconv) debug("EUC-JP\n");
+ struct input_code *p = find_inputcode_byfunc(iconv);
+ if (p){
+ debug(input_codename = p->name);
+ }
iconv_for_check = iconv;
}
#endif
}
-void code_status(int c){
- switch (s_stat){
+#define SCORE_L2 (1) /* \e$BBh\e(B2\e$B?e=`4A;z\e(B */
+#define SCORE_KANA (SCORE_L2 << 1) /* \e$B$$$o$f$kH>3Q%+%J\e(B */
+#define SCORE_DEPEND (SCORE_KANA << 1) /* \e$B5!<o0MB8J8;z\e(B */
+#ifdef SHIFTJIS_CP932
+#define SCORE_CP932 (SCORE_DEPEND << 1) /* CP932 \e$B$K$h$kFI$_49$(\e(B */
+#define SCORE_NO_EXIST (SCORE_CP932 << 1) /* \e$BB8:_$7$J$$J8;z\e(B */
+#else
+#define SCORE_NO_EXIST (SCORE_DEPEND << 1) /* \e$BB8:_$7$J$$J8;z\e(B */
+#endif
+#define SCORE_iMIME (SCORE_NO_EXIST << 1) /* MIME \e$B$K$h$k;XDj\e(B */
+#define SCORE_ERROR (SCORE_iMIME << 1) /* \e$B%(%i!<\e(B */
+
+#define SCORE_INIT (SCORE_iMIME)
+
+int score_table_A0[] = {
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, SCORE_DEPEND, SCORE_DEPEND, SCORE_DEPEND,
+ SCORE_DEPEND, SCORE_DEPEND, SCORE_DEPEND, SCORE_NO_EXIST,
+};
+
+int score_table_F0[] = {
+ SCORE_L2, SCORE_L2, SCORE_L2, SCORE_L2,
+ SCORE_L2, SCORE_DEPEND, SCORE_NO_EXIST, SCORE_NO_EXIST,
+ SCORE_DEPEND, SCORE_DEPEND, SCORE_DEPEND, SCORE_DEPEND,
+ SCORE_DEPEND, SCORE_NO_EXIST, SCORE_NO_EXIST, SCORE_ERROR,
+};
+
+void set_code_score(ptr, score)
+ struct input_code *ptr;
+ int score;
+{
+ if (ptr){
+ ptr->score |= score;
+ }
+}
+
+void clr_code_score(ptr, score)
+ struct input_code *ptr;
+ int score;
+{
+ if (ptr){
+ ptr->score &= ~score;
+ }
+}
+
+void code_score(ptr)
+ struct input_code *ptr;
+{
+ int c2 = ptr->buf[0];
+ int c1 = ptr->buf[1];
+ if (c2 < 0){
+ set_code_score(ptr, SCORE_ERROR);
+ }else if (c2 == SSO){
+ set_code_score(ptr, SCORE_KANA);
+#ifdef UTF8_OUTPUT_ENABLE
+ }else if (!e2w_conv(c2, c1)){
+ set_code_score(ptr, SCORE_NO_EXIST);
+#endif
+ }else if ((c2 & 0x70) == 0x20){
+ set_code_score(ptr, score_table_A0[c2 & 0x0f]);
+ }else if ((c2 & 0x70) == 0x70){
+ set_code_score(ptr, score_table_F0[c2 & 0x0f]);
+ }else if ((c2 & 0x70) >= 0x50){
+ set_code_score(ptr, SCORE_L2);
+ }
+}
+
+void status_disable(ptr)
+struct input_code *ptr;
+{
+ ptr->stat = -1;
+ ptr->buf[0] = -1;
+ code_score(ptr);
+ if (iconv == ptr->iconv_func) set_iconv(FALSE, 0);
+}
+
+void status_push_ch(ptr, c)
+ struct input_code *ptr;
+ int c;
+{
+ ptr->buf[ptr->index++] = c;
+}
+
+void status_clear(ptr)
+ struct input_code *ptr;
+{
+ ptr->stat = 0;
+ ptr->index = 0;
+}
+
+void status_reset(ptr)
+ struct input_code *ptr;
+{
+ status_clear(ptr);
+ ptr->score = SCORE_INIT;
+}
+
+void status_reinit(ptr)
+ struct input_code *ptr;
+{
+ status_reset(ptr);
+ ptr->_file_stat = 0;
+}
+
+void status_check(ptr, c)
+ struct input_code *ptr;
+ int c;
+{
+ if (c <= DEL && estab_f){
+ status_reset(ptr);
+ }
+}
+
+void s_status(ptr, c)
+ struct input_code *ptr;
+ int c;
+{
+ switch(ptr->stat){
case -1:
- if (c <= DEL && estab_f){
- s_stat = 0;
- }
+ status_check(ptr, c);
break;
case 0:
- if (c <= DEL
- || (0xa1 <= c && c <= 0xef && iconv == s_iconv)){
+ if (c <= DEL){
break;
- }else if ((0x81 <= c && c < 0xa0) || (0xe0 <= c && c <= 0xea)){
- s_stat = 1;
+#ifdef NUMCHAR_OPTION
+ }else if ((c & CLASS_MASK) == CLASS_UTF16){
+ break;
+#endif
+ }else if (0xa1 <= c && c <= 0xdf){
+ status_push_ch(ptr, SSO);
+ status_push_ch(ptr, c);
+ code_score(ptr);
+ status_clear(ptr);
+ }else if ((0x81 <= c && c < 0xa0) || (0xe0 <= c && c <= 0xef)){
+ ptr->stat = 1;
+ status_push_ch(ptr, c);
+#ifdef SHIFTJIS_CP932
+ }else if (cp932_f
+ && CP932_TABLE_BEGIN <= c && c <= CP932_TABLE_END){
+ ptr->stat = 2;
+ status_push_ch(ptr, c);
+#endif /* SHIFTJIS_CP932 */
}else{
- s_stat = -1;
- if (iconv == s_iconv) set_iconv(FALSE, 0);
+ status_disable(ptr);
}
break;
case 1:
- if ((0x40 <= c && c <= 0x7e) || (0x80 <= c && c <= 0xfd)){
- s_stat = 0;
+ if ((0x40 <= c && c <= 0x7e) || (0x80 <= c && c <= 0xfc)){
+ status_push_ch(ptr, c);
+ s2e_conv(ptr->buf[0], ptr->buf[1], &ptr->buf[0], &ptr->buf[1]);
+ code_score(ptr);
+ status_clear(ptr);
}else{
- s_stat = -1;
- if (iconv == s_iconv) set_iconv(FALSE, 0);
+ status_disable(ptr);
+ }
+ break;
+#ifdef SHIFTJIS_CP932
+ case 2:
+ if ((0x40 <= c && c <= 0x7e) || (0x80 <= c && c <= 0xfc)){
+ status_push_ch(ptr, c);
+ if (s2e_conv(ptr->buf[0], ptr->buf[1], &ptr->buf[0], &ptr->buf[1]) == 0){
+ set_code_score(ptr, SCORE_CP932);
+ status_clear(ptr);
+ break;
+ }
}
+ status_disable(ptr);
break;
+#endif /* SHIFTJIS_CP932 */
}
- switch (e_stat){
+}
+
+void e_status(ptr, c)
+ struct input_code *ptr;
+ int c;
+{
+ switch (ptr->stat){
case -1:
- if (c <= DEL && estab_f){
- e_stat = 0;
- }
+ status_check(ptr, c);
break;
case 0:
if (c <= DEL){
break;
+#ifdef NUMCHAR_OPTION
+ }else if ((c & CLASS_MASK) == CLASS_UTF16){
+ break;
+#endif
}else if (SSO == c || (0xa1 <= c && c <= 0xfe)){
- e_stat = 1;
+ ptr->stat = 1;
+ status_push_ch(ptr, c);
}else{
- e_stat = -1;
- if (iconv == e_iconv) set_iconv(FALSE, 0);
+ status_disable(ptr);
}
break;
case 1:
if (0xa1 <= c && c <= 0xfe){
- e_stat = 0;
+ status_push_ch(ptr, c);
+ code_score(ptr);
+ status_clear(ptr);
}else{
- e_stat = -1;
- if (iconv == e_iconv) set_iconv(FALSE, 0);
+ status_disable(ptr);
}
break;
}
+}
+
#ifdef UTF8_INPUT_ENABLE
- switch (w_stat){
+void w16_status(ptr, c)
+ struct input_code *ptr;
+ int c;
+{
+ switch (ptr->stat){
case -1:
- if (c <= DEL && estab_f){
- w_stat = 0;
+ break;
+ case 0:
+ if (ptr->_file_stat == 0){
+ if (c == 0xfe || c == 0xff){
+ ptr->stat = c;
+ status_push_ch(ptr, c);
+ ptr->_file_stat = 1;
+ }else{
+ status_disable(ptr);
+ ptr->_file_stat = -1;
+ }
+ }else if (ptr->_file_stat > 0){
+ ptr->stat = 1;
+ status_push_ch(ptr, c);
+ }else if (ptr->_file_stat < 0){
+ status_disable(ptr);
+ }
+ break;
+
+ case 1:
+ if (c == EOF){
+ status_disable(ptr);
+ ptr->_file_stat = -1;
+ }else{
+ status_push_ch(ptr, c);
+ status_clear(ptr);
+ }
+ break;
+
+ case 0xfe:
+ case 0xff:
+ if (ptr->stat != c && (c == 0xfe || c == 0xff)){
+ status_push_ch(ptr, c);
+ status_clear(ptr);
+ }else{
+ status_disable(ptr);
+ ptr->_file_stat = -1;
}
break;
+ }
+}
+
+void w_status(ptr, c)
+ struct input_code *ptr;
+ int c;
+{
+ switch (ptr->stat){
+ case -1:
+ status_check(ptr, c);
+ break;
case 0:
if (c <= DEL){
break;
+#ifdef NUMCHAR_OPTION
+ }else if ((c & CLASS_MASK) == CLASS_UTF16){
+ break;
+#endif
}else if (0xc0 <= c && c <= 0xdf){
- w_stat = 1;
+ ptr->stat = 1;
+ status_push_ch(ptr, c);
}else if (0xe0 <= c && c <= 0xef){
- w_stat = 2;
+ ptr->stat = 2;
+ status_push_ch(ptr, c);
}else{
- w_stat = -1;
- if (iconv == w_iconv) set_iconv(FALSE, 0);
+ status_disable(ptr);
}
break;
case 1:
case 2:
if (0x80 <= c && c <= 0xbf){
- --w_stat;
+ status_push_ch(ptr, c);
+ if (ptr->index > ptr->stat){
+ w2e_conv(ptr->buf[0], ptr->buf[1], ptr->buf[2],
+ &ptr->buf[0], &ptr->buf[1]);
+ code_score(ptr);
+ status_clear(ptr);
+ }
}else{
- w_stat = -1;
- if (iconv == w_iconv) set_iconv(FALSE, 0);
+ status_disable(ptr);
}
break;
}
-
- if (s_stat < 0 && e_stat < 0 && w_stat == 0){
- set_iconv(TRUE, w_iconv);
- }
+}
#endif
- if (s_stat == 0 && e_stat < 0 && w_stat < 0){
- set_iconv(TRUE, s_iconv);
- }
- if (s_stat < 0 && e_stat == 0 && w_stat < 0){
- set_iconv(TRUE, e_iconv);
+
+void
+code_status(c)
+ int c;
+{
+ int action_flag = 1;
+ struct input_code *result = 0;
+ struct input_code *p = input_code_list;
+ while (p->name){
+ (p->status_func)(p, c);
+ if (p->stat > 0){
+ action_flag = 0;
+ }else if(p->stat == 0){
+ if (result){
+ action_flag = 0;
+ }else{
+ result = p;
+ }
+ }
+ ++p;
}
- if (s_stat < 0 && e_stat < 0 && w_stat < 0){
- if (c <= DEL){
- s_stat = e_stat = 0;
-#ifdef UTF8_INPUT_ENABLE
- w_stat = 0;
-#endif
+
+ if (action_flag){
+ if (result && !estab_f){
+ set_iconv(TRUE, result->iconv_func);
+ }else if (c <= DEL){
+ struct input_code *ptr = input_code_list;
+ while (ptr->name){
+ status_reset(ptr);
+ ++ptr;
+ }
}
}
}
+#ifdef PERL_XS
+#define STD_GC_BUFSIZE (256)
+int std_gc_buf[STD_GC_BUFSIZE];
+int std_gc_ndx;
+#endif
+
int
std_getc(f)
FILE *f;
{
+#ifdef PERL_XS
+ if (std_gc_ndx){
+ return std_gc_buf[--std_gc_ndx];
+ }
+#endif
return getc(f);
}
int c;
FILE *f;
{
+#ifdef PERL_XS
+ if (std_gc_ndx == STD_GC_BUFSIZE){
+ return EOF;
+ }
+ std_gc_buf[std_gc_ndx++] = c;
+ return c;
+#endif
return ungetc(c,f);
}
std_putc(c)
int c;
{
- putchar(c);
+ if(c!=EOF)
+ putchar(c);
}
int
}
i_getc = std_getc;
+ i_ungetc = std_ungetc;
/* input redicrection */
-#ifdef CAP_URL_OPTION
+#ifdef INPUT_OPTION
if (cap_f){
i_cgetc = i_getc; i_getc = cap_getc;
i_cungetc = i_ungetc; i_ungetc= cap_ungetc;
i_uungetc = i_ungetc; i_ungetc= url_ungetc;
}
#endif
+#ifdef NUMCHAR_OPTION
+ if (numchar_f){
+ i_ngetc = i_getc; i_getc = numchar_getc;
+ i_nungetc = i_ungetc; i_ungetc= numchar_ungetc;
+ }
+#endif
if (mime_f && mimebuf_f==FIXED_MIME) {
i_mgetc = i_getc; i_getc = mime_getc;
i_mungetc = i_ungetc; i_ungetc = mime_ungetc;
set_iconv(FALSE, e_iconv);
}
- e_stat = 0;
- s_stat = 0;
-#ifdef UTF8_INPUT_ENABLE
- w_stat = 0;
-#else
- w_stat = -1;
-#endif
+ {
+ struct input_code *p = input_code_list;
+ while (p->name){
+ status_reinit(p++);
+ }
+ }
}
/*
SEND;
} else {
/* first byte */
- if (iconv == w_iconv16) {
+ if (
+#ifdef UTF8_INPUT_ENABLE
+ iconv == w_iconv16
+#else
+ 0
+#endif
+ ) {
c2 = c1;
c1 = (*i_getc)(f);
SEND;
+#ifdef NUMCHAR_OPTION
+ } else if ((c1 & CLASS_MASK) == CLASS_UTF16){
+ SEND;
+#endif
} else if (c1 > DEL) {
/* 8 bit code */
if (!estab_f && !iso8859_f) {
/* This is kanji introduction */
input_mode = X0208;
shift_mode = FALSE;
+ debug(input_codename = "ISO-2022-JP");
NEXT;
} else if (c1 == '(') {
if ((c1 = (*i_getc)(f)) == EOF) {
}
}
+ if (!estab_f){
+ struct input_code *p = input_code_list;
+ struct input_code *result = p;
+ if (c1 == EOF){
+ code_status(c1);
+ }
+ while (p->name){
+ if (p->score < result->score){
+ result = p;
+ }
+ ++p;
+ }
+ set_iconv(FALSE, result->iconv_func);
+ }
+
+
/** now,
** 1) EOF is detected, or
** 2) Code is established, or
** Kanji codes by oconv and leave estab_f unchanged.
**/
+ c3=c1;
wc = 0;
while (wc < hold_count){
c2 = hold_buf[wc++];
- if (c2 <= DEL){
+ if (c2 <= DEL
+#ifdef NUMCHAR_OPTION
+ || (c2 & CLASS_MASK) == CLASS_UTF16
+#endif
+ ){
(*iconv)(0, c2, 0);
continue;
}else if (iconv == s_iconv && 0xa1 <= c2 && c2 <= 0xdf){
c1 = hold_buf[wc++];
}else{
c1 = (*i_getc)(f);
- if (c1 == EOF) break;
+ if (c1 == EOF){
+ c3 = EOF;
+ break;
+ }
code_status(c1);
}
if ((*iconv)(c2, c1, 0) < 0){
c0 = hold_buf[wc++];
}else{
c0 = (*i_getc)(f);
- if (c0 == EOF) break;
+ if (c0 == EOF){
+ c3 = EOF;
+ break;
+ }
code_status(c0);
}
(*iconv)(c2, c1, c0);
c1 = c0;
}
}
- c3=c1;
return c3;
}
return ((hold_count >= HOLD_SIZE*2) ? EOF : hold_count);
}
+int s2e_conv(c2, c1, p2, p1)
+ int c2, c1;
+ int *p2, *p1;
+{
+#ifdef SHIFTJIS_CP932
+ if (cp932_f && CP932_TABLE_BEGIN <= c2 && c2 <= CP932_TABLE_END){
+ extern unsigned short shiftjis_cp932[3][189];
+ c1 = shiftjis_cp932[c2 - CP932_TABLE_BEGIN][c1 - 0x40];
+ if (c1 == 0) return 1;
+ c2 = c1 >> 8;
+ c1 &= 0xff;
+ }
+#endif /* SHIFTJIS_CP932 */
+ c2 = c2 + c2 - ((c2 <= 0x9f) ? SJ0162 : SJ6394);
+ if (c1 < 0x9f)
+ c1 = c1 - ((c1 > DEL) ? SPACE : 0x1f);
+ else {
+ c1 = c1 - 0x7e;
+ c2++;
+ }
+ if (p2) *p2 = c2;
+ if (p1) *p1 = c1;
+ return 0;
+}
+
int
s_iconv(c2, c1, c0)
int c2,
} else if ((c2 == EOF) || (c2 == 0) || c2 < SPACE) {
/* NOP */
} else {
- c2 = c2 + c2 - ((c2 <= 0x9f) ? SJ0162 : SJ6394);
- if (c1 < 0x9f)
- c1 = c1 - ((c1 > DEL) ? SPACE : 0x1f);
- else {
- c1 = c1 - 0x7e;
- c2++;
- }
+ int ret = s2e_conv(c2, c1, &c2, &c1);
+ if (ret) return ret;
}
(*oconv)(c2, c1);
return 0;
{
if (c2 == X0201) {
c1 &= 0x7f;
+ } else if (c2 == SSO){
+ c2 = X0201;
+ c1 &= 0x7f;
} else if ((c2 == EOF) || (c2 == 0) || c2 < SPACE) {
/* NOP */
} else {
#ifdef UTF8_INPUT_ENABLE
int
-w_iconv(c2, c1, c0)
+w2e_conv(c2, c1, c0, p2, p1)
int c2, c1, c0;
+ int *p2, *p1;
{
extern unsigned short * utf8_to_euc_2bytes[];
extern unsigned short ** utf8_to_euc_3bytes[];
+ int ret = 0;
if (0xc0 <= c2 && c2 <= 0xef) {
unsigned short **pp;
- if (0xe0 <= c2){
+ if (0xe0 <= c2) {
if (c0 == 0) return -1;
- if (!(0<=c2-0x80 && c2-0x80 <sizeof_utf8_to_euc_3bytes)) return -1;
- pp = utf8_to_euc_3bytes[c2 - 0x80];
- } else {
- pp = utf8_to_euc_2bytes;
- c0 = c1;
- c1 = c2;
- }
- return w_iconv_common(c2, c1, c0,pp);
+ pp = utf8_to_euc_3bytes[c2 - 0x80];
+ ret = w_iconv_common(c1, c0, pp, sizeof_utf8_to_euc_C2, p2, p1);
+ } else {
+ ret = w_iconv_common(c2, c1, utf8_to_euc_2bytes, sizeof_utf8_to_euc_2bytes, p2, p1);
+ }
+#ifdef NUMCHAR_OPTION
+ if (ret){
+ c1 = CLASS_UTF16 | ww16_conv(c2, c1, c0);
+ c2 = 0;
+ ret = 0;
+ }
+#endif
+ return ret;
} else if (c2 == X0201) {
c1 &= 0x7f;
}
- (*oconv)(c2, c1);
- return 0;
+ if (p2) *p2 = c2;
+ if (p1) *p1 = c1;
+ return ret;
}
int
-w_iconv16(c2, c1, c0)
- int c2, c1,c0;
+w_iconv(c2, c1, c0)
+ int c2,
+ c1, c0;
+{
+ int ret = w2e_conv(c2, c1, c0, &c2, &c1);
+ if (ret == 0){
+ (*oconv)(c2, c1);
+ }
+ return ret;
+}
+
+void
+w16w_conv(val, p2, p1, p0)
+ unsigned short val;
+ int *p2, *p1, *p0;
+{
+ if (val < 0x80){
+ *p2 = val;
+ *p1 = 0;
+ *p0 = 0;
+ }else if (val < 0x800){
+ *p2 = 0xc0 | (val >> 6);
+ *p1 = 0x80 | (val & 0x3f);
+ *p0 = 0;
+ }else{
+ *p2 = 0xe0 | (val >> 12);
+ *p1 = 0x80 | ((val >> 6) & 0x3f);
+ *p0 = 0x80 | (val & 0x3f);
+ }
+}
+
+int
+ww16_conv(c2, c1, c0)
+ int c2, c1, c0;
+{
+ unsigned short val;
+ if (c2 >= 0xe0){
+ val = (c2 & 0x0f) << 12;
+ val |= (c1 & 0x3f) << 6;
+ val |= (c0 & 0x3f);
+ }else if (c2 >= 0xc0){
+ val = (c2 & 0x1f) << 6;
+ val |= (c1 & 0x3f) << 6;
+ }else{
+ val = c2;
+ }
+ return val;
+}
+
+int
+w16e_conv(val, p2, p1)
+ unsigned short val;
+ int *p2, *p1;
{
extern unsigned short * utf8_to_euc_2bytes[];
extern unsigned short ** utf8_to_euc_3bytes[];
+ int c2, c1, c0;
unsigned short **pp;
- unsigned short val;
+ int psize;
+ int ret = 0;
+
+ w16w_conv(val, &c2, &c1, &c0);
+ if (c1){
+ if (c0){
+ pp = utf8_to_euc_3bytes[c2 - 0x80];
+ psize = sizeof_utf8_to_euc_C2;
+ ret = w_iconv_common(c1, c0, pp, psize, p2, p1);
+ }else{
+ pp = utf8_to_euc_2bytes;
+ psize = sizeof_utf8_to_euc_2bytes;
+ ret = w_iconv_common(c2, c1, pp, psize, p2, p1);
+ }
+#ifdef NUMCHAR_OPTION
+ if (ret){
+ *p2 = 0;
+ *p1 = CLASS_UTF16 | val;
+ ret = 0;
+ }
+#endif
+ }
+ return ret;
+}
+
+int
+w_iconv16(c2, c1, c0)
+ int c2, c1,c0;
+{
+ int ret;
if (c2==0376 && c1==0377){
utf16_mode = UTF16_INPUT;
int tmp;
tmp=c1; c1=c2; c2=tmp;
}
- if (c2==0 || c2==EOF) {
+ if ((c2==0 && c1 < 0x80) || c2==EOF) {
(*oconv)(c2, c1);
return 0;
}
- val = ((c2<<8)&0xff00) + c1;
- if (c2 < 0x8){
- c0 = (0x80 | (c1 & 0x3f));
- c1 = (0xc0 | (val >> 6));
- pp = utf8_to_euc_2bytes;
- }else{
- c0 = (0x80 | (c1 & 0x3f));
- c2 = (0xe0 | (val >> 12));
- c1 = (0x80 | ((val >> 6) & 0x3f));
- if (c0 == 0) return -1;
- if (0<=c2-0x80 && c2-0x80 <sizeof_utf8_to_euc_3bytes)
- pp = utf8_to_euc_3bytes[c2 - 0x80];
- else
- return 0;
- }
- return w_iconv_common(c2, c1, c0,pp);
+ ret = w16e_conv(((c2<<8)&0xff00) + c1, &c2, &c1);
+ if (ret) return ret;
+ (*oconv)(c2, c1);
+ return 0;
}
int
-w_iconv_common(c2, c1, c0,pp)
- int c2, c1,c0;
+w_iconv_common(c1, c0, pp, psize, p2, p1)
+ int c1,c0;
unsigned short **pp;
+ int psize;
+ int *p2, *p1;
{
+ int c2;
unsigned short *p ;
unsigned short val;
if (pp == 0) return 1;
- if (!(0<=c1-0x80 && c1-0x80 <sizeof_utf8_to_euc_C2)) return -1;
- p = pp[c1 - 0x80];
+
+ c1 -= 0x80;
+ if (c1 < 0 || psize <= c1) return 1;
+ p = pp[c1];
if (p == 0) return 1;
- if (!(0<=c0-0x80 && c0-0x80 <sizeof_utf8_to_euc_E5B8)) return -1;
- val = p[c0 - 0x80];
- if (val ==0 ) return 1;
+
+ c0 -= 0x80;
+ if (c0 < 0 || sizeof_utf8_to_euc_E5B8 <= c0) return 1;
+ val = p[c0];
+ if (val == 0) return 1;
+
c2 = val >> 8;
if (c2 == SO) c2 = X0201;
c1 = val & 0x7f;
- (*oconv)(c2, c1);
+ if (p2) *p2 = c2;
+ if (p1) *p1 = c1;
return 0;
}
c1 = (c1 & 0x7f) - 0x21;
if (0<=c1 && c1<sizeof_euc_to_utf8_1byte)
return p[c1];
+ return 0;
}
void
int c2,
c1;
{
+ int c0;
+#ifdef NUMCHAR_OPTION
+ if (c2 == 0 && (c1 & CLASS_MASK) == CLASS_UTF16){
+ w16w_conv(c1, &c2, &c1, &c0);
+ (*o_putc)(c2);
+ if (c1){
+ (*o_putc)(c1);
+ if (c0) (*o_putc)(c0);
+ }
+ }
+#endif
if (c2 == EOF) {
+ (*o_putc)(EOF);
return;
} else if (c2 == 0) {
output_mode = ASCII;
output_mode = ISO8859_1;
(*o_putc)(c1 | 0x080);
} else {
- unsigned short val = (unsigned short)e2w_conv(c2, c1);
output_mode = UTF8;
-
- if (0 < val && val < 0x80){
- (*o_putc)(val);
- }else if (val < 0x800){
- (*o_putc)(0xc0 | (val >> 6));
- (*o_putc)(0x80 | (val & 0x3f));
- }else{
- (*o_putc)(0xe0 | (val >> 12));
- (*o_putc)(0x80 | ((val >> 6) & 0x3f));
- (*o_putc)(0x80 | (val & 0x3f));
- }
+ w16w_conv((unsigned short)e2w_conv(c2, c1), &c2, &c1, &c0);
+ (*o_putc)(c2);
+ if (c1){
+ (*o_putc)(c1);
+ if (c0) (*o_putc)(c0);
+ }
}
}
int c2,
c1;
{
-
+ if (c2 == EOF) {
+ (*o_putc)(EOF);
+ return;
+ }
+
if (w_oconv16_begin_f==2) {
- (*o_putc)('\376');
- (*o_putc)('\377');
+ if (w_oconv16_LE){
+ (*o_putc)((unsigned char)'\377');
+ (*o_putc)('\376');
+ }else{
+ (*o_putc)('\376');
+ (*o_putc)((unsigned char)'\377');
+ }
w_oconv16_begin_f=1;
}
- if (c2 == EOF) {
- return;
- } else if (c2 == 0) {
- (*o_putc)(0);
- (*o_putc)(c1);
- } else if (c2 == ISO8859_1) {
- (*o_putc)(0);
- (*o_putc)(c1 | 0x080);
- } else {
+
+ if (c2 == ISO8859_1) {
+ c2 = 0;
+ c1 |= 0x80;
+#ifdef NUMCHAR_OPTION
+ } else if (c2 == 0 && (c1 & CLASS_MASK) == CLASS_UTF16) {
+ c2 = (c1 >> 8) & 0xff;
+ c1 &= 0xff;
+#endif
+ } else if (c2) {
unsigned short val = (unsigned short)e2w_conv(c2, c1);
- (*o_putc)((val&0xff00)>>8);
- (*o_putc)(val&0xff);
+ c2 = (val >> 8) & 0xff;
+ c1 = val & 0xff;
+ }
+ if (w_oconv16_LE){
+ (*o_putc)(c1);
+ (*o_putc)(c2);
+ }else{
+ (*o_putc)(c2);
+ (*o_putc)(c1);
}
}
int c2,
c1;
{
+#ifdef NUMCHAR_OPTION
+ if (c2 == 0 && (c1 & CLASS_MASK) == CLASS_UTF16){
+ w16e_conv(c1, &c2, &c1);
+ }
+#endif
if (c2 == EOF) {
+ (*o_putc)(EOF);
return;
} else if (c2 == 0) {
output_mode = ASCII;
output_mode = ISO8859_1;
(*o_putc)(c1 | 0x080);
} else {
- if ((c1<0x20 || 0x7e<c1) ||
- (c2<0x20 || 0x7e<c2)) {
+ if ((c1<0x21 || 0x7e<c1) ||
+ (c2<0x21 || 0x7e<c2)) {
set_iconv(FALSE, 0);
return; /* too late to rescue this char */
}
}
}
-
+void
+e2s_conv(c2, c1, p2, p1)
+ int c2, c1, *p2, *p1;
+{
+ if (p2) *p2 = ((c2 - 1) >> 1) + ((c2 <= 0x5e) ? 0x71 : 0xb1);
+ if (p1) *p1 = c1 + ((c2 & 1) ? ((c1 < 0x60) ? 0x1f : 0x20) : 0x7e);
+}
void
s_oconv(c2, c1)
int c2,
c1;
{
+#ifdef NUMCHAR_OPTION
+ if (c2 == 0 && (c1 & CLASS_MASK) == CLASS_UTF16){
+ w16e_conv(c1, &c2, &c1);
+ }
+#endif
if (c2 == EOF) {
+ (*o_putc)(EOF);
return;
} else if (c2 == 0) {
output_mode = ASCII;
return; /* too late to rescue this char */
}
output_mode = SHIFT_JIS;
- (*o_putc)((((c2 - 1) >> 1) + ((c2 <= 0x5e) ? 0x71 : 0xb1)));
- (*o_putc)((c1 + ((c2 & 1) ? ((c1 < 0x60) ? 0x1f : 0x20) : 0x7e)));
+ e2s_conv(c2, c1, &c2, &c1);
+ (*o_putc)(c2);
+ (*o_putc)(c1);
}
}
int c2,
c1;
{
+#ifdef NUMCHAR_OPTION
+ if ((c1 & CLASS_MASK) == CLASS_UTF16){
+ w16e_conv(c1, &c2, &c1);
+ }
+#endif
if (c2 == EOF) {
if (output_mode !=ASCII && output_mode!=ISO8859_1) {
(*o_putc)(ESC);
(*o_putc)(ascii_intro);
output_mode = ASCII;
}
+ (*o_putc)(EOF);
} else if (c2==X0201) {
if (output_mode!=X0201) {
output_mode = X0201;
} else if (base64_count>66 && mimeout_mode) {
(*o_base64conv)(EOF,0);
(*o_putc)(NL);
- (*o_putc)(' ');
+ (*o_putc)('\t'); base64_count += 7;
}
(*o_base64conv)(c2,c1);
}
int prev0;
int fold_state=0;
- if (c1== '\r') {
- fold_state=0; /* ignroe cr */
+ if (c1== '\r' && !fold_preserve_f) {
+ fold_state=0; /* ignore cr */
+ }else if (c1== '\n'&&f_prev=='\r' && fold_preserve_f) {
+ f_prev = '\n';
+ fold_state=0; /* ignore cr */
} else if (c1== BS) {
if (f_line>0) f_line--;
fold_state = 1;
} else if (c2==EOF && f_line != 0) { /* close open last line */
fold_state = '\n';
- } else if (c1=='\n') {
+ } else if ((c1=='\n' && !fold_preserve_f)
+ || ((c1=='\r'||(c1=='\n'&&f_prev!='\r'))
+ && fold_preserve_f)) {
/* new line */
if (fold_preserve_f) {
- f_line = 0;
- fold_state = '\r';
- } else if (f_prev == c1) { /* duplicate newline */
+ f_prev = c1;
+ f_line = 0;
+ fold_state = '\r';
+ } else if ((f_prev == c1 && !fold_preserve_f)
+ || (f_prev == '\n' && fold_preserve_f)
+ ) { /* duplicate newline */
if (f_line) {
f_line = 0;
fold_state = '\n'; /* output two newline */
(unsigned char *)"\075?EUC-JP?B?",
(unsigned char *)"\075?SHIFT_JIS?B?",
(unsigned char *)"\075?ISO-8859-1?Q?",
+ (unsigned char *)"\075?ISO-8859-1?B?",
(unsigned char *)"\075?ISO-2022-JP?B?",
(unsigned char *)"\075?ISO-2022-JP?Q?",
#if defined(UTF8_INPUT_ENABLE) || defined(UTF8_OUTPUT_ENABLE)
(unsigned char *)"\075?UTF-8?B?",
#endif
+ (unsigned char *)"\075?US-ASCII?Q?",
NULL
};
+
+/* \e$B3:Ev$9$k%3!<%I$NM%@hEY$r>e$2$k$?$a$NL\0u\e(B */
+int (*mime_priority_func[])PROTO((int c2, int c1, int c0)) = {
+ e_iconv, s_iconv, 0, 0, 0, 0,
+#if defined(UTF8_INPUT_ENABLE) || defined(UTF8_OUTPUT_ENABLE)
+ w_iconv,
+#endif
+ 0,
+};
+
int mime_encode[] = {
- JAPANESE_EUC, SHIFT_JIS,ISO8859_1, X0208, X0201,
+ JAPANESE_EUC, SHIFT_JIS,ISO8859_1, ISO8859_1, X0208, X0201,
#if defined(UTF8_INPUT_ENABLE) || defined(UTF8_OUTPUT_ENABLE)
UTF8,
#endif
+ ASCII,
0
};
int mime_encode_method[] = {
- 'B', 'B','Q', 'B', 'Q',
+ 'B', 'B','Q', 'B', 'B', 'Q',
#if defined(UTF8_INPUT_ENABLE) || defined(UTF8_OUTPUT_ENABLE)
'B',
#endif
+ 'Q',
0
};
/* I don't trust portablity of toupper */
#define nkf_toupper(c) (('a'<=c && c<='z')?(c-('a'-'A')):c)
+#define nkf_isdigit(c) ('0'<=c && c<='9')
+#define nkf_isxdigit(c) (nkf_isdigit(c) || ('a'<=c && c<='f') || ('A'<=c && c <= 'F'))
void
switch_mime_getc()
}
}
mime_decode_mode = p[i-2];
+
+ clr_code_score(find_inputcode_byfunc(mime_priority_func[j]), SCORE_iMIME);
+
if (mime_decode_mode=='B') {
mimebuf_f = unbuf_f;
if (!unbuf_f) {
char *str;
{
if (debug_f){
- fputs(str, stderr);
+ fprintf(stderr, "%s\n", str);
}
}
#endif
-#ifdef CAP_URL_OPTION
int
hex2bin(x)
int x;
{
- if (isdigit(x)) return x - '0';
+ if (nkf_isdigit(x)) return x - '0';
return nkf_toupper(x) - 'A' + 10;
}
+#ifdef INPUT_OPTION
+
+#ifdef ANSI_C_PROTOTYPE
+int hex_getc(int ch, FILE *f, int (*g)(FILE *f), int (*u)(int c, FILE *f))
+#else
int
hex_getc(ch, f, g, u)
int ch;
FILE *f;
- int (*g)(FILE *f);
- int (*u)(int c, FILE *f);
+ int (*g)();
+ int (*u)();
+#endif
{
int c1, c2, c3;
c1 = (*g)(f);
return c1;
}
c2 = (*g)(f);
- if (!isxdigit(c2) == EOF){
+ if (!nkf_isxdigit(c2)){
(*u)(c2, f);
return c1;
}
c3 = (*g)(f);
- if (!isxdigit(c3) == EOF){
+ if (!nkf_isxdigit(c3)){
(*u)(c2, f);
(*u)(c3, f);
return c1;
}
#endif
+#ifdef NUMCHAR_OPTION
+int
+numchar_getc(f)
+ FILE *f;
+{
+ int (*g)() = i_ngetc;
+ int (*u)() = i_nungetc;
+ int i = 0, j;
+ int buf[8];
+ long c = -1;
+
+ buf[i] = (*g)(f);
+ if (buf[i] == '&'){
+ buf[++i] = (*g)(f);
+ if (buf[i] == '#'){
+ c = 0;
+ buf[++i] = (*g)(f);
+ if (buf[i] == 'x' || buf[i] == 'X'){
+ for (j = 0; j < 5; j++){
+ buf[++i] = (*g)(f);
+ if (!nkf_isxdigit(buf[i])){
+ if (buf[i] != ';'){
+ c = -1;
+ }
+ break;
+ }
+ c <<= 4;
+ c |= hex2bin(buf[i]);
+ }
+ }else{
+ for (j = 0; j < 6; j++){
+ if (j){
+ buf[++i] = (*g)(f);
+ }
+ if (!nkf_isdigit(buf[i])){
+ if (buf[i] != ';'){
+ c = -1;
+ }
+ break;
+ }
+ c *= 10;
+ c += hex2bin(buf[i]);
+ }
+ }
+ }
+ }
+ if (c != -1){
+ return CLASS_UTF16 | c;
+ }
+ while (i > 0){
+ (*u)(buf[i], f);
+ --i;
+ }
+ return buf[0];
+}
+
+int
+numchar_ungetc(c, f)
+ int c;
+ FILE *f;
+{
+ return (*i_nungetc)(c, f);
+}
+#endif
+
int
mime_getc(f)
open_mime(mode)
int mode;
{
- char *p;
+ unsigned char *p;
int i;
p = mime_pattern[0];
for(i=0;mime_encode[i];i++) {
option_mode = 0;
crmode_f = 0;
- e_stat = 0;
- s_stat = 0;
-#ifdef UTF8_INPUT_ENABLE
- w_stat = 0;
-#else
- w_stat = -1;
-#endif
+ {
+ struct input_code *p = input_code_list;
+ while (p->name){
+ status_reinit(p++);
+ }
+ }
#ifdef UTF8_OUTPUT_ENABLE
if (w_oconv16_begin_f) {
w_oconv16_begin_f = 2;
broken_last = 0;
z_prev2=0,z_prev1=0;
+ input_codename = "";
}
#endif
fprintf(stderr,"long name options\n");
fprintf(stderr," --fj,--unix,--mac,--windows convert for the system\n");
fprintf(stderr," --jis,--euc,--sjis,--utf8,--utf16,--mime,--base64 convert for the code\n");
+#ifdef OVERWRITE
+ fprintf(stderr," --overwrite Overwrite original listed files by filtered result\n");
+#endif
fprintf(stderr," --help,--version\n");
version();
}
version()
{
fprintf(stderr,"Network Kanji Filter Version %s (%s) "
-#if defined(MSDOS) && !defined(_Windows)
+#if defined(MSDOS) && !defined(__WIN32__) && !defined(__WIN16__)
"for DOS"
#endif
-#if !defined(__WIN32__) && defined(_Windows)
+#if defined(MSDOS) && defined(__WIN16__)
"for Win16"
#endif
-#if defined(__WIN32__) && defined(_Windows)
+#if defined(MSDOS) && defined(__WIN32__)
"for Win32"
#endif
#ifdef __OS2__
** kono@ie.u-ryukyu.ac.jp (Shinji Kono)
** GHG00637@nifty-serve.or.jp (COW)
**
- ** \e$B:G=*99?7F|\e(B
- ** 2002.9.24
**/
/* end */