static void sjis_to_jis (unsigned int *ph, unsigned int *pl) { if ( ! issjis1 ( *ph ) || ! issjis2 ( *pl ) ) { return ; } if (*ph <= 0x9f) { if (*pl < 0x9f) *ph = (*ph << 1) - 0xe1; else *ph = (*ph << 1) - 0xe0; } else { if (*pl < 0x9f) *ph = (*ph << 1) - 0x161; else *ph = (*ph << 1) - 0x160; } if (*pl < 0x7f) *pl -= 0x1f; else if (*pl < 0x9f) *pl -= 0x20; else *pl -= 0x7e; }
int file_knjchk(FILE *fp) { int c; int f_sjis,f_euc; int n_sjis,n_sjis_i,n_euc,n_euc_i; n_sjis=0; n_sjis_i=0; n_euc=0; n_euc_i=0; f_sjis=FALSE; f_euc=FALSE; for(;;) { c=fgetc(fp); if (c==EOF|| n_euc>32||n_sjis>32||n_euc_i>8||n_sjis_i>8) return n_euc- n_euc_i*4>= n_sjis- n_sjis_i*4? KC_euc:KC_sjis; if (c==ESC) { c=fgetc(fp); if (c=='K') return KC_jis; if (c=='$') { c=fgetc(fp); if (c=='B'||c=='@') return KC_jis; } } if (f_euc) { if (iseuc(c)) ++n_euc; else ++n_euc_i; f_euc=FALSE; } else { if (iseuc(c)) f_euc=TRUE; } if (f_sjis) { if (issjis2(c)) ++n_sjis; else ++n_sjis_i; f_sjis=FALSE; } else { if (issjis1(c)) f_sjis=TRUE; } } }
gint guess_kanji(gint imax, guchar *buf) { int i, bad_euc, bad_sjis; for (i = 0; i < imax; i++) { if(buf[i+5] == '\0') break; if((strncmp(&buf[i], JIS0208_1978, strlen(JIS0208_1978)) == 0) || (strncmp(&buf[i], JIS0208_1983, strlen(JIS0208_1983)) == 0) || (strncmp(&buf[i], JIS0208_1990, strlen(JIS0208_1990)) == 0) || (strncmp(&buf[i], JIS0212, strlen(JIS0212)) == 0) || (strncmp(&buf[i], JIS_ASC, strlen(JIS_ASC)) == 0) || (strncmp(&buf[i], JIS_ASC2, strlen(JIS_ASC2)) == 0) || (strncmp(&buf[i], JIS_KANA, strlen(JIS_KANA)) == 0)) return(KCODE_JIS); } bad_euc = 0; for (i = 0; i < imax; i++) { if(buf[i+2] == '\0') break; if (iseuc(buf[i]) && ++i < imax) { if (! iseuc(buf[i])) { bad_euc += 10; i--; } else if (buf[i-1] >= 0xd0) bad_euc++; /* Dai 2 Suijun */ /* 1999-02-01 bug fixed. Thanks: massangeana */ } else if (buf[i] == 0x8e && ++i < imax) { if (ishankana(buf[i])) bad_euc++; else { bad_euc += 10; i--; } } else if (buf[i] >= 0x80) bad_euc += 10; } bad_sjis = 0; for (i = 0; i < imax; i++) { if(buf[i+2] == '\0') break; if (issjis1(buf[i]) && ++i < imax) { if (! issjis2(buf[i])) { bad_sjis += 10; i--; } else if ((unsigned) (buf[i-1] * 256U + buf[i]) >= 0x989f) bad_sjis++; /* Dai 2 Suijun */ } else if (buf[i] >= 0x80) { if (ishankana(buf[i])) bad_sjis++; else bad_sjis += 10; } } if(bad_sjis < bad_euc) return(KCODE_SJIS); else if (bad_sjis > bad_euc) return(KCODE_EUC); else if ((bad_euc == 0) && (bad_sjis == 0)) return(KCODE_ASCII); else return(KCODE_UNKNOWN); }
void convert_delimiter(char *path) { if (!is_win9x) { char *p = path; int i, len = strlen(path); for (i = 0; i < len; i++) { if (*p == '\\') { if (i == 0 || !issjis1(*(UINT8 *)(p - 1))) *p = '/'; } p++; } } }
Encoding GetEncoding(PCSTR str, size_t len) { size_t i; int ascii, eucjp, sjis, utf8, bad_eucjp, bad_sjis, bad_utf8; int jis, hankana; const unsigned char* buf = (const unsigned char*)str; ascii = 1; bad_eucjp = eucjp = 0; bad_sjis = sjis = 0; bad_utf8 = utf8 = 0; jis = 0; // check BOM if (len >= 2) { if (buf[0] == 0xff && buf[1] == 0xfe) return ENCODING_UTF16_LE; else if (buf[0] == 0xfe && buf[1] == 0xff) return ENCODING_UTF16_BE; } if (len >= 3 && !memcmp(buf, "\xef\xbb\xbf", 3)) return ENCODING_UTF8_BOM; // check ENCODING_SJIS hankana = 0; for (i = 0; i < len; i++) { if (buf[i] >= 0x80) ascii = 0; if (buf[i] == 0x1b) jis = 1; if (buf[i] == 0x8e && i + 2 < len && buf[i + 2] == 0x8e && ishankana(buf[i + 1])) { bad_sjis += 1; } if (ishankana(buf[i])) { sjis += 0x10/2 - 1; hankana++; } else { if (hankana == 1) bad_sjis++; hankana = 0; if (issjis1(buf[i])) { if (i + 1 < len) { if (issjis2(buf[i + 1])) { sjis += 0x10; i++; } else bad_sjis += 0x100; } } else if (buf[i] >= 0x80) bad_sjis += 0x100; } } if (ascii) return jis ? ENCODING_JIS : ENCODING_ASCII; // check ENCODING_EUCJP - JP hankana = 0; for (i = 0; i < len; i++) { if (buf[i] == 0x8e) { if (i + 1 < len) { if (ishankana(buf[i + 1])) { eucjp += 10; i++; hankana++; } else bad_eucjp += 0x100; } } else { if (hankana == 1) bad_eucjp++; hankana = 0; if (iseuc(buf[i])) { if (i + 1 < len) { if (iseuc(buf[i + 1])) { i++; eucjp += 0x10; } else bad_eucjp += 0x100; } } else if (buf[i] == 0x8f) { if (i + 2 < len) { if (iseuc(buf[i + 1]) && iseuc(buf[i + 2])) { i += 2; eucjp += 0x10; } else bad_eucjp += 100; } } else if (buf[i] >= 0x80) bad_eucjp += 0x100; } } // check UTF-8 for (i = 0; i < len; i++) { if (isutf8_2byte(buf[i])) { if (i + 1 < len) { if (isutf8_trail(buf[i + 1])) { utf8 += 10; i++; } else bad_utf8 += 100; } } else if (isutf8_3byte(buf[i])) { if (i + 2 < len) { if (isutf8_trail(buf[i + 1]) && isutf8_trail(buf[i + 2])) { utf8 += 15; i += 2; } else bad_utf8 += 1000; } } else if (buf[i] >= 0x80) bad_utf8 += 1000; } if (sjis - bad_sjis > eucjp - bad_eucjp) { if (sjis - bad_sjis > utf8 - bad_utf8) return ENCODING_SJIS; else if (sjis - bad_sjis < utf8 - bad_utf8) return ENCODING_UTF8; } if (sjis - bad_sjis < eucjp - bad_eucjp) { if (eucjp - bad_eucjp > utf8 - bad_utf8) return ENCODING_EUCJP; else if (eucjp - bad_eucjp < utf8 - bad_utf8) return ENCODING_UTF8; } return ENCODING_UNKNOWN; }
void kanji_toeuc(char *s,size_t bytes,const char *t,bool f_sjis,int *jm) { u_char c,sjc; bool sf; // (SI/SO)shift flag sjc=0; sf=FALSE; for (;*t!='\0'&& bytes>0;) { c=(u_char)*t++; switch(c) { case SI: sf=FALSE; continue; case SO: sf=TRUE; continue; case ESC: switch(*t++) { case 'K': // NEC kanji *jm=JM_kanji; sf=FALSE; continue; case 'H': // NEC ank *jm=JM_ank; sf=FALSE; continue; case '&': if (*t=='@') // JIS X0208-1990 切り替え準備 { ++t; continue; } break; case '$': if (*t=='B'||*t=='@') // JIS X0208 { ++t; sf=FALSE; *jm=JM_kanji; continue; } break; case '(': if (*t=='J'||*t=='B'||*t=='H') // JIS X0201(roman)/ank { ++t; sf=FALSE; *jm=JM_ank; continue; } if (*t=='I') // JIS X0201(kana) { ++t; *jm=JM_kana; continue; } } --t; } if (f_sjis) { if (sjc!=0) { if (issjis2(c)) { if (bytes<2) break; if (c>=0x9f) ++sjc; *s++=sjc; *s++=SJIStoEUCtable2[c-0x40]; bytes-=2; sjc=0; continue; } sjc=0; --t; c=*t; } else { if (issjis1(c)) { sjc= SJIStoEUCtable1[c&0x7f]; continue; } if (iskana(c)) { if (bytes<2) break; *s++=0x8e; --bytes; } } } if (*jm==JM_kana|| sf) { if (bytes<2) break; *s++=0x8e; --bytes; } if (*jm!=JM_ank|| sf) c |= 0x80; *s++=c; --bytes; } *s='\0'; }