📄 kanji.c
字号:
*out++ = junet_kana2; shifted = _KJ_KANA; break; } *out++ = ((int) *from++) - 0x80; } else { switch (shifted) { case _KJ_KANA: case _KJ_KANJI: /* to ROMAN */ *out++ = jis_esc; *out++ = jis_si1; *out++ = jis_si2; shifted = _KJ_ROMAN; break; } *out++ = *from++; } } switch (shifted) { case _KJ_KANA: case _KJ_KANJI: /* to ROMAN */ *out++ = jis_esc; *out++ = jis_si1; *out++ = jis_si2; break; } *out = 0; if (overwrite) { pstrcpy (save, (char *) cvtbuf); return save; } else { return cvtbuf; }}/******************************************************************* HEX <-> SJIS********************************************************************//* ":xx" -> a byte */static char *hex_to_sj(char *from, BOOL overwrite){ char *sp, *dp; sp = (char *) from; dp = cvtbuf; while (*sp) { if (*sp == hex_tag && isxdigit((int)sp[1]) && isxdigit((int)sp[2])) { *dp++ = (hex2bin (sp[1])<<4) | (hex2bin (sp[2])); sp += 3; } else *dp++ = *sp++; } *dp = '\0'; if (overwrite) { pstrcpy ((char *) from, (char *) cvtbuf); return (char *) from; } else { return cvtbuf; }} /******************************************************************* kanji/kana -> ":xx" ********************************************************************/static char *sj_to_hex(char *from, BOOL overwrite){ unsigned char *sp, *dp; sp = (unsigned char*) from; dp = (unsigned char*) cvtbuf; while (*sp) { if (is_kana(*sp)) { *dp++ = hex_tag; *dp++ = bin2hex (((*sp)>>4)&0x0f); *dp++ = bin2hex ((*sp)&0x0f); sp++; } else if (is_shift_jis (*sp) && is_shift_jis2 (sp[1])) { *dp++ = hex_tag; *dp++ = bin2hex (((*sp)>>4)&0x0f); *dp++ = bin2hex ((*sp)&0x0f); sp++; *dp++ = hex_tag; *dp++ = bin2hex (((*sp)>>4)&0x0f); *dp++ = bin2hex ((*sp)&0x0f); sp++; } else *dp++ = *sp++; } *dp = '\0'; if (overwrite) { pstrcpy ((char *) from, (char *) cvtbuf); return (char *) from; } else { return cvtbuf; }}/******************************************************************* CAP <-> SJIS********************************************************************//* ":xx" CAP -> a byte */static char *cap_to_sj(char *from, BOOL overwrite){ char *sp, *dp; sp = (char *) from; dp = cvtbuf; while (*sp) { /* * The only change between this and hex_to_sj is here. sj_to_cap only * translates characters greater or equal to 0x80 - make sure that here * we only do the reverse (that's why the strchr is used rather than * isxdigit. Based on fix from ado@elsie.nci.nih.gov (Arthur David Olson). */ if (*sp == hex_tag && (strchr ("89abcdefABCDEF", sp[1]) != NULL) && isxdigit((int)sp[2])) { *dp++ = (hex2bin (sp[1])<<4) | (hex2bin (sp[2])); sp += 3; } else *dp++ = *sp++; } *dp = '\0'; if (overwrite) { pstrcpy ((char *) from, (char *) cvtbuf); return (char *) from; } else { return cvtbuf; }}/******************************************************************* kanji/kana -> ":xx" - CAP format.********************************************************************/static char *sj_to_cap(char *from, BOOL overwrite){ unsigned char *sp, *dp; sp = (unsigned char*) from; dp = (unsigned char*) cvtbuf; while (*sp) { if (*sp >= 0x80) { *dp++ = hex_tag; *dp++ = bin2hex (((*sp)>>4)&0x0f); *dp++ = bin2hex ((*sp)&0x0f); sp++; } else { *dp++ = *sp++; } } *dp = '\0'; if (overwrite) { pstrcpy ((char *) from, (char *) cvtbuf); return (char *) from; } else { return cvtbuf; }}/******************************************************************* sj to sj********************************************************************/static char *sj_to_sj(char *from, BOOL overwrite){ if (!overwrite) { pstrcpy (cvtbuf, (char *) from); return cvtbuf; } else { return (char *) from; }}/************************************************************************ conversion: _dos_to_unix _unix_to_dos************************************************************************/static void setup_string_function(int codes){ switch (codes) { default: _dos_to_unix = dos2unix_format; _unix_to_dos = unix2dos_format; break; case SJIS_CODE: _dos_to_unix = sj_to_sj; _unix_to_dos = sj_to_sj; break; case EUC_CODE: _dos_to_unix = sj_to_euc; _unix_to_dos = euc_to_sj; break; case JIS7_CODE: _dos_to_unix = sj_to_jis7; _unix_to_dos = jis7_to_sj; break; case JIS8_CODE: _dos_to_unix = sj_to_jis8; _unix_to_dos = jis8_to_sj; break; case JUNET_CODE: _dos_to_unix = sj_to_junet; _unix_to_dos = junet_to_sj; break; case HEX_CODE: _dos_to_unix = sj_to_hex; _unix_to_dos = hex_to_sj; break; case CAP_CODE: _dos_to_unix = sj_to_cap; _unix_to_dos = cap_to_sj; break; }}/************************************************************************ Interpret coding system.************************************************************************/void interpret_coding_system(char *str){ int codes = UNKNOWN_CODE; if (strequal (str, "sjis")) { codes = SJIS_CODE; } else if (strequal (str, "euc")) { codes = EUC_CODE; } else if (strequal (str, "cap")) { codes = CAP_CODE; hex_tag = HEXTAG; } else if (strequal (str, "hex")) { codes = HEX_CODE; hex_tag = HEXTAG; } else if (!strncasecmp (str, "hex", 3)) { codes = HEX_CODE; hex_tag = (str[3] ? str[3] : HEXTAG); } else if (strequal (str, "j8bb")) { codes = JIS8_CODE; jis_kso = 'B'; jis_ksi = 'B'; } else if (strequal (str, "j8bj") || strequal (str, "jis8")) { codes = JIS8_CODE; jis_kso = 'B'; jis_ksi = 'J'; } else if (strequal (str, "j8bh")) { codes = JIS8_CODE; jis_kso = 'B'; jis_ksi = 'H'; } else if (strequal (str, "j8@b")) { codes = JIS8_CODE; jis_kso = '@'; jis_ksi = 'B'; } else if (strequal (str, "j8@j")) { codes = JIS8_CODE; jis_kso = '@'; jis_ksi = 'J'; } else if (strequal (str, "j8@h")) { codes = JIS8_CODE; jis_kso = '@'; jis_ksi = 'H'; } else if (strequal (str, "j7bb")) { codes = JIS7_CODE; jis_kso = 'B'; jis_ksi = 'B'; } else if (strequal (str, "j7bj") || strequal (str, "jis7")) { codes = JIS7_CODE; jis_kso = 'B'; jis_ksi = 'J'; } else if (strequal (str, "j7bh")) { codes = JIS7_CODE; jis_kso = 'B'; jis_ksi = 'H'; } else if (strequal (str, "j7@b")) { codes = JIS7_CODE; jis_kso = '@'; jis_ksi = 'B'; } else if (strequal (str, "j7@j")) { codes = JIS7_CODE; jis_kso = '@'; jis_ksi = 'J'; } else if (strequal (str, "j7@h")) { codes = JIS7_CODE; jis_kso = '@'; jis_ksi = 'H'; } else if (strequal (str, "jubb")) { codes = JUNET_CODE; jis_kso = 'B'; jis_ksi = 'B'; } else if (strequal (str, "jubj") || strequal (str, "junet")) { codes = JUNET_CODE; jis_kso = 'B'; jis_ksi = 'J'; } else if (strequal (str, "jubh")) { codes = JUNET_CODE; jis_kso = 'B'; jis_ksi = 'H'; } else if (strequal (str, "ju@b")) { codes = JUNET_CODE; jis_kso = '@'; jis_ksi = 'B'; } else if (strequal (str, "ju@j")) { codes = JUNET_CODE; jis_kso = '@'; jis_ksi = 'J'; } else if (strequal (str, "ju@h")) { codes = JUNET_CODE; jis_kso = '@'; jis_ksi = 'H'; } setup_string_function (codes);}/******************************************************************* Non multibyte char function.*******************************************************************/ static size_t skip_non_multibyte_char(char c){ return 0;}/******************************************************************* Function that always says a character isn't multibyte.*******************************************************************/static BOOL not_multibyte_char_1(char c){ return False;}/******************************************************************* Function to determine if we are in a multibyte code page.*******************************************************************/static BOOL is_multibyte_codepage_val = False;BOOL is_multibyte_codepage(void){ return is_multibyte_codepage_val;}/******************************************************************* Setup the function pointers for the functions that are replaced when multi-byte codepages are used. The dos_to_unix and unix_to_dos function pointers are only replaced by setup_string_function called by interpret_coding_system above.*******************************************************************/void initialize_multibyte_vectors( int client_codepage){ switch( client_codepage ) { case KANJI_CODEPAGE: multibyte_strchr = sj_strchr; multibyte_strrchr = sj_strrchr; multibyte_strstr = sj_strstr; multibyte_strtok = sj_strtok; _skip_multibyte_char = skip_kanji_multibyte_char; is_multibyte_char_1 = is_kanji_multibyte_char_1; is_multibyte_codepage_val = True; break; case HANGUL_CODEPAGE: multibyte_strchr = generic_multibyte_strchr; multibyte_strrchr = generic_multibyte_strrchr; multibyte_strstr = generic_multibyte_strstr; multibyte_strtok = generic_multibyte_strtok; _skip_multibyte_char = skip_generic_multibyte_char; is_multibyte_char_1 = hangul_is_multibyte_char_1; is_multibyte_codepage_val = True; break; case BIG5_CODEPAGE: multibyte_strchr = generic_multibyte_strchr; multibyte_strrchr = generic_multibyte_strrchr; multibyte_strstr = generic_multibyte_strstr; multibyte_strtok = generic_multibyte_strtok; _skip_multibyte_char = skip_generic_multibyte_char; is_multibyte_char_1 = big5_is_multibyte_char_1; is_multibyte_codepage_val = True; break; case SIMPLIFIED_CHINESE_CODEPAGE: multibyte_strchr = generic_multibyte_strchr; multibyte_strrchr = generic_multibyte_strrchr; multibyte_strstr = generic_multibyte_strstr; multibyte_strtok = generic_multibyte_strtok; _skip_multibyte_char = skip_generic_multibyte_char; is_multibyte_char_1 = simpch_is_multibyte_char_1; is_multibyte_codepage_val = True; break; /* * Single char size code page. */ default: multibyte_strchr = (const char *(*)(const char *, int )) strchr; multibyte_strrchr = (const char *(*)(const char *, int )) strrchr; multibyte_strstr = (const char *(*)(const char *, const char *)) strstr; multibyte_strtok = (char *(*)(char *, const char *)) strtok; _skip_multibyte_char = skip_non_multibyte_char; is_multibyte_char_1 = not_multibyte_char_1; is_multibyte_codepage_val = False; break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -