static void putstr(int mode, STR tp) { if (mode == ESCOFF) { fprintf(cur_fpo, "%s", tp); } else if (*tp == '\0') { fprintf(cur_fpo, "||"); // ヌル文字列を表す } else { if (num(tp)) { // read.h fputc('\\', cur_fpo); // 数値ではなく数字の場合は見分けるために'\\'を接頭辞としてつける } do { if (iskanji(*tp) && iskanji2(*(tp+1))) { fputc(*tp++, cur_fpo); fputc(*tp++, cur_fpo); } else if (!isprkana(*tp)) { fprintf(cur_fpo, "#\\%03d", *tp++); } else { if (isesc(*tp)) { fputc('\\', cur_fpo); } fputc(*tp++, cur_fpo); } } while (*tp != '\0'); } }
/* コマンドライン引数を分割する (レスポンスファイルは利用しない。)*/ void split_cmdline(const char *cmdline,std::vector<std::string> &files) { const char *ptr=cmdline; int quote_mode=0; files.clear(); while(isspace((unsigned char)*ptr)){ptr++;} while(*ptr){ std::string file; while(((!isspace((unsigned char)*ptr)) || quote_mode) && *ptr!='\0'){ if(*ptr=='"'){ quote_mode = !quote_mode; ptr++; }else{ #ifdef KANJI /* if 2 byte charactor then copy on more byte */ if(iskanji1(*ptr) && iskanji2(*(ptr+1))){ file.push_back(*ptr); ptr++; } #endif file.push_back(*ptr); ptr++; } } files.push_back(file); while(isspace((unsigned char)*ptr)){ptr++;} } }
void main() { int i; for( i = 0; i < SIZE; i++ ) { printf( "Char does %shave a valid second byte\n", ( iskanji2( chars[i] ) ) ? "" : "not " ); } }
int main() { int c, d; while ((c = getchar()) != EOF) { if (iskanji(c)) { d = getchar(); if (iskanji2(d)) { jis(&c, &d); putchar(c | 0x80); putchar(d | 0x80); } else { putchar(c); if (d != EOF) putchar(d); } } else putchar(c); } return EXIT_SUCCESS; }
_WCRTLINK FJSTRING _WCI86FAR _fjstrrev( JCHAR _WCFAR *s ) { JCHAR _WCFAR *p, _WCFAR *q, _WCFAR *r; p = s; q = p + _fstrlen( p ); while( p < q ) { if( iskanji( *p ) ) { if( iskanji2( *( r = p + 1 ) ) ) { *p ^= *r; *r ^= *p; *p++ ^= *r; } } p++; } p = s; while( p < --q ) { *p ^= *q; *q ^= *p; *p++ ^= *q; } return( s ); }
static void putstr(int mode, STR tp) {//N// if(mode == ESCOFF) { fprintf(cur_fpo, "%s", tp); } else if(*tp == '\0') { fprintf(cur_fpo, "||"); } else { if(num(tp)) { fputc('\\', cur_fpo); } do { if(iskanji(*tp) && iskanji2(*(tp+1))) { fputc(*tp++, cur_fpo); fputc(*tp++, cur_fpo); } else if(!isprkana(*tp)) { fprintf(cur_fpo, "#\\%03d", *tp++); } else { if(isesc(*tp)) { fputc('\\', cur_fpo); } fputc(*tp++, cur_fpo); } } while(*tp != '\0'); } }
char *jstrcnv(char *jstr1, char const* jstr2, unsigned opts) { static UCHAR const tojkigo[] = { 0x49,0x68,0x94,0x90,0x93, /* !”#$% */ 0x95,0x66,0x69,0x6a,0x96, /* &’()* */ 0x7b,0x43,0x7c,0x44,0x5e, /* +,—./ */ 0x46,0x47,0x83,0x81,0x84, /* :;<=> */ 0x48,0x97, /* ?@ */ 0x6d,0x8f,0x6e, /* [¥] */ 0x4f,0x51,0x65, /* ^_‘ */ 0x6f,0x62, /* {| */ 0x70,0x50, /* } ̄ */ 0x42,0x75,0x76, /* 。「」 */ 0x41, /* 、 */ 0x45, /* ・ */ 0x4A,0x4B, /* ゛゜ */ 0x5f /* \ */ }; static UCHAR const jtokigo[] = { ' ', 0xA4/*'、'*/, 0xA1/*'。'*/, ',', '.', 0xA5/*'・'*/, ':', ';', '?', '!', 0xDE/*'゙'*/, 0xDF/*'゚'*/,0x00,0x00,0x00, '^', '~', '_',0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0xB0/*'ー'*/,0x00,0x00, '/', 0x00,0x00,0x00, '|',0x00,0x00,0x60,'\'', 0x00,'\"', '(', ')',0x00,0x00, '[', ']', '{' ,'}' ,0x00,0x00,0x00,0x00, 0xA2/*'「'*/, 0xA3/*'」'*/, 0x00,0x00,0x00,0x00, '+', '-',0x00,0x00,0x00, 0x00, '=',0x00, '<', '>',0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0/*'\\'*/, '$',0x00,0x00, '%', '#', '&', '*', '@' }; static UCHAR const tojkana[] = { 0x51,0x00,0x02,0x04,0x06,0x08, /* ヲ */ 0x42,0x44,0x46,0x22,0x00, /* ャ */ 0x01,0x03,0x85,0x07,0x09, /* ア */ 0x8a,0x8c,0x8e,0x90,0x92, /* カ */ 0x94,0x96,0x98,0x9a,0x9c, /* サ */ 0x9e,0xA0,0xA3,0xA5,0xA7, /* タ */ 0x29,0x2a,0x2b,0x2c,0x2d, /* ナ */ 0xAe,0xB1,0xB4,0xB7,0xBa, /* ハ */ 0x3d,0x3e,0x3f,0x40,0x41, /* マ */ 0x43,0x45,0x47, /* ヤ */ 0x48,0x49,0x4a,0x4b,0x4c, /* ラ */ 0x4e,0x52,0x00 /* ワ */ }; static UCHAR const jtokana[] = { 0x01,0x0b,0x02,0x0c,0x03,0x0d,0x04,0x0e,0x05,0x0f, /* あ */ 0x10,0x90,0x11,0x91,0x12,0x92,0x13,0x93,0x14,0x94, /* か */ 0x15,0x95,0x16,0x96,0x17,0x97,0x18,0x98,0x19,0x99, /* さ */ 0x1a,0x9a,0x1b,0x9b,0x09,0x1c,0x9c,0x1d,0x9d,0x1e,0x9e, /* た */ 0x1f,0x20,0x21,0x22,0x23, /* な */ 0x24,0xA4,0x64,0x25,0xA5,0x65,0x26,0xA6,0x66, /* は */ 0x27,0xA7,0x67,0x28,0xA8,0x68, 0x29,0x2a,0x2b,0x2c,0x2d, /* ま */ 0x06,0x2e,0x07,0x2f,0x08,0x30, /* や */ 0x31,0x32,0x33,0x34,0x35, /* ら */ 0xff,0x36,0xff,0xff,0x00,0x37,0x8d }; UCHAR f; UCHAR err_f; UCHAR * js1; UCHAR const* js2; UCHAR d; UCHAR c; unsigned jc; err_f = f = 0; js1 = (UCHAR*)jstr1; js2 = (UCHAR const*)jstr2; while ( (jc = *(js2++)) != '\0') { if (jc <= 0x80) { /* 半角文字のとき */ f = 0; if (jc <= 0x1f) { /* コントロール・コード */ ; } else if (jc == 0x20) { /* スペース */ if (opts & TOJSPC) jc = 0x8140; } else if (jc <= 0x2f) { /* 記号 */ c = '!'; goto KIGO; } else if (jc <= '9') { /* 数字 */ if (opts & TOJDGT) jc += 0x824f - '0'; } else if (jc <= '@') { /* 記号 */ c = ':' - 15; goto KIGO; } else if (jc <= 'Z') { /* アルファベットの大文字 */ if (opts & TOJALPH) jc += 0x825f - '@'; } else if (jc <= 0x60) { /* 記号 */ c = '[' - 22; if (jc == '\\' && (opts & YENOFF)) c = '\\' - 39; goto KIGO; } else if (jc <= 'z') { /* アルファベットの小文字 */ if (opts & TOJALPH) jc += 0x8280 - 0x60; } else if (jc <= 0x7e) { /* 記号 */ c = '{' - 28; KIGO: if (opts & TOJPUN) jc = 0x8100 + tojkigo[jc - c]; } } else { if (jc <= 0x9f) { /* シフトJIS1バイト目 */ goto SJIS; } else if (jc == 0xa0) { ; } else if (jc <= 0xa4) { /* 半角仮名記号 */ if (opts & TOJKPUN) jc = 0x8100 + tojkigo[jc - 0xA1/*'。'*/ + 32]; } else if (jc == 0xa5 || jc == 0xb0) {/* 半角なかてん||(ー) */ if ( (f == 1 && (opts & (TOJKATA|TOJHIRA))) || (f != 1 && (opts & TOJKPUN)) ) { jc = (jc == 0xa5) ? 0x8145 : 0x815b; } } else if (jc <= 0xdd) { /* 半角カナ */ f = 1; if (opts & (TOJKATA|TOJHIRA)) { c = tojkana[jc - 0xA6/*'ヲ'*/]; d = c & 0x7f; if (*js2 == 0xDE/*'゙'*/ && (c & 0x80)) { ++js2; if (jc == 0xB3/*'ウ'*/ && (opts & TOJKATA) && ((opts & DAKUOFF) == 0) ) { jc = 0x8394; goto KJ1; } else ++d; } else if (*js2 == 0xDF/*'゚'*/ && (jc >= 0xCA/*'ハ'*/ && jc <= 0xCE/*'ホ'*/) && ((opts & DAKUOFF) == 0) ) { ++js2; d += 2; } if (opts & TOJKATA) { if (d > 0x3e) ++d; jc = d + 0x8340; } else { jc = d + 0x829f; } } } else if (jc <= 0xdf) { /* 半角濁音・半濁音 */ if ((f==1 && (opts&(TOJKATA|TOJHIRA))) || (opts&TOJKPUN) ) jc = 0x8100 + tojkigo[jc - 0xDE/*'゙'*/ + 37]; } else if (jc <= 0xfc) { /* シフトJIS */ SJIS: if ((c = *(js2++)) == '\0') /* 2バイト目が'\0' */ break;/* exit while */ else if (iskanji2(c) == 0) { /* 2バイト目が不正のとき*/ f = 2; err_f = 1; if (c < 0x08) continue; else if (c == 0x09) goto ERR1; else if (c <= 0x1f) continue; else if (c <= 0x3f) { ERR1: --js2; continue; } else if (c == 0x7f || c >= 0xfd) continue; } if (jc == 0x81) { /* 全角記号 */ if (c == 0x40 && (opts & JSPC2SPC)) { f = 2; *(js1++) = ' '; jc = ' '; } else if(c==0x5b||c==0x4a||c==0x4b||c==0x45) { /* ー ゛ ゜ ・ */ if ( (f == 3 && (opts & JTOHIRA)) ||(f == 4 && (opts & JTOKATA)) ||(f != 3 && f != 4 && (opts & JTOKPUN)) ) { goto JKIGO; } else { goto JCC; } } else if(c==0x41||c==0x42||c==0x75||c==0x76) { /* 、 。 「 」 */ if (opts & JTOKPUN) goto JKIGO; else goto JCC; } else if ( (c <= 0x97 && (opts & JTOPUNS)) ) { f = 2; if (opts & YENOFF) { if (c == 0x5f) { /*\*/ jc = '\\'; goto KJ1; } } else { if (c == 0x8f) { /*¥*/ jc = '\\'; goto KJ1; } } JKIGO: if ((d = jtokigo[c - 0x40]) == 0x00) goto JCC; jc = d; } else goto JCC; } else if (jc == 0x82) { if (c >= 0x4f && c <= 0x58) { /* 全角数字 */ f = 2; if (opts & JTODGT) jc = c - 0x4f + '0'; else goto JCC; } else if (c >= 0x60 && c <= 0x79) {/* 全角アルファベット */ f = 2; if (opts & JTOALPH) jc = c - 0x60 + 'A'; else goto JCC; } else if (c >= 0x81 && c <= 0x9a) {/* 全角アルファベット */ f = 2; if (opts & JTOALPH) jc = c - 0x81 + 'a'; else goto JCC; } else { f = 3; if (c >= 0x9f && c <= 0xf1) { /* ひらがな */ if (opts & JTOHIRA) { d = c - 0x9f; goto JKANA; } else goto JCC; } else goto JCC; } } else if (jc == 0x83) { f = 4; if (c >= 0x40 && c <= 0x94) {/*カタカナ*/ if (opts & JTOKATA) { d = c - 0x40; if (d > 0x3e) --d; JKANA: d = jtokana[d]; if (d == 0xFF) goto JCC; jc = (d & 0x3f) + 0xA6/*'ヲ'*/; if (d & 0x80) { *(js1++) = (UCHAR)jc; jc = 0xDE/*'゙'*/; } else if (d & 0x40) { *(js1++) = (UCHAR)jc; jc = 0xDF/*'゚'*/; } } else goto JCC; } else goto JCC; } else { f = 2; JCC: /* 変換しないとき */ *js1++ = (UCHAR)jc; jc = c; } } /* else { ; } */ } KJ1: if (jc > 0xff) { *(js1++) = (UCHAR)(jc / 0x100); jc &= 0xff; } *(js1++) = (UCHAR)jc; } /* end of while */ *js1 = '\0'; if (err_f) return NULL; else return jstr1; }