** E-Mail: furukawa@tcp-ip.or.jp
** \e$B$^$G8fO"Mm$r$*4j$$$7$^$9!#\e(B
***********************************************************************/
+/* $Id: nkf.c,v 1.43 2004/11/21 00:46:53 rei_furukawa Exp $ */
+#define NKF_VERSION "2.0.4"
+#define NKF_RELEASE_DATE "2004-11-15"
#include "config.h"
static char *CopyRight =
- "Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa),2000 S. Kono, COW, 2002 Kono, Furukawa";
-static char *Version =
- "2.0";
-static char *Patchlevel =
- "1/0209/Shinji Kono";
+ "Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa),2000 S. Kono, COW, 2002-2004 Kono, Furukawa";
+
/*
**
** USAGE: nkf [flags] [file]
**
** Flags:
-** b Output is bufferred (DEFAULT)
-** u Output is unbufferred
+** b Output is buffered (DEFAULT)
+** u Output is unbuffered
**
** t no operation
**
**
**/
-#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
#endif
#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 <string.h>
#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 UTF8 12
#define UTF8_INPUT 13
-#define UTF16_INPUT 14
+#define UTF16LE_INPUT 14
#define UTF16BE_INPUT 15
#define WISH_TRUE 15
/* ASCII CODE */
#define BS 0x08
+#define TAB 0x09
#define NL 0x0a
#define CR 0x0d
#define ESC 0x1b
#define SI 0x0f
#define SO 0x0e
#define SSO 0x8e
+#define SS3 0x8f
#define is_alnum(c) \
(('a'<=c && c<='z')||('A'<= c && c<='Z')||('0'<=c && c<='9'))
#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 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_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 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));
#endif
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 unicode_bom_f= 0; /* Output Unicode BOM */
+static int w_oconv16_LE = 0; /* utf-16 little endian */
+static int ms_ucs_map_f = FALSE; /* Microsoft UCS Mapping Compatible */
#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 (*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 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 void debug PROTO((char *str));
#endif
-static int e_stat = 0;
-static int s_stat = 0;
+static int guess_f = FALSE;
+STATIC void print_guessed_code PROTO((char *filename));
+STATIC void set_input_codename PROTO((char *codename));
+static int is_inputcode_mixed = FALSE;
+static int is_inputcode_set = FALSE;
+
+#ifdef EXEC_IO
+static int exec_f = 0;
+#endif
+
+#ifdef SHIFTJIS_CP932
+STATIC int cp932_f = TRUE;
+#define CP932_TABLE_BEGIN (0xfa)
+#define CP932_TABLE_END (0xfc)
+
+STATIC int cp932inv_f = FALSE;
+#define CP932INV_TABLE_BEGIN (0xed)
+#define CP932INV_TABLE_END (0xee)
+
+#endif /* SHIFTJIS_CP932 */
+
+STATIC unsigned char prefix_table[256];
+
+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 int utf16_mode = UTF16_INPUT;
-#else
-static int w_stat = -1;
+STATIC void w_status PROTO((struct input_code *, int));
+STATIC void w16_status PROTO((struct input_code *, int));
+static int utf16_mode = UTF16LE_INPUT;
#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;
static int fold_len = 0;
/* options */
-static unsigned char kanji_intro = DEFAULT_J,
- ascii_intro = DEFAULT_R;
+static unsigned char kanji_intro = DEFAULT_J;
+static unsigned char ascii_intro = DEFAULT_R;
/* Folding */
FILE *fin;
unsigned char *cp;
+ char *outfname;
+ char *origfname;
+
#ifdef EASYWIN /*Easy Win */
_BufferSize.y = 400;/*Set Scroll Buffer Size*/
#endif
for (argc--,argv++; (argc > 0) && **argv == '-'; argc--, 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);
setvbuffer(stdin, stdibuf, IOBUF_SIZE);
if (nop_f)
noconvert(stdin);
- else
+ else {
kanji_convert(stdin);
+ if (guess_f) print_guessed_code(NULL);
+ }
} else {
+ int nfiles = argc;
while (argc--) {
- char *outfname;
- char *origfname;
-
if ((fin = fopen((origfname = *argv++), "r")) == NULL) {
perror(*--argv);
return(-1);
setvbuffer(fin, stdibuf, IOBUF_SIZE);
if (nop_f)
noconvert(fin);
- else
+ else {
+ char *filename = NULL;
kanji_convert(fin);
+ if (nfiles > 1) filename = origfname;
+ if (guess_f) print_guessed_code(filename);
+ }
fclose(fin);
#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",
{"hiragana","h1"},
{"katakana","h2"},
{"katakana-hiragana","h3"},
+ {"guess", "g"},
#ifdef UTF8_OUTPUT_ENABLE
{"utf8", "w"},
{"utf16", "w16"},
+ {"ms-ucs-map", ""},
#endif
#ifdef UTF8_INPUT_ENABLE
{"utf8-input", "W"},
{"utf16-input", "W16"},
#endif
#ifdef OVERWRITE
- {"overwrite", "\0"},
+ {"overwrite", ""},
#endif
-#ifdef CAP_URL_OPTION
- {"cap-input", "\0"},
- {"url-input", "\0"},
+#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", ""},
+ {"cp932inv", ""},
#endif
+#ifdef EXEC_IO
+ {"exec-in", ""},
+ {"exec-out", ""},
+#endif
+ {"prefix=", ""},
};
-static int option_mode;
+static int option_mode = 0;
void
options(cp)
if (*cp++ != '-')
return;
while (*cp) {
+ if (p && !*cp) {
+ cp = p;
+ p = 0;
+ }
switch (*cp++) {
case '-': /* literal options */
if (!*cp) { /* ignore the rest of arguments */
for (i=0;i<sizeof(long_option)/sizeof(long_option[0]);i++) {
int j;
p = (unsigned char *)long_option[i].name;
- for (j=0;*p && *p++ == cp[j];j++);
- if (! *p && !cp[j]) break;
+ for (j=0;*p && (*p != '=') && *p == cp[j];p++, j++);
+ if (!*p || *p == cp[j]){
+ p = &cp[j];
+ break;
+ }
+ p = 0;
}
- if (*p) return;
+ if (p == 0) return;
cp = (unsigned char *)long_option[i].alias;
if (!*cp){
#ifdef OVERWRITE
continue;
}
#endif
-#ifdef CAP_URL_OPTION
+#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;
+ }
+ if (strcmp(long_option[i].name, "cp932inv") == 0){
+ cp932inv_f = TRUE;
+ 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
+#ifdef UTF8_OUTPUT_ENABLE
+ if (strcmp(long_option[i].name, "ms-ucs-map") == 0){
+ ms_ucs_map_f = TRUE;
+ continue;
+ }
+#endif
+ if (strcmp(long_option[i].name, "prefix=") == 0){
+ if (*p == '=' && ' ' < p[1] && p[1] < 128){
+ for (i = 2; ' ' < p[i] && p[i] < 128; i++){
+ prefix_table[p[i]] = p[1];
+ }
+ }
+ continue;
+ }
}
continue;
case 'b': /* buffered mode */
if ('1'== cp[0] && '6'==cp[1]) {
output_conv = w_oconv16; cp+=2;
if (cp[0]=='L') {
- w_oconv16_begin_f=2; cp++;
+ unicode_bom_f=2; cp++;
+ w_oconv16_LE = 1;
+ if (cp[0] == '0'){
+ unicode_bom_f=1; cp++;
+ }
+ } else if (cp[0] == 'B') {
+ unicode_bom_f=2; cp++;
+ if (cp[0] == '0'){
+ unicode_bom_f=1; cp++;
+ }
+ }
+ } else if (cp[0] == '8') {
+ output_conv = w_oconv; cp++;
+ unicode_bom_f=2;
+ if (cp[0] == '0'){
+ unicode_bom_f=1; cp++;
}
} else
output_conv = w_oconv;
#ifdef UTF8_INPUT_ENABLE
case 'W': /* UTF-8 input */
if ('1'== cp[0] && '6'==cp[1]) {
- input_f = UTF16_INPUT;
+ input_f = UTF16LE_INPUT;
+ if (cp[0]=='L') {
+ cp++;
+ } else if (cp[0] == 'B') {
+ cp++;
+ input_f = UTF16BE_INPUT;
+ }
+ } else if (cp[0] == '8') {
+ cp++;
+ input_f = UTF8_INPUT;
} else
input_f = UTF8_INPUT;
continue;
} 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 */
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 'g':
+#ifndef PERL_XS
+ guess_f = TRUE;
+#endif
+ continue;
case ' ':
/* module muliple options in a string are allowed for Perl moudle */
while(*cp && *cp!='-') cp++;
}
#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)
}
#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){
+ set_input_codename(p->name);
+ debug(input_codename);
+ }
iconv_for_check = iconv;
}
#endif
}
-void
-code_status(c)
+#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 (s_stat){
+ 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;
+#ifdef NUMCHAR_OPTION
+ }else if ((c & CLASS_MASK) == CLASS_UTF16){
break;
- }else if ((0x81 <= c && c < 0xa0) || (0xe0 <= c && c <= 0xea)){
- s_stat = 1;
+#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){
+ int bom = (ptr->buf[0] == 0xef && ptr->buf[1] == 0xbb
+ && ptr->buf[2] == 0xbf);
+ w2e_conv(ptr->buf[0], ptr->buf[1], ptr->buf[2],
+ &ptr->buf[0], &ptr->buf[1]);
+ if (!bom){
+ 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;
+ }
}
}
}
+#define STD_GC_BUFSIZE (256)
+int std_gc_buf[STD_GC_BUFSIZE];
+int std_gc_ndx;
+
int
std_getc(f)
FILE *f;
{
+ if (std_gc_ndx){
+ return std_gc_buf[--std_gc_ndx];
+ }
return getc(f);
}
int c;
FILE *f;
{
- return ungetc(c,f);
+ if (std_gc_ndx == STD_GC_BUFSIZE){
+ return EOF;
+ }
+ std_gc_buf[std_gc_ndx++] = c;
+ return c;
}
void
std_putc(c)
int c;
{
- putchar(c);
+ if(c!=EOF)
+ putchar(c);
}
int
/* output redicrection */
#ifdef CHECK_OPTION
- if (noout_f){
+ if (noout_f || guess_f){
o_putc = no_putc;
}
#endif
}
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;
#ifdef UTF8_INPUT_ENABLE
} else if (input_f == UTF8_INPUT) {
set_iconv(-TRUE, w_iconv);
- } else if (input_f == UTF16_INPUT) {
+ } else if (input_f == UTF16LE_INPUT) {
set_iconv(-TRUE, w_iconv16);
#endif
} else {
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++);
+ }
+ }
}
/*
FILE *f;
{
int c1,
- c2;
+ c2, c3;
module_connection();
c2 = 0;
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;
+ set_input_codename("ISO-2022-JP");
+ debug(input_codename);
NEXT;
} else if (c1 == '(') {
if ((c1 = (*i_getc)(f)) == EOF) {
}
} else if ( c1 == 'N' || c1 == 'n' ){
/* SS2 */
- c1 = (*i_getc)(f); /* skip SS2 */
- if ( SPACE<=c1 && c1 < 0xe0 ) {
+ c3 = (*i_getc)(f); /* skip SS2 */
+ if ( (SPACE<=c3 && c3 < 0x60) || (0xa0<=c3 && c3 < 0xe0)){
+ c1 = c3;
c2 = X0201;
SEND;
+ }else{
+ (*i_ungetc)(c3, f);
+ /* lonely ESC */
+ (*oconv)(0, ESC);
+ SEND;
}
} else {
/* lonely ESC */
} else if ((c1 == NL || c1 == CR) && broken_f&4) {
input_mode = ASCII; set_iconv(FALSE, 0);
SEND;
+ } else if (c1 == NL && mime_f && !mime_decode_mode ) {
+ if ((c1=(*i_getc)(f))!=EOF && c1 == SPACE) {
+ i_ungetc(SPACE,f);
+ continue;
+ } else {
+ i_ungetc(c1,f);
+ }
+ c1 = NL;
+ SEND;
+ } else if (c1 == CR && mime_f && !mime_decode_mode ) {
+ if ((c1=(*i_getc)(f))!=EOF) {
+ if (c1==SPACE) {
+ i_ungetc(SPACE,f);
+ continue;
+ } else if (c1 == NL && (c1=(*i_getc)(f))!=EOF && c1 == SPACE) {
+ i_ungetc(SPACE,f);
+ continue;
+ } else {
+ i_ungetc(c1,f);
+ }
+ i_ungetc(NL,f);
+ } else {
+ i_ungetc(c1,f);
+ }
+ c1 = CR;
+ SEND;
} else
SEND;
}
}
}
+ 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;
}
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);
}
if (p2) *p2 = c2;
if (p1) *p1 = c1;
- return (c2 << 8) | c1;
+ return 0;
}
int
} else if ((c2 == EOF) || (c2 == 0) || c2 < SPACE) {
/* NOP */
} else {
- s2e_conv(c2, c1, &c2, &c1);
+ 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 {
{
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 (c0 == 0) return -1;
pp = utf8_to_euc_3bytes[c2 - 0x80];
- return w_iconv_common(c1, c0, pp, sizeof_utf8_to_euc_C2, p2, p1);
+ ret = w_iconv_common(c1, c0, pp, sizeof_utf8_to_euc_C2, p2, p1);
} else {
- return w_iconv_common(c2, c1, utf8_to_euc_2bytes, sizeof_utf8_to_euc_2bytes, p2, p1);
+ ret = w_iconv_common(c2, c1, utf8_to_euc_2bytes, sizeof_utf8_to_euc_2bytes, p2, p1);
+ }
+#ifdef NUMCHAR_OPTION
+ if (ret){
+ if (p2) *p2 = 0;
+ if (p1) *p1 = CLASS_UTF16 | ww16_conv(c2, c1, c0);
+ ret = 0;
}
+#endif
+ return ret;
} else if (c2 == X0201) {
c1 &= 0x7f;
}
if (p2) *p2 = c2;
if (p1) *p1 = c1;
- return 0;
+ return ret;
}
int
return ret;
}
-int
-w_iconv16(c2, c1, c0)
- int c2, c1,c0;
+void
+w16w_conv(val, p2, p1, p0)
+ unsigned short val;
+ int *p2, *p1, *p0;
{
- extern unsigned short * utf8_to_euc_2bytes[];
+ 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;
+ utf16_mode = UTF16LE_INPUT;
return 0;
} else if (c2==0377 && c1==0376){
utf16_mode = UTF16BE_INPUT;
return 0;
}
- if (utf16_mode == UTF16BE_INPUT) {
+ if (c2 != EOF && utf16_mode == UTF16BE_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;
- psize = sizeof_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];
- psize = sizeof_utf8_to_euc_C2;
- }else{
- return 0;
- }
- }
- ret = w_iconv_common(c1, c0, pp, psize, &c2, &c1);
+ ret = w16e_conv(((c2<<8)&0xff00) + c1, &c2, &c1);
if (ret) return ret;
(*oconv)(c2, c1);
return 0;
{
extern unsigned short euc_to_utf8_1byte[];
extern unsigned short * euc_to_utf8_2bytes[];
+ extern unsigned short * euc_to_utf8_2bytes_ms[];
unsigned short *p;
if (c2 == X0201) {
c2 &= 0x7f;
c2 = (c2&0x7f) - 0x21;
if (0<=c2 && c2<sizeof_euc_to_utf8_2bytes)
- p = euc_to_utf8_2bytes[c2];
+ p = ms_ucs_map_f ? euc_to_utf8_2bytes_ms[c2] : euc_to_utf8_2bytes[c2];
else
return 0;
}
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) {
+ }
+
+ if (unicode_bom_f==2) {
+ (*o_putc)('\357');
+ (*o_putc)('\273');
+ (*o_putc)('\277');
+ unicode_bom_f=1;
+ }
+
+ if (c2 == 0) {
output_mode = ASCII;
(*o_putc)(c1);
} else if (c2 == ISO8859_1) {
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 (w_oconv16_begin_f==2) {
- (*o_putc)('\376');
- (*o_putc)('\377');
- w_oconv16_begin_f=1;
- }
if (c2 == EOF) {
+ (*o_putc)(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 (unicode_bom_f==2) {
+ if (w_oconv16_LE){
+ (*o_putc)((unsigned char)'\377');
+ (*o_putc)('\376');
+ }else{
+ (*o_putc)('\376');
+ (*o_putc)((unsigned char)'\377');
+ }
+ unicode_bom_f=1;
+ }
+
+ 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);
+
+#ifdef SHIFTJIS_CP932
+ if (cp932inv_f
+ && CP932INV_TABLE_BEGIN <= c2 && c2 <= CP932INV_TABLE_END){
+ extern unsigned short cp932inv[2][189];
+ int c = cp932inv[c2 - CP932INV_TABLE_BEGIN][c1 - 0x40];
+ if (c){
+ c2 = c >> 8;
+ c1 = c & 0xff;
+ }
+ }
+#endif /* SHIFTJIS_CP932 */
+
+ (*o_putc)(c2);
+ if (prefix_table[(unsigned char)c1]){
+ (*o_putc)(prefix_table[(unsigned char)c1]);
+ }
+ (*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;
c1;
{
if (base64_count>50 && !mimeout_mode && c2==0 && c1==SPACE) {
+ (*o_putc)(EOF);
(*o_putc)(NL);
} else if (base64_count>66 && mimeout_mode) {
(*o_base64conv)(EOF,0);
- (*o_putc)(NL);
- (*o_putc)(' ');
+ (*o_base64conv)(NL,0);
+ (*o_base64conv)(SPACE,0);
}
(*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?",
+ (unsigned char *)"\075?UTF-8?Q?",
#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, 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,
+ UTF8, 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',
+ 'B', 'Q',
#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
+void
+set_input_codename (codename)
+ char *codename;
+{
+ if (guess_f &&
+ is_inputcode_set &&
+ strcmp(codename, "") != 0 &&
+ strcmp(codename, input_codename) != 0)
+ {
+ is_inputcode_mixed = TRUE;
+ }
+ input_codename = codename;
+ is_inputcode_set = TRUE;
+}
+
+void
+print_guessed_code (filename)
+ char *filename;
+{
+ char *codename = "BINARY";
+ if (!is_inputcode_mixed) {
+ if (strcmp(input_codename, "") == 0) {
+ codename = "ASCII";
+ } else {
+ codename = input_codename;
+ }
+ }
+ if (filename != NULL) printf("%s:", filename);
+ printf("%s\n", codename);
+}
+
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
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)
{
int c1, c2, c3, c4, cc;
int t1, t2, t3, t4, mode, exit_mode;
+ int lwsp_count;
+ char *lwsp_buf;
+ char *lwsp_buf_new;
+ int lwsp_size = 128;
if (mime_top != mime_last) { /* Something is in FIFO */
return Fifo(mime_top++);
if (c1=='?'&&c2=='=' && mimebuf_f != FIXED_MIME) {
/* end Q encoding */
input_mode = exit_mode;
- while((c1=(*i_getc)(f))!=EOF && c1==SPACE
- /* && (c1==NL||c1==TAB||c1=='\r') */ ) ;
+ lwsp_count = 0;
+ lwsp_buf = malloc((lwsp_size+5)*sizeof(char));
+ if (lwsp_buf==NULL) {
+ perror("can't malloc");
+ return -1;
+ }
+ while ((c1=(*i_getc)(f))!=EOF) {
+ switch (c1) {
+ case NL:
+ case CR:
+ if (c1==NL) {
+ if ((c1=(*i_getc)(f))!=EOF && (c1==SPACE||c1==TAB)) {
+ i_ungetc(SPACE,f);
+ continue;
+ } else {
+ i_ungetc(c1,f);
+ }
+ c1 = NL;
+ } else {
+ if ((c1=(*i_getc)(f))!=EOF && c1 == NL) {
+ if ((c1=(*i_getc)(f))!=EOF && (c1==SPACE||c1==TAB)) {
+ i_ungetc(SPACE,f);
+ continue;
+ } else {
+ i_ungetc(c1,f);
+ }
+ i_ungetc(NL,f);
+ } else {
+ i_ungetc(c1,f);
+ }
+ c1 = CR;
+ }
+ break;
+ case SPACE:
+ case TAB:
+ lwsp_buf[lwsp_count] = c1;
+ if (lwsp_count++>lwsp_size){
+ lwsp_size *= 2;
+ lwsp_buf_new = realloc(lwsp_buf, (lwsp_size+5)*sizeof(char));
+ if (lwsp_buf_new==NULL) {
+ free(lwsp_buf);
+ lwsp_buf = NULL;
+ perror("can't realloc");
+ return -1;
+ }
+ lwsp_buf = lwsp_buf_new;
+ }
+ continue;
+ }
+ break;
+ }
+ if (lwsp_count > 0) {
+ if (c1=='=' && (lwsp_buf[lwsp_count-1]==SPACE||lwsp_buf[lwsp_count-1]==TAB)) {
+ lwsp_count = 0;
+ } else {
+ i_ungetc(c1,f);
+ for(lwsp_count--;lwsp_count>0;lwsp_count--)
+ i_ungetc(lwsp_buf[lwsp_count],f);
+ c1 = lwsp_buf[0];
+ }
+ }
+ free(lwsp_buf);
+ lwsp_buf = NULL;
return c1;
}
if (c1=='='&&c2<' ') { /* this is soft wrap */
}
if ((c1 == '?') && (c2 == '=')) {
input_mode = ASCII;
- while((c1=(*i_getc)(f))!=EOF && c1==SPACE
- /* && (c1==NL||c1==TAB||c1=='\r') */ ) ;
+ lwsp_count = 0;
+ lwsp_buf = malloc((lwsp_size+5)*sizeof(char));
+ if (lwsp_buf==NULL) {
+ perror("can't malloc");
+ return -1;
+ }
+ while ((c1=(*i_getc)(f))!=EOF) {
+ switch (c1) {
+ case NL:
+ case CR:
+ if (c1==NL) {
+ if ((c1=(*i_getc)(f))!=EOF && (c1==SPACE||c1==TAB)) {
+ i_ungetc(SPACE,f);
+ continue;
+ } else {
+ i_ungetc(c1,f);
+ }
+ c1 = NL;
+ } else {
+ if ((c1=(*i_getc)(f))!=EOF) {
+ if (c1==SPACE) {
+ i_ungetc(SPACE,f);
+ continue;
+ } else if ((c1=(*i_getc)(f))!=EOF && (c1==SPACE||c1==TAB)) {
+ i_ungetc(SPACE,f);
+ continue;
+ } else {
+ i_ungetc(c1,f);
+ }
+ i_ungetc(NL,f);
+ } else {
+ i_ungetc(c1,f);
+ }
+ c1 = CR;
+ }
+ break;
+ case SPACE:
+ case TAB:
+ lwsp_buf[lwsp_count] = c1;
+ if (lwsp_count++>lwsp_size){
+ lwsp_size *= 2;
+ lwsp_buf_new = realloc(lwsp_buf, (lwsp_size+5)*sizeof(char));
+ if (lwsp_buf_new==NULL) {
+ free(lwsp_buf);
+ lwsp_buf = NULL;
+ perror("can't realloc");
+ return -1;
+ }
+ lwsp_buf = lwsp_buf_new;
+ }
+ continue;
+ }
+ break;
+ }
+ if (lwsp_count > 0) {
+ if (c1=='=' && (lwsp_buf[lwsp_count-1]==SPACE||lwsp_buf[lwsp_count-1]==TAB)) {
+ lwsp_count = 0;
+ } else {
+ i_ungetc(c1,f);
+ for(lwsp_count--;lwsp_count>0;lwsp_count--)
+ i_ungetc(lwsp_buf[lwsp_count],f);
+ c1 = lwsp_buf[0];
+ }
+ }
+ free(lwsp_buf);
+ lwsp_buf = NULL;
return c1;
}
mime_c3_retry:
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static int b64c;
+#define MIMEOUT_BUF_LENGTH (60)
+char mimeout_buf[MIMEOUT_BUF_LENGTH+1];
+int mimeout_buf_count = 0;
+int mimeout_preserve_space = 0;
+#define itoh4(c) (c>=10?c+'A'-10:c+'0')
void
open_mime(mode)
{
unsigned char *p;
int i;
+ int j;
p = mime_pattern[0];
for(i=0;mime_encode[i];i++) {
if (mode == mime_encode[i]) {
p = mime_pattern[i];
- break;
+ break;
}
}
mimeout_mode = mime_encode_method[i];
-
- /* (*o_mputc)(' '); */
+
+ i = 0;
+ if (base64_count>45) {
+ (*o_mputc)(NL);
+ (*o_mputc)(SPACE);
+ base64_count = 1;
+ if (!mimeout_preserve_space && mimeout_buf_count>0
+ && (mimeout_buf[i]==SPACE || mimeout_buf[i]==TAB
+ || mimeout_buf[i]==CR || mimeout_buf[i]==NL )) {
+ i++;
+ }
+ }
+ if (!mimeout_preserve_space) {
+ for (;i<mimeout_buf_count;i++) {
+ if (mimeout_buf[i]==SPACE || mimeout_buf[i]==TAB
+ || mimeout_buf[i]==CR || mimeout_buf[i]==NL ) {
+ (*o_mputc)(mimeout_buf[i]);
+ base64_count ++;
+ } else {
+ break;
+ }
+ }
+ }
+ mimeout_preserve_space = FALSE;
+
while(*p) {
(*o_mputc)(*p++);
base64_count ++;
}
+ j = mimeout_buf_count;
+ mimeout_buf_count = 0;
+ for (;i<j;i++) {
+ mime_putc(mimeout_buf[i]);
+ }
}
void
{
(*o_mputc)('?');
(*o_mputc)('=');
- (*o_mputc)(' ');
- base64_count += 3;
+ base64_count += 2;
mimeout_mode = 0;
}
-#define itoh4(c) (c>=10?c+'A'-10:c+'0')
+void
+eof_mime()
+{
+ switch(mimeout_mode) {
+ case 'Q':
+ case 'B':
+ break;
+ case 2:
+ (*o_mputc)(basis_64[((b64c & 0x3)<< 4)]);
+ (*o_mputc)('=');
+ (*o_mputc)('=');
+ base64_count += 3;
+ break;
+ case 1:
+ (*o_mputc)(basis_64[((b64c & 0xF) << 2)]);
+ (*o_mputc)('=');
+ base64_count += 2;
+ break;
+ }
+ if (mimeout_mode) {
+ if (mimeout_f!=FIXED_MIME) {
+ close_mime();
+ } else if (mimeout_mode != 'Q')
+ mimeout_mode = 'B';
+ }
+}
void
-mime_putc(c)
+mimeout_addchar(c)
int c;
{
- if (mimeout_f==FIXED_MIME) {
- if (base64_count>71) {
- (*o_mputc)('\n');
- base64_count=0;
- }
- } else if (c==NL) {
- base64_count=0;
- }
- if (c!=EOF) {
- if ( c<=DEL &&(output_mode==ASCII ||output_mode == ISO8859_1 )
- && mimeout_f!=FIXED_MIME) {
- if (mimeout_mode=='Q') {
- if (c<=SPACE) {
- close_mime();
- }
- (*o_mputc)(c);
- return;
- }
- if (mimeout_mode!='B' || c!=SPACE) {
- if (mimeout_mode) {
- mime_putc(EOF);
- mimeout_mode=0;
- }
- (*o_mputc)(c);
- base64_count ++;
- return;
- }
- } else if (!mimeout_mode && mimeout_f!=FIXED_MIME) {
- open_mime(output_mode);
- }
- } else { /* c==EOF */
- switch(mimeout_mode) {
- case 'Q':
- case 'B':
- break;
- case 2:
- (*o_mputc)(basis_64[((b64c & 0x3)<< 4)]);
- (*o_mputc)('=');
- (*o_mputc)('=');
- base64_count += 3;
- break;
- case 1:
- (*o_mputc)(basis_64[((b64c & 0xF) << 2)]);
- (*o_mputc)('=');
- base64_count += 2;
- break;
- }
- if (mimeout_mode) {
- if (mimeout_f!=FIXED_MIME) {
- close_mime();
- } else if (mimeout_mode != 'Q')
- mimeout_mode = 'B';
- }
- return;
- }
switch(mimeout_mode) {
case 'Q':
if(c>=DEL) {
(*o_mputc)('=');
(*o_mputc)(itoh4(((c>>4)&0xf)));
(*o_mputc)(itoh4((c&0xf)));
+ base64_count += 3;
} else {
(*o_mputc)(c);
+ base64_count++;
}
break;
case 'B':
}
}
+void
+mime_putc(c)
+ int c;
+{
+ int i = 0;
+ int j = 0;
+
+ if (mimeout_f==FIXED_MIME && base64_count>50) {
+ eof_mime();
+ (*o_mputc)(NL);
+ base64_count=0;
+ } else if (c==CR||c==NL) {
+ base64_count=0;
+ }
+ if (c!=EOF && mimeout_f!=FIXED_MIME) {
+ if ( c<=DEL &&(output_mode==ASCII ||output_mode == ISO8859_1 ) ) {
+ if (mimeout_mode=='Q') {
+ if (c<=SPACE) {
+ close_mime();
+ (*o_mputc)(SPACE);
+ base64_count++;
+ }
+ (*o_mputc)(c);
+ base64_count++;
+ return;
+ } else if (mimeout_mode) {
+ if (base64_count>63) {
+ eof_mime();
+ (*o_mputc)(NL);
+ (*o_mputc)(SPACE);
+ base64_count=1;
+ mimeout_preserve_space = TRUE;
+ }
+ if (c==SPACE || c==TAB || c==CR || c==NL) {
+ for (i=0;i<mimeout_buf_count;i++) {
+ if (SPACE<mimeout_buf[i] && mimeout_buf[i]<DEL) {
+ eof_mime();
+ for (i=0;i<mimeout_buf_count;i++) {
+ (*o_mputc)(mimeout_buf[i]);
+ base64_count++;
+ }
+ mimeout_buf_count = 0;
+ }
+ }
+ mimeout_buf[mimeout_buf_count++] = c;
+ if (mimeout_buf_count>MIMEOUT_BUF_LENGTH) {
+ eof_mime();
+ base64_count = 0;
+ for (i=0;i<mimeout_buf_count;i++) {
+ (*o_mputc)(mimeout_buf[i]);
+ base64_count++;
+ }
+ }
+ return;
+ }
+ if (mimeout_buf_count>0 && SPACE<c) {
+ mimeout_buf[mimeout_buf_count++] = c;
+ if (mimeout_buf_count>MIMEOUT_BUF_LENGTH) {
+ } else {
+ return;
+ }
+ }
+ } else if (!mimeout_mode) {
+ if (c==SPACE || c==TAB || c==CR || c==NL) {
+ if ((c==CR || c==NL)
+ &&(mimeout_buf[mimeout_buf_count-1]==SPACE
+ || mimeout_buf[mimeout_buf_count-1]==TAB)) {
+ mimeout_buf_count--;
+ }
+ for (i=0;i<mimeout_buf_count;i++) {
+ (*o_mputc)(mimeout_buf[i]);
+ base64_count++;
+ }
+ mimeout_buf_count = 0;
+ }
+ mimeout_buf[mimeout_buf_count++] = c;
+ if (mimeout_buf_count>75) {
+ open_mime(output_mode);
+ }
+ return;
+ }
+ } else if (!mimeout_mode) {
+ if (mimeout_buf_count>0 && mimeout_buf[mimeout_buf_count-1]==SPACE) {
+ for (i=0;i<mimeout_buf_count-1;i++) {
+ (*o_mputc)(mimeout_buf[i]);
+ base64_count++;
+ }
+ mimeout_buf[0] = SPACE;
+ mimeout_buf_count = 1;
+ }
+ open_mime(output_mode);
+ }
+ } else { /* c==EOF */
+ j = mimeout_buf_count;
+ i = 0;
+ for (;i<j;i++) {
+ if (mimeout_buf[i]==SPACE || mimeout_buf[i]==TAB
+ || mimeout_buf[i]==CR || mimeout_buf[i]==NL)
+ break;
+ (*mime_putc)(mimeout_buf[i]);
+ }
+ eof_mime();
+ for (;i<j;i++) {
+ (*o_mputc)(mimeout_buf[i]);
+ base64_count++;
+ }
+ return;
+ }
+
+ if (mimeout_buf_count>0) {
+ j = mimeout_buf_count;
+ mimeout_buf_count = 0;
+ for (i=0;i<j;i++) {
+ mimeout_addchar(mimeout_buf[i]);
+ }
+ }
+ mimeout_addchar(c);
+}
+
#ifdef PERL_XS
void
reinit()
{
+ {
+ struct input_code *p = input_code_list;
+ while (p->name){
+ status_reinit(p++);
+ }
+ }
unbuf_f = FALSE;
estab_f = FALSE;
nop_f = FALSE;
- binmode_f = TRUE;
- rot_f = FALSE;
- hira_f = FALSE;
- input_f = FALSE;
- alpha_f = FALSE;
- mime_f = STRICT_MIME;
- mimebuf_f = FALSE;
- broken_f = FALSE;
- iso8859_f = FALSE;
-#if defined(MSDOS) || defined(__OS2__)
- x0201_f = TRUE;
+ binmode_f = TRUE;
+ rot_f = FALSE;
+ hira_f = FALSE;
+ input_f = FALSE;
+ alpha_f = FALSE;
+ mime_f = STRICT_MIME;
+ mimebuf_f = FALSE;
+ broken_f = FALSE;
+ iso8859_f = FALSE;
+ mimeout_f = FALSE;
+#if defined(MSDOS) || defined(__OS2__)
+ x0201_f = TRUE;
#else
x0201_f = NO_X0201;
#endif
iso2022jp_f = FALSE;
-
+#ifdef UTF8_OUTPUT_ENABLE
+ unicode_bom_f = 0;
+ w_oconv16_LE = 0;
+ ms_ucs_map_f = FALSE;
+#endif
+#ifdef INPUT_OPTION
+ cap_f = FALSE;
+ url_f = FALSE;
+ numchar_f = FALSE;
+#endif
+#ifdef CHECK_OPTION
+ noout_f = FALSE;
+ debug_f = FALSE;
+#endif
+ guess_f = FALSE;
+ is_inputcode_mixed = FALSE;
+ is_inputcode_set = FALSE;
+#ifdef EXEC_IO
+ exec_f = 0;
+#endif
+#ifdef SHIFTJIS_CP932
+ cp932_f = TRUE;
+ cp932inv_f = FALSE;
+#endif
+ {
+ int i;
+ for (i = 0; i < 256; i++){
+ prefix_table[i] = 0;
+ }
+ }
+#ifdef UTF8_INPUT_ENABLE
+ utf16_mode = UTF16LE_INPUT;
+#endif
+ mimeout_buf_count = 0;
+ mimeout_mode = 0;
+ base64_count = 0;
+ f_line = 0;
+ f_prev = 0;
+ fold_preserve_f = FALSE;
+ fold_f = FALSE;
+ fold_len = 0;
kanji_intro = DEFAULT_J;
ascii_intro = DEFAULT_R;
-
- output_conv = DEFAULT_CONV;
- oconv = DEFAULT_CONV;
-
- i_mgetc = std_getc;
- i_mungetc = std_ungetc;
- i_mgetc_buf = std_getc;
- i_mungetc_buf = std_ungetc;
-
- i_getc= std_getc;
- i_ungetc=std_ungetc;
-
- i_bgetc= std_getc;
- i_bungetc= std_ungetc;
-
- o_putc = std_putc;
- o_mputc = std_putc;
- o_crconv = no_connection;
- o_rot_conv = no_connection;
- o_iso2022jp_check_conv = no_connection;
- o_hira_conv = no_connection;
- o_fconv = no_connection;
+ fold_margin = FOLD_MARGIN;
+ output_conv = DEFAULT_CONV;
+ oconv = DEFAULT_CONV;
o_zconv = no_connection;
-
+ o_fconv = no_connection;
+ o_crconv = no_connection;
+ o_rot_conv = no_connection;
+ o_hira_conv = no_connection;
+ o_base64conv = no_connection;
+ o_iso2022jp_check_conv = no_connection;
+ o_putc = std_putc;
i_getc = std_getc;
i_ungetc = std_ungetc;
- i_mgetc = std_getc;
- i_mungetc = std_ungetc;
-
+ i_bgetc = std_getc;
+ i_bungetc = std_ungetc;
+ o_mputc = std_putc;
+ i_mgetc = std_getc;
+ i_mungetc = std_ungetc;
+ i_mgetc_buf = std_getc;
+ i_mungetc_buf = std_ungetc;
output_mode = ASCII;
input_mode = ASCII;
shift_mode = FALSE;
- mime_decode_mode = FALSE;
+ mime_decode_mode = FALSE;
file_out = FALSE;
- mimeout_mode = 0;
- mimeout_f = FALSE;
- base64_count = 0;
- option_mode = 0;
crmode_f = 0;
-
- e_stat = 0;
- s_stat = 0;
-#ifdef UTF8_INPUT_ENABLE
- w_stat = 0;
-#else
- w_stat = -1;
-#endif
-#ifdef UTF8_OUTPUT_ENABLE
- if (w_oconv16_begin_f) {
- w_oconv16_begin_f = 2;
- }
-#endif
- f_line = 0;
- f_prev = 0;
- fold_preserve_f = FALSE;
- fold_f = FALSE;
- fold_len = 0;
- fold_margin = FOLD_MARGIN;
+ option_mode = 0;
broken_counter = 0;
broken_last = 0;
z_prev2=0,z_prev1=0;
{
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");
+ fprintf(stderr,"b,u Output is buffered (DEFAULT),Output is unbuffered\n");
#ifdef DEFAULT_CODE_SJIS
fprintf(stderr,"j,s,e,w Outout code is JIS 7 bit, Shift JIS (DEFAULT), AT&T JIS (EUC), UTF-8\n");
#endif
#ifdef DEFAULT_CODE_UTF8
fprintf(stderr,"j,s,e,w Outout code is JIS 7 bit, Shift JIS, AT&T JIS (EUC), UTF-8 (DEFAULT)\n");
#endif
+#ifdef UTF8_OUTPUT_ENABLE
+ fprintf(stderr," After 'w' you can add more options. (80?|16((B|L)0?)?) \n");
+#endif
fprintf(stderr,"J,S,E,W Input assumption is JIS 7 bit , Shift JIS, AT&T JIS (EUC), UTF-8\n");
+#ifdef UTF8_INPUT_ENABLE
+ fprintf(stderr," After 'W' you can add more options. (8|16(B|L)?) \n");
+#endif
fprintf(stderr,"t no conversion\n");
fprintf(stderr,"i_/o_ Output sequence to designate JIS-kanji/ASCII (DEFAULT B)\n");
fprintf(stderr,"r {de/en}crypt ROT13/47\n");
fprintf(stderr,"I Convert non ISO-2022-JP charactor to GETA\n");
fprintf(stderr,"-L[uwm] line mode u:LF w:CRLF m:CR (DEFAULT noconversion)\n");
fprintf(stderr,"long name options\n");
- fprintf(stderr," --fj,--unix,--mac,--windows convert for the system\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");
+ fprintf(stderr," --hiragana, --katakana Hiragana/Katakana Conversion\n");
+#ifdef INPUT_OPTION
+ fprintf(stderr," --cap-input, --url-input Convert hex after ':' or '%%'\n");
+#endif
+#ifdef NUMCHAR_OPTION
+ fprintf(stderr," --numchar-input Convert Unicode Character Reference\n");
+#endif
+#ifdef SHIFTJIS_CP932
+ fprintf(stderr," --no-cp932 Don't convert Shift_JIS FAxx-FCxx to equivalnet CP932\n");
+ fprintf(stderr," --cp932inv convert Shift_JIS EDxx-EFxx to equivalnet CP932 FAxx-FCxx\n");
+#endif
+#ifdef UTF8_OUTPUT_ENABLE
+ fprintf(stderr," --ms-ucs-map Microsoft UCS Mapping Compatible\n");
+#endif
+#ifdef OVERWRITE
+ fprintf(stderr," --overwrite Overwrite original listed files by filtered result\n");
+#endif
+ fprintf(stderr," -g, --guess Guess the input code\n");
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__
"for OS/2"
#endif
- ,Version,Patchlevel);
+ ,NKF_VERSION,NKF_RELEASE_DATE);
fprintf(stderr,"\n%s\n",CopyRight);
}
#endif
** 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 */