void *X(malloc_plain)(size_t n) { void *p; if (n == 0) n = 1; p = real_malloc(n); CK(p); #ifdef MIN_ALIGMENT A((((uintptr_t)p) % MIN_ALIGNMENT) == 0); #endif return p; }
/* * UTF-16 => wchar */ int mbfl_filt_conv_utf16_wchar(int c, mbfl_convert_filter *filter) { int n, endian; endian = filter->status & 0xff00; switch (filter->status & 0x0f) { case 0: if (endian) { n = c & 0xff; } else { n = (c & 0xff) << 8; } filter->cache |= n; filter->status++; break; default: if (endian) { n = (c & 0xff) << 8; } else { n = c & 0xff; } n |= filter->cache & 0xffff; filter->status &= ~0x0f; if (n >= 0xd800 && n < 0xdc00) { filter->cache = ((n & 0x3ff) << 16) + 0x400000; } else if (n >= 0xdc00 && n < 0xe000) { n &= 0x3ff; n |= (filter->cache & 0xfff0000) >> 6; filter->cache = 0; if (n >= MBFL_WCSPLANE_SUPMIN && n < MBFL_WCSPLANE_SUPMAX) { CK((*filter->output_function)(n, filter->data)); } else { /* illegal character */ n &= MBFL_WCSGROUP_MASK; n |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(n, filter->data)); } } else {
/* * wchar => HZ */ int mbfl_filt_conv_wchar_hz(int c, mbfl_convert_filter *filter) { int s; s = 0; if (c >= ucs_a1_cp936_table_min && c < ucs_a1_cp936_table_max) { s = ucs_a1_cp936_table[c - ucs_a1_cp936_table_min]; } else if (c >= ucs_a2_cp936_table_min && c < ucs_a2_cp936_table_max) { s = ucs_a2_cp936_table[c - ucs_a2_cp936_table_min]; } else if (c >= ucs_a3_cp936_table_min && c < ucs_a3_cp936_table_max) { s = ucs_a3_cp936_table[c - ucs_a3_cp936_table_min]; } else if (c >= ucs_i_cp936_table_min && c < ucs_i_cp936_table_max) { s = ucs_i_cp936_table[c - ucs_i_cp936_table_min]; } else if (c >= ucs_hff_cp936_table_min && c < ucs_hff_cp936_table_max) { s = ucs_hff_cp936_table[c - ucs_hff_cp936_table_min]; } if (s & 0x8000) { s -= 0x8080; } if (s <= 0) { if (c == 0) { s = 0; } else if (s <= 0) { s = -1; } } else if ((s >= 0x80 && s < 0x2121) || (s > 0x8080)) { s = -1; } if (s >= 0) { if (s < 0x80) { /* ASCII */ if ((filter->status & 0xff00) != 0) { CK((*filter->output_function)(0x7e, filter->data)); /* '~' */ CK((*filter->output_function)(0x7d, filter->data)); /* '}' */ } filter->status = 0; if (s == 0x7e){ CK((*filter->output_function)(0x7e, filter->data)); } CK((*filter->output_function)(s, filter->data)); } else { /* GB 2312-80 */ if ((filter->status & 0xff00) != 0x200) { CK((*filter->output_function)(0x7e, filter->data)); /* '~' */ CK((*filter->output_function)(0x7b, filter->data)); /* '{' */ } filter->status = 0x200; CK((*filter->output_function)((s >> 8) & 0x7f, filter->data)); CK((*filter->output_function)(s & 0x7f, filter->data)); } } else { if (filter->illegal_mode != MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE) {
int main (void) { size_t b_size = 2; char *b = malloc (b_size); ASSERT (b); /* Ideally we would rely on the snprintf-posix module, in which case this guard would not be required, but due to limitations in gnulib's implementation (see modules/snprintf-posix), we cannot. */ if (snprintf (b, b_size, "%ju", (uintmax_t) 3) == 1 && b[0] == '3' && b[1] == '\0') { CK (int, inttostr); CK (unsigned int, uinttostr); CK (off_t, offtostr); CK (uintmax_t, umaxtostr); CK (intmax_t, imaxtostr); return 0; } /* snprintf doesn't accept %ju; skip this test. */ return 77; }
/* * UCS-2BE => wchar */ int mbfl_filt_conv_ucs2be_wchar(int c, mbfl_convert_filter *filter) { int n; if (filter->status == 0) { filter->status = 1; n = (c & 0xff) << 8; filter->cache = n; } else { filter->status = 0; n = (c & 0xff) | filter->cache; CK((*filter->output_function)(n, filter->data)); } return c; }
void FlatCodeGen::COND_TRANSLATE() { out << " _widec = " << GET_KEY() << ";\n"; out << " _keys = " << ARR_OFF( CK(), "(" + vCS() + "<<1)" ) << ";\n" " _conds = " << ARR_OFF( C(), CO() + "[" + vCS() + "]" ) << ";\n" "\n" " _slen = " << CSP() << "[" << vCS() << "];\n" " _cond = _slen > 0 && _keys[0] <=" << GET_WIDE_KEY() << " &&\n" " " << GET_WIDE_KEY() << " <= _keys[1] ?\n" " _conds[" << GET_WIDE_KEY() << " - _keys[0]] : 0;\n" "\n"; out << " switch ( _cond ) {\n"; for ( CondSpaceList::Iter csi = condSpaceList; csi.lte(); csi++ ) { GenCondSpace *condSpace = csi; out << " case " << condSpace->condSpaceId + 1 << ": {\n"; out << TABS(2) << "_widec = " << CAST(WIDE_ALPH_TYPE()) << "(" << KEY(condSpace->baseKey) << " + (" << GET_KEY() << " - " << KEY(keyOps->minKey) << "));\n"; for ( GenCondSet::Iter csi = condSpace->condSet; csi.lte(); csi++ ) { out << TABS(2) << "if ( "; CONDITION( out, *csi ); Size condValOffset = ((1 << csi.pos()) * keyOps->alphSize()); out << " ) _widec += " << condValOffset << ";\n"; } out << " }\n"; out << " break;\n"; } SWITCH_DEFAULT(); out << " }\n"; }
int mbfl_filt_conv_byte4be_wchar(int c, mbfl_convert_filter *filter) { int n; if (filter->status == 0) { filter->status = 1; n = (c & 0xff) << 24; filter->cache = n; } else if (filter->status == 1) { filter->status = 2; n = (c & 0xff) << 16; filter->cache |= n; } else if (filter->status == 2) { filter->status = 3; n = (c & 0xff) << 8; filter->cache |= n; } else { filter->status = 0; n = (c & 0xff) | filter->cache; CK((*filter->output_function)(n, filter->data)); } return c; }
/* * armscii8 => wchar */ int mbfl_filt_conv_armscii8_wchar(int c, mbfl_convert_filter *filter) { int s; if (c >= 0 && c < armscii8_ucs_table_min) { s = c; } else if (c >= armscii8_ucs_table_min && c < 0x100) { s = armscii8_ucs_table[c - armscii8_ucs_table_min]; if (s <= 0) { s = c; s &= MBFL_WCSPLANE_MASK; s |= MBFL_WCSPLANE_ARMSCII8; } } else { s = c; s &= MBFL_WCSGROUP_MASK; s |= MBFL_WCSGROUP_THROUGH; } CK((*filter->output_function)(s, filter->data)); return c; }
/* * ISO-8859-13 => wchar */ int mbfl_filt_conv_8859_13_wchar(int c, mbfl_convert_filter *filter) { int s; if (c >= 0 && c < 0xa0) { s = c; } else if (c >= 0xa0 && c < 0x100) { s = iso8859_13_ucs_table[c - 0xa0]; if (s <= 0) { s = c; s &= MBFL_WCSPLANE_MASK; s |= MBFL_WCSPLANE_8859_13; } } else { s = c; s &= MBFL_WCSGROUP_MASK; s |= MBFL_WCSGROUP_THROUGH; } CK((*filter->output_function)(s, filter->data)); return c; }
/* * any => HTML */ int mbfl_filt_conv_html_enc(int c, mbfl_convert_filter *filter) { int tmp[64]; int i; unsigned int uc; const mbfl_html_entity_entry *e; if (c < sizeof(htmlentitifieds) / sizeof(htmlentitifieds[0]) && htmlentitifieds[c] != 1) { CK((*filter->output_function)(c, filter->data)); } else { CK((*filter->output_function)('&', filter->data)); for (i = 0; (e = &mbfl_html_entity_list[i])->name != NULL; i++) { if (c == e->code) { char *p; for (p = e->name; *p != '\0'; p++) { CK((*filter->output_function)((int)*p, filter->data)); } goto last; } } { int *p = tmp + sizeof(tmp) / sizeof(tmp[0]); CK((*filter->output_function)('#', filter->data)); uc = (unsigned int)c; *(--p) = '\0'; do { *(--p) = "0123456789"[uc % 10]; uc /= 10; } while (uc); for (; *p != '\0'; p++) { CK((*filter->output_function)(*p, filter->data)); } } last: CK((*filter->output_function)(';', filter->data)); } return c; }
/* * cp1254 => wchar */ int mbfl_filt_conv_cp1254_wchar(int c, mbfl_convert_filter *filter) { int s; if (c >= 0 && c < cp1254_ucs_table_min) { s = c; } else if (c >= cp1254_ucs_table_min && c < 0x100) { s = cp1254_ucs_table[c - cp1254_ucs_table_min]; if (s <= 0) { s = c; s &= MBFL_WCSPLANE_MASK; s |= MBFL_WCSPLANE_CP1254; } } else { s = c; s &= MBFL_WCSGROUP_MASK; s |= MBFL_WCSGROUP_THROUGH; } CK((*filter->output_function)(s, filter->data)); return c; }
int mbfl_filt_conv_html_dec(int c, mbfl_convert_filter *filter) { int pos, ent = 0; mbfl_html_entity_entry *entity; char *buffer = (char*)filter->opaque; if (!filter->status) { if (c == '&' ) { filter->status = 1; buffer[0] = '&'; } else { CK((*filter->output_function)(c, filter->data)); } } else { if (c == ';') { if (buffer[1]=='#') { if (filter->status > 2 && (buffer[2] == 'x' || buffer[2] == 'X')) { if (filter->status > 3) { /* numeric entity */ for (pos=3; pos<filter->status; pos++) { int v = buffer[pos]; if (v >= '0' && v <= '9') { v = v - '0'; } else if (v >= 'A' && v <= 'F') { v = v - 'A' + 10; } else if (v >= 'a' && v <= 'f') { v = v - 'a' + 10; } else { ent = -1; break; } ent = ent * 16 + v; } } else { ent = -1; } } else { /* numeric entity */ if (filter->status > 2) { for (pos=2; pos<filter->status; pos++) { int v = buffer[pos]; if (v >= '0' && v <= '9') { v = v - '0'; } else { ent = -1; break; } ent = ent*10 + v; } } else { ent = -1; } } if (ent >= 0 && ent < 0x110000) { CK((*filter->output_function)(ent, filter->data)); } else { for (pos = 0; pos < filter->status; pos++) { CK((*filter->output_function)(buffer[pos], filter->data)); } CK((*filter->output_function)(c, filter->data)); } filter->status = 0; /*php_error_docref("ref.mbstring" TSRMLS_CC, E_NOTICE, "mbstring decoded '%s'=%d", buffer, ent);*/ } else { /* named entity */ buffer[filter->status] = 0; entity = (mbfl_html_entity_entry *)mbfl_html_entity_list; while (entity->name) { if (!strcmp(buffer+1, entity->name)) { ent = entity->code; break; } entity++; } if (ent) { /* decoded */ CK((*filter->output_function)(ent, filter->data)); filter->status = 0; /*php_error_docref("ref.mbstring" TSRMLS_CC, E_NOTICE,"mbstring decoded '%s'=%d", buffer, ent);*/ } else { /* failure */ buffer[filter->status++] = ';'; buffer[filter->status] = 0; /* php_error_docref("ref.mbstring" TSRMLS_CC, E_WARNING, "mbstring cannot decode '%s'", buffer); */ mbfl_filt_conv_html_dec_flush(filter); } } } else { /* add character */ buffer[filter->status++] = c; /* add character and check */ if (!strchr(html_entity_chars, c) || filter->status+1==html_enc_buffer_size || (c=='#' && filter->status>2)) { /* illegal character or end of buffer */ if (c=='&') filter->status--; buffer[filter->status] = 0; /* php_error_docref("ref.mbstring" TSRMLS_CC, E_WARNING, "mbstring cannot decode '%s'", buffer)l */ mbfl_filt_conv_html_dec_flush(filter); if (c=='&') { buffer[filter->status++] = '&'; } } } } return c; }
/* * EUC-JP => wchar */ int mbfl_filt_conv_eucjp_wchar(int c, mbfl_convert_filter *filter) { int c1, s, w; switch (filter->status) { case 0: if (c >= 0 && c < 0x80) { /* latin */ CK((*filter->output_function)(c, filter->data)); } else if (c > 0xa0 && c < 0xff) { /* X 0208 first char */ filter->status = 1; filter->cache = c; } else if (c == 0x8e) { /* kana first char */ filter->status = 2; } else if (c == 0x8f) { /* X 0212 first char */ filter->status = 3; } else { w = c & MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; case 1: /* got first half */ filter->status = 0; c1 = filter->cache; if (c > 0xa0 && c < 0xff) { s = (c1 - 0xa1)*94 + c - 0xa1; if (s >= 0 && s < jisx0208_ucs_table_size) { w = jisx0208_ucs_table[s]; } else { w = 0; } if (w <= 0) { w = ((c1 & 0x7f) << 8) | (c & 0x7f); w &= MBFL_WCSPLANE_MASK; w |= MBFL_WCSPLANE_JIS0208; } CK((*filter->output_function)(w, filter->data)); } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ CK((*filter->output_function)(c, filter->data)); } else { w = (c1 << 8) | c; w &= MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; case 2: /* got 0x8e */ filter->status = 0; if (c > 0xa0 && c < 0xe0) { w = 0xfec0 + c; CK((*filter->output_function)(w, filter->data)); } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ CK((*filter->output_function)(c, filter->data)); } else { w = 0x8e00 | c; w &= MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; case 3: /* got 0x8f, X 0212 first char */ if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ CK((*filter->output_function)(c, filter->data)); filter->status = 0; } else { filter->status++; filter->cache = c; } break; case 4: /* got 0x8f, X 0212 second char */ filter->status = 0; c1 = filter->cache; if (c1 > 0xa0 && c1 < 0xff && c > 0xa0 && c < 0xff) { s = (c1 - 0xa1)*94 + c - 0xa1; if (s >= 0 && s < jisx0212_ucs_table_size) { w = jisx0212_ucs_table[s]; } else { w = 0; } if (w <= 0) { w = ((c1 & 0x7f) << 8) | (c & 0x7f); w &= MBFL_WCSPLANE_MASK; w |= MBFL_WCSPLANE_JIS0212; } CK((*filter->output_function)(w, filter->data)); } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ CK((*filter->output_function)(c, filter->data)); } else { w = (c1 << 8) | c | 0x8f0000; w &= MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; default: filter->status = 0; break; } return c; }
void TabCodeGen::writeData() { /* If there are any transtion functions then output the array. If there * are none, don't bother emitting an empty array that won't be used. */ if ( redFsm->anyActions() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActArrItem), A() ); ACTIONS_ARRAY(); CLOSE_ARRAY() << "\n"; } if ( redFsm->anyConditions() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxCondOffset), CO() ); COND_OFFSETS(); CLOSE_ARRAY() << "\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxCondLen), CL() ); COND_LENS(); CLOSE_ARRAY() << "\n"; OPEN_ARRAY( WIDE_ALPH_TYPE(), CK() ); COND_KEYS(); CLOSE_ARRAY() << "\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxCondSpaceId), C() ); COND_SPACES(); CLOSE_ARRAY() << "\n"; } OPEN_ARRAY( ARRAY_TYPE(redFsm->maxKeyOffset), KO() ); KEY_OFFSETS(); CLOSE_ARRAY() << "\n"; OPEN_ARRAY( WIDE_ALPH_TYPE(), K() ); KEYS(); CLOSE_ARRAY() << "\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxSingleLen), SL() ); SINGLE_LENS(); CLOSE_ARRAY() << "\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxRangeLen), RL() ); RANGE_LENS(); CLOSE_ARRAY() << "\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxIndexOffset), IO() ); INDEX_OFFSETS(); CLOSE_ARRAY() << "\n"; if ( useIndicies ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxIndex), I() ); INDICIES(); CLOSE_ARRAY() << "\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxState), TT() ); TRANS_TARGS_WI(); CLOSE_ARRAY() << "\n"; if ( redFsm->anyActions() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActionLoc), TA() ); TRANS_ACTIONS_WI(); CLOSE_ARRAY() << "\n"; } } else { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxState), TT() ); TRANS_TARGS(); CLOSE_ARRAY() << "\n"; if ( redFsm->anyActions() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActionLoc), TA() ); TRANS_ACTIONS(); CLOSE_ARRAY() << "\n"; } } if ( redFsm->anyToStateActions() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActionLoc), TSA() ); TO_STATE_ACTIONS(); CLOSE_ARRAY() << "\n"; } if ( redFsm->anyFromStateActions() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActionLoc), FSA() ); FROM_STATE_ACTIONS(); CLOSE_ARRAY() << "\n"; } if ( redFsm->anyEofActions() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActionLoc), EA() ); EOF_ACTIONS(); CLOSE_ARRAY() << "\n"; } if ( redFsm->anyEofTrans() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxIndexOffset+1), ET() ); EOF_TRANS(); CLOSE_ARRAY() << "\n"; } STATE_IDS(); }
/* * UTF-8 => wchar */ int mbfl_filt_conv_utf8_wchar(int c, mbfl_convert_filter *filter) { int s, c1, w = 0, flag = 0; retry: switch (filter->status & 0xff) { case 0x00: if (c < 0x80) { CK((*filter->output_function)(c, filter->data)); } else if (c >= 0xc2 && c <= 0xdf) { /* 2byte code first char: 0xc2-0xdf */ filter->status = 0x10; filter->cache = c & 0x1f; } else if (c >= 0xe0 && c <= 0xef) { /* 3byte code first char: 0xe0-0xef */ filter->status = 0x20; filter->cache = c & 0xf; } else if (c >= 0xf0 && c <= 0xf4) { /* 3byte code first char: 0xf0-0xf4 */ filter->status = 0x30; filter->cache = c & 0x7; } else { mbfl_filt_put_invalid_char(c, filter); } break; case 0x10: /* 2byte code 2nd char: 0x80-0xbf */ case 0x21: /* 3byte code 3rd char: 0x80-0xbf */ case 0x32: /* 4byte code 4th char: 0x80-0xbf */ filter->status = 0; if (c >= 0x80 && c <= 0xbf) { s = (filter->cache<<6) | (c & 0x3f); filter->cache = 0; CK((*filter->output_function)(s, filter->data)); } else { mbfl_filt_put_invalid_char(filter->cache, filter); goto retry; } break; case 0x20: /* 3byte code 2nd char: 0:0xa0-0xbf,D:0x80-9F,1-C,E-F:0x80-0x9f */ s = (filter->cache<<6) | (c & 0x3f); c1 = filter->cache & 0xf; if ((c >= 0x80 && c <= 0xbf) && ((c1 == 0x0 && c >= 0xa0) || (c1 == 0xd && c < 0xa0) || (c1 > 0x0 && c1 != 0xd))) { filter->cache = s; filter->status++; } else { mbfl_filt_put_invalid_char(filter->cache, filter); goto retry; } break; case 0x30: /* 4byte code 2nd char: 0:0x90-0xbf,1-3:0x80-0xbf,4:0x80-0x8f */ s = (filter->cache<<6) | (c & 0x3f); c1 = filter->cache & 0x7; if ((c >= 0x80 && c <= 0xbf) && ((c1 == 0x0 && c >= 0x90) || (c1 == 0x4 && c < 0x90) || (c1 > 0x0 && c1 != 0x4))) { filter->cache = s; filter->status++; } else { mbfl_filt_put_invalid_char(filter->cache, filter); goto retry; } break; case 0x31: /* 4byte code 3rd char: 0x80-0xbf */ if (c >= 0x80 && c <= 0xbf) { filter->cache = (filter->cache<<6) | (c & 0x3f); filter->status++; } else { mbfl_filt_put_invalid_char(filter->cache, filter); goto retry; } break; default: filter->status = 0; break; } return c; }
/* * wchar => eucJP-win */ int mbfl_filt_conv_wchar_eucjpwin(int c, mbfl_convert_filter *filter) { int c1, c2, s1; s1 = 0; if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) { s1 = ucs_a1_jis_table[c - ucs_a1_jis_table_min]; } else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) { s1 = ucs_a2_jis_table[c - ucs_a2_jis_table_min]; } else if (c >= ucs_i_jis_table_min && c < ucs_i_jis_table_max) { s1 = ucs_i_jis_table[c - ucs_i_jis_table_min]; } else if (c >= ucs_r_jis_table_min && c < ucs_r_jis_table_max) { s1 = ucs_r_jis_table[c - ucs_r_jis_table_min]; } else if (c >= 0xe000 && c < (0xe000 + 10*94)) { /* user (X0208 85ku - 94ku) */ s1 = c - 0xe000; c1 = s1/94 + 0x75; c2 = s1%94 + 0x21; s1 = (c1 << 8) | c2; } else if (c >= (0xe000 + 10*94) && c < (0xe000 + 20*94)) { /* user (X0212 85ku - 94ku) */ s1 = c - (0xe000 + 10*94); c1 = s1/94 + 0xf5; c2 = s1%94 + 0xa1; s1 = (c1 << 8) | c2; } if (s1 == 0xa2f1) { s1 = 0x2d62; /* NUMERO SIGN */ } if (s1 <= 0) { c1 = c & ~MBFL_WCSPLANE_MASK; if (c1 == MBFL_WCSPLANE_WINCP932) { s1 = c & MBFL_WCSPLANE_MASK; if (s1 >= ((85 + 0x20) << 8)) { /* 85ku - 120ku */ s1 = -1; } } else if (c1 == MBFL_WCSPLANE_JIS0208) { s1 = c & MBFL_WCSPLANE_MASK; if (s1 >= ((85 + 0x20) << 8)) { /* 85ku - 94ku */ s1 = -1; } } else if (c1 == MBFL_WCSPLANE_JIS0212) { s1 = c & MBFL_WCSPLANE_MASK; if (s1 >= ((83 + 0x20) << 8)) { /* 83ku - 94ku */ s1 = -1; } else { s1 |= 0x8080; } } else if (c == 0xa5) { /* YEN SIGN */ s1 = 0x216f; /* FULLWIDTH YEN SIGN */ } else if (c == 0x203e) { /* OVER LINE */ s1 = 0x2131; /* FULLWIDTH MACRON */ } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */ s1 = 0x2140; } else if (c == 0xff5e) { /* FULLWIDTH TILDE */ s1 = 0x2141; } else if (c == 0x2225) { /* PARALLEL TO */ s1 = 0x2142; } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */ s1 = 0x215d; } else if (c == 0xffe0) { /* FULLWIDTH CENT SIGN */ s1 = 0x2171; } else if (c == 0xffe1) { /* FULLWIDTH POUND SIGN */ s1 = 0x2172; } else if (c == 0xffe2) { /* FULLWIDTH NOT SIGN */ s1 = 0x224c; } else if (c == 0xff5e) { /* FULLWIDTH TILDE */ s1 = 0x2141; } else { s1 = -1; c1 = 0; c2 = cp932ext1_ucs_table_max - cp932ext1_ucs_table_min; while (c1 < c2) { /* CP932 vendor ext1 (13ku) */ const int oh = cp932ext1_ucs_table_min / 94; if (c == cp932ext1_ucs_table[c1]) { s1 = ((c1 / 94 + oh + 0x21) << 8) + (c1 % 94 + 0x21); break; } c1++; } if (s1 < 0) { c1 = 0; c2 = cp932ext3_ucs_table_max - cp932ext3_ucs_table_min; while (c1 < c2) { /* CP932 vendor ext3 (115ku - 119ku) */ if (c == cp932ext3_ucs_table[c1]) { if (c1 < cp932ext3_eucjp_table_size) { s1 = cp932ext3_eucjp_table[c1]; } break; } c1++; } } } if (c == 0) { s1 = 0; } else if (s1 <= 0) { s1 = -1; } } if (s1 >= 0) { if (s1 < 0x80) { /* latin */ CK((*filter->output_function)(s1, filter->data)); } else if (s1 < 0x100) { /* kana */ CK((*filter->output_function)(0x8e, filter->data)); CK((*filter->output_function)(s1, filter->data)); } else if (s1 < 0x8080) { /* X 0208 */ CK((*filter->output_function)(((s1 >> 8) & 0xff) | 0x80, filter->data)); CK((*filter->output_function)((s1 & 0xff) | 0x80, filter->data)); } else { /* X 0212 */
/* * HZ => wchar */ int mbfl_filt_conv_hz_wchar(int c, mbfl_convert_filter *filter) { int c1, s, w; switch (filter->status & 0xf) { /* case 0x00: ASCII */ /* case 0x10: GB2312 */ case 0: if (c == 0x7e) { filter->status += 2; } else if (filter->status == 0x10 && c > 0x20 && c < 0x7f) { /* DBCS first char */ filter->cache = c; filter->status += 1; } else if (c >= 0 && c < 0x80) { /* latin, CTLs */ CK((*filter->output_function)(c, filter->data)); } else { w = c & MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; /* case 0x11: GB2312 second char */ case 1: filter->status &= ~0xf; c1 = filter->cache; if (c1 > 0x20 && c1 < 0x7f && c > 0x20 && c < 0x7f) { s = (c1 - 1)*192 + c + 0x40; /* GB2312 */ if (s >= 0 && s < cp936_ucs_table_size) { w = cp936_ucs_table[s]; } else { w = 0; } if (w <= 0) { w = (c1 << 8) | c; w &= MBFL_WCSPLANE_MASK; w |= MBFL_WCSPLANE_GB2312; } CK((*filter->output_function)(w, filter->data)); } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ CK((*filter->output_function)(c, filter->data)); } else { w = (c1 << 8) | c; w &= MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; /* '~' */ case 2: if (c == 0x7d) { /* '}' */ filter->status = 0x0; } else if (c == 0x7b) { /* '{' */ filter->status = 0x10; } else if (c == 0x7e) { /* '~' */ filter->status = 0x0; CK((*filter->output_function)(0x007e, filter->data)); } break; default: filter->status = 0; break; } return c; }
/* * wchar => cp51932 */ int mbfl_filt_conv_wchar_cp51932(int c, mbfl_convert_filter *filter) { int c1, c2, s1; s1 = 0; if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) { s1 = ucs_a1_jis_table[c - ucs_a1_jis_table_min]; } else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) { s1 = ucs_a2_jis_table[c - ucs_a2_jis_table_min]; } else if (c >= ucs_i_jis_table_min && c < ucs_i_jis_table_max) { s1 = ucs_i_jis_table[c - ucs_i_jis_table_min]; } else if (c >= ucs_r_jis_table_min && c < ucs_r_jis_table_max) { s1 = ucs_r_jis_table[c - ucs_r_jis_table_min]; } if (s1 >= 0x8080) s1 = -1; /* we don't support JIS X0213 */ if (s1 <= 0) { c1 = c & ~MBFL_WCSPLANE_MASK; if (c1 == MBFL_WCSPLANE_WINCP932) { s1 = c & MBFL_WCSPLANE_MASK; if (s1 >= ((85 + 0x20) << 8)) { /* 85ku - 120ku */ s1 = -1; } } else if (c1 == MBFL_WCSPLANE_JIS0208) { s1 = c & MBFL_WCSPLANE_MASK; if ((s1 >= ((85 + 0x20) << 8) && /* 85ku - 94ku */ s1 <= ((88 + 0x20) << 8)) ||/* IBM extension */ (s1 >= ((93 + 0x20) << 8) && /* 89ku - 92ku */ s1 <= ((94 + 0x20) << 8))) { s1 = -1; } } else if (c == 0xa5) { /* YEN SIGN */ s1 = 0x005c; /* YEN SIGN */ } else if (c == 0x203e) { /* OVER LINE */ s1 = 0x007e; /* FULLWIDTH MACRON */ } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */ s1 = 0x2140; } else if (c == 0xff5e) { /* FULLWIDTH TILDE */ s1 = 0x2141; } else if (c == 0x2225) { /* PARALLEL TO */ s1 = 0x2142; } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */ s1 = 0x215d; } else if (c == 0xffe0) { /* FULLWIDTH CENT SIGN */ s1 = 0x2171; } else if (c == 0xffe1) { /* FULLWIDTH POUND SIGN */ s1 = 0x2172; } else if (c == 0xffe2) { /* FULLWIDTH NOT SIGN */ s1 = 0x224c; } else { s1 = -1; c1 = 0; c2 = cp932ext1_ucs_table_max - cp932ext1_ucs_table_min; while (c1 < c2) { /* CP932 vendor ext1 (13ku) */ if (c == cp932ext1_ucs_table[c1]) { s1 = ((c1/94 + 0x2d) << 8) + (c1%94 + 0x21); break; } c1++; } if (s1 < 0) { c1 = 0; c2 = cp932ext2_ucs_table_max - cp932ext2_ucs_table_min; while (c1 < c2) { /* CP932 vendor ext3 (115ku - 119ku) */ if (c == cp932ext2_ucs_table[c1]) { s1 = ((c1/94 + 0x79) << 8) +(c1%94 + 0x21); break; } c1++; } } } if (c == 0) { s1 = 0; } else if (s1 <= 0) { s1 = -1; } } if (s1 >= 0) { if (s1 < 0x80) { /* latin */ CK((*filter->output_function)(s1, filter->data)); } else if (s1 < 0x100) { /* kana */ CK((*filter->output_function)(0x8e, filter->data)); CK((*filter->output_function)(s1, filter->data)); } else if (s1 < 0x8080) { /* X 0208 */ CK((*filter->output_function)(((s1 >> 8) & 0xff) | 0x80, filter->data)); CK((*filter->output_function)((s1 & 0xff) | 0x80, filter->data)); } else { if (filter->illegal_mode != MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE) {
/* * JIS-ms => wchar */ int mbfl_filt_conv_jis_ms_wchar(int c, mbfl_convert_filter *filter) { int c1, s, w; retry: switch (filter->status & 0xf) { /* case 0x00: ASCII */ /* case 0x10: X 0201 latin */ /* case 0x20: X 0201 kana */ /* case 0x80: X 0208 */ /* case 0x90: X 0212 */ case 0: if (c == 0x1b) { filter->status += 2; } else if (c == 0x0e) { /* "kana in" */ filter->status = 0x20; } else if (c == 0x0f) { /* "kana out" */ filter->status = 0; } else if (filter->status == 0x10 && c == 0x5c) { /* YEN SIGN */ CK((*filter->output_function)(0xa5, filter->data)); } else if (filter->status == 0x10 && c == 0x7e) { /* OVER LINE */ CK((*filter->output_function)(0x203e, filter->data)); } else if (filter->status == 0x20 && c > 0x20 && c < 0x60) { /* kana */ CK((*filter->output_function)(0xff40 + c, filter->data)); } else if ((filter->status == 0x80 || filter->status == 0x90) && c > 0x20 && c < 0x93) { /* kanji first char */ filter->cache = c; filter->status += 1; } else if (c >= 0 && c < 0x80) { /* latin, CTLs */ CK((*filter->output_function)(c, filter->data)); } else if (c > 0xa0 && c < 0xe0) { /* GR kana */ CK((*filter->output_function)(0xfec0 + c, filter->data)); } else { w = c & MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; /* case 0x81: X 0208 second char */ /* case 0x91: X 0212 second char */ case 1: filter->status &= ~0xf; c1 = filter->cache; if (c > 0x20 && c < 0x7f) { s = (c1 - 0x21)*94 + c - 0x21; if (filter->status == 0x80) { if (s >= 0 && s < jisx0208_ucs_table_size) { w = jisx0208_ucs_table[s]; } else if (s >= cp932ext1_ucs_table_min && s < cp932ext1_ucs_table_max) { w = cp932ext1_ucs_table[s - cp932ext1_ucs_table_min]; } else if (s >= cp932ext2_ucs_table_min && s < cp932ext2_ucs_table_max) { w = cp932ext2_ucs_table[s - cp932ext2_ucs_table_min]; } else if (s >= cp932ext3_ucs_table_min && s < cp932ext3_ucs_table_max) { w = cp932ext3_ucs_table[s - cp932ext3_ucs_table_min]; } else if (s >= 94 * 94 && s < 114 * 94) { /* user-defined => PUA (Microsoft extended) */ w = s - 94*94 + 0xe000; } else { w = 0; } if (w <= 0) { w = (c1 << 8) | c; w &= MBFL_WCSPLANE_MASK; w |= MBFL_WCSPLANE_JIS0208; } } else { if (s >= 0 && s < jisx0212_ucs_table_size) { w = jisx0212_ucs_table[s]; } else { w = 0; } if (w <= 0) { w = (c1 << 8) | c; w &= MBFL_WCSPLANE_MASK; w |= MBFL_WCSPLANE_JIS0212; } } CK((*filter->output_function)(w, filter->data)); } else if (c == 0x1b) { filter->status += 2; } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ CK((*filter->output_function)(c, filter->data)); } else { w = (c1 << 8) | c; w &= MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; /* ESC */ /* case 0x02: */ /* case 0x12: */ /* case 0x22: */ /* case 0x82: */ /* case 0x92: */ case 2: if (c == 0x24) { /* '$' */ filter->status++; } else if (c == 0x28) { /* '(' */ filter->status += 3; } else { filter->status &= ~0xf; CK((*filter->output_function)(0x1b, filter->data)); goto retry; } break; /* ESC $ */ /* case 0x03: */ /* case 0x13: */ /* case 0x23: */ /* case 0x83: */ /* case 0x93: */ case 3: if (c == 0x40 || c == 0x42) { /* '@' or 'B' */ filter->status = 0x80; } else if (c == 0x28) { /* '(' */ filter->status++; } else { filter->status &= ~0xf; CK((*filter->output_function)(0x1b, filter->data)); CK((*filter->output_function)(0x24, filter->data)); goto retry; } break; /* ESC $ ( */ /* case 0x04: */ /* case 0x14: */ /* case 0x24: */ /* case 0x84: */ /* case 0x94: */ case 4: if (c == 0x40 || c == 0x42) { /* '@' or 'B' */ filter->status = 0x80; } else if (c == 0x44) { /* 'D' */ filter->status = 0x90; } else { filter->status &= ~0xf; CK((*filter->output_function)(0x1b, filter->data)); CK((*filter->output_function)(0x24, filter->data)); CK((*filter->output_function)(0x28, filter->data)); goto retry; } break; /* ESC ( */ /* case 0x05: */ /* case 0x15: */ /* case 0x25: */ /* case 0x85: */ /* case 0x95: */ case 5: if (c == 0x42 || c == 0x48) { /* 'B' or 'H' */ filter->status = 0; } else if (c == 0x4a) { /* 'J' */ filter->status = 0x10; } else if (c == 0x49) { /* 'I' */ filter->status = 0x20; } else { filter->status &= ~0xf; CK((*filter->output_function)(0x1b, filter->data)); CK((*filter->output_function)(0x28, filter->data)); goto retry; } break; default: filter->status = 0; break; } return c; }
void FFlatCodeGen::writeData() { if ( redFsm->anyConditions() ) { OPEN_ARRAY( WIDE_ALPH_TYPE(), CK() ); COND_KEYS(); CLOSE_ARRAY() << L"\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxCondSpan), CSP() ); COND_KEY_SPANS(); CLOSE_ARRAY() << L"\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxCond), C() ); CONDS(); CLOSE_ARRAY() << L"\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxCondIndexOffset), CO() ); COND_INDEX_OFFSET(); CLOSE_ARRAY() << L"\n"; } OPEN_ARRAY( WIDE_ALPH_TYPE(), K() ); KEYS(); CLOSE_ARRAY() << L"\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxSpan), SP() ); KEY_SPANS(); CLOSE_ARRAY() << L"\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxFlatIndexOffset), IO() ); FLAT_INDEX_OFFSET(); CLOSE_ARRAY() << L"\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxIndex), I() ); INDICIES(); CLOSE_ARRAY() << L"\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxState), TT() ); TRANS_TARGS(); CLOSE_ARRAY() << L"\n"; if ( redFsm->anyActions() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActListId), TA() ); TRANS_ACTIONS(); CLOSE_ARRAY() << L"\n"; } if ( redFsm->anyToStateActions() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActionLoc), TSA() ); TO_STATE_ACTIONS(); CLOSE_ARRAY() << L"\n"; } if ( redFsm->anyFromStateActions() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActionLoc), FSA() ); FROM_STATE_ACTIONS(); CLOSE_ARRAY() << L"\n"; } if ( redFsm->anyEofActions() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActListId), EA() ); EOF_ACTIONS(); CLOSE_ARRAY() << L"\n"; } if ( redFsm->anyEofTrans() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxIndexOffset+1), ET() ); EOF_TRANS(); CLOSE_ARRAY() << L"\n"; } STATE_IDS(); }
/* * UHC => wchar */ int mbfl_filt_conv_uhc_wchar(int c, mbfl_convert_filter *filter) { int c1, w = 0, flag = 0; switch (filter->status) { case 0: if (c >= 0 && c < 0x80) { /* latin */ CK((*filter->output_function)(c, filter->data)); } else if (c > 0x80 && c < 0xff && c != 0xc9) { /* dbcs lead byte */ filter->status = 1; filter->cache = c; } else { w = c & MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; case 1: /* dbcs second byte */ filter->status = 0; c1 = filter->cache; if ( c1 >= 0x81 && c1 <= 0xa0){ w = (c1 - 0x81)*190 + (c - 0x41); if (w >= 0 && w < uhc1_ucs_table_size) { flag = 1; w = uhc1_ucs_table[w]; } else { w = 0; } } else if ( c1 >= 0xa1 && c1 <= 0xc6){ w = (c1 - 0xa1)*190 + (c - 0x41); if (w >= 0 && w < uhc2_ucs_table_size) { flag = 2; w = uhc2_ucs_table[w]; } else { w = 0; } } else if ( c1 >= 0xc7 && c1 <= 0xfe){ w = (c1 - 0xc7)*94 + (c - 0xa1); if (w >= 0 && w < uhc3_ucs_table_size) { flag = 3; w = uhc3_ucs_table[w]; } else { w = 0; } } if (flag > 0){ if (w <= 0) { w = (c1 << 8) | c; w &= MBFL_WCSPLANE_MASK; w |= MBFL_WCSPLANE_UHC; } CK((*filter->output_function)(w, filter->data)); } else { if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ CK((*filter->output_function)(c, filter->data)); } else { w = (c1 << 8) | c; w &= MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } } break; default: filter->status = 0; break; } return c; }
R X(float_property)(const float_property p) { const R base = FLT_RADIX; const R eps = EPSILON; const R t = MANT_DIG; const R emin = MIN_EXP; const R emax = MAX_EXP; const R prec = eps * base; static R rmin = K(1.0); static R rmax = K(1.0); const R rnd = FLTROUND; static R sfmin = K(-1.0); static short first = TRUE; if (first) { /* Compute rmin */ { const INT n = 1 - MIN_EXP; INT i; for (i = 0; i < n; i++) rmin /= base; } /* Compute rmax */ { INT i; rmax -= eps; for (i = 0; i < emax; i++) rmax *= base; } /* Compute sfmin */ { R small = K(1.0) / rmax; sfmin = rmin; if (small >= sfmin) sfmin = small * (eps + K(1.0)); } first = FALSE; } if (p == NFFT_EPSILON) return eps; else if (p == NFFT_SAFE_MIN) return sfmin; else if (p == NFFT_BASE) return base; else if (p == NFFT_PRECISION) return prec; else if (p == NFFT_MANT_DIG) return t; else if (p == NFFT_FLTROUND) return rnd; else if (p == NFFT_E_MIN) return emin; else if (p == NFFT_R_MIN) return rmin; else if (p == NFFT_E_MAX) return emax; else if (p == NFFT_R_MAX) return rmax; else CK(0 /* cannot happen */); return K(-1.0); } /* dlamch_ */
void CSharpFlatCodeGen::writeData() { /* If there are any transtion functions then output the array. If there * are none, don't bother emitting an empty array that won't be used. */ if ( redFsm->anyActions() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActArrItem), A() ); ACTIONS_ARRAY(); CLOSE_ARRAY() << "\n"; } if ( redFsm->anyConditions() ) { OPEN_ARRAY( WIDE_ALPH_TYPE(), CK() ); COND_KEYS(); CLOSE_ARRAY() << "\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxCondSpan), CSP() ); COND_KEY_SPANS(); CLOSE_ARRAY() << "\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxCond), C() ); CONDS(); CLOSE_ARRAY() << "\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxCondIndexOffset), CO() ); COND_INDEX_OFFSET(); CLOSE_ARRAY() << "\n"; } OPEN_ARRAY( WIDE_ALPH_TYPE(), K() ); KEYS(); CLOSE_ARRAY() << "\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxSpan), SP() ); KEY_SPANS(); CLOSE_ARRAY() << "\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxFlatIndexOffset), IO() ); FLAT_INDEX_OFFSET(); CLOSE_ARRAY() << "\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxIndex), I() ); INDICIES(); CLOSE_ARRAY() << "\n"; OPEN_ARRAY( ARRAY_TYPE(redFsm->maxState), TT() ); TRANS_TARGS(); CLOSE_ARRAY() << "\n"; if ( redFsm->anyActions() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActionLoc), TA() ); TRANS_ACTIONS(); CLOSE_ARRAY() << "\n"; } if ( redFsm->anyToStateActions() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActionLoc), TSA() ); TO_STATE_ACTIONS(); CLOSE_ARRAY() << "\n"; } if ( redFsm->anyFromStateActions() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActionLoc), FSA() ); FROM_STATE_ACTIONS(); CLOSE_ARRAY() << "\n"; } if ( redFsm->anyEofActions() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActionLoc), EA() ); EOF_ACTIONS(); CLOSE_ARRAY() << "\n"; } if ( redFsm->anyEofTrans() ) { OPEN_ARRAY( ARRAY_TYPE(redFsm->maxIndexOffset+1), ET() ); EOF_TRANS(); CLOSE_ARRAY() << "\n"; } STATE_IDS(); }
/* * EUC-TW => wchar */ int mbfl_filt_conv_euctw_wchar(int c, mbfl_convert_filter *filter) { int c1, s, w, plane; switch (filter->status) { case 0: if (c >= 0 && c < 0x80) { /* latin */ CK((*filter->output_function)(c, filter->data)); } else if (c > 0xa0 && c < 0xff) { /* dbcs first byte */ filter->status = 1; filter->cache = c; } else if (c == 0x8e) { /* mbcs first byte */ filter->status = 2; filter->cache = c; } else { w = c & MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; case 1: /* mbcs second byte */ filter->status = 0; c1 = filter->cache; if (c > 0xa0 && c < 0xff) { w = (c1 - 0xa1)*94 + (c - 0xa1); if (w >= 0 && w < cns11643_1_ucs_table_size) { w = cns11643_1_ucs_table[w]; } else { w = 0; } if (w <= 0) { w = (c1 << 8) | c; w &= MBFL_WCSPLANE_MASK; w |= MBFL_WCSPLANE_CNS11643; } CK((*filter->output_function)(w, filter->data)); } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ CK((*filter->output_function)(c, filter->data)); } else { w = (c1 << 8) | c; w &= MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; case 2: /* got 0x8e, first char */ c1 = filter->cache; if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ CK((*filter->output_function)(c, filter->data)); filter->status = 0; } else if (c > 0xa0 && c < 0xaf) { filter->status = 3; filter->cache = c - 0xa1; } else { w = (c1 << 8) | c; w &= MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; case 3: /* got 0x8e, third char */ filter->status = 0; c1 = filter->cache; if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ CK((*filter->output_function)(c, filter->data)); filter->status = 0; } else if (c > 0xa0 && c < 0xff) { filter->status = 4; filter->cache = (c1 << 8) + c - 0xa1; } else { w = (c1 << 8) | c; w &= MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; case 4: /* mbcs fourth char */ filter->status = 0; c1 = filter->cache; if (c1 >= 0x100 && c1 <= 0xdff && c > 0xa0 && c < 0xff) { plane = (c1 & 0xf00) >> 8; s = (c1 & 0xff)*94 + c - 0xa1; w = 0; if (s >= 0) { if (plane == 1 && s < cns11643_2_ucs_table_size) { w = cns11643_2_ucs_table[s]; } if (plane == 13 && s < cns11643_14_ucs_table_size) { w = cns11643_14_ucs_table[s]; } } if (w <= 0) { w = ((c1 & 0x7f) << 8) | (c & 0x7f); w &= MBFL_WCSPLANE_MASK; w |= MBFL_WCSPLANE_CNS11643; } CK((*filter->output_function)(w, filter->data)); } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
/* * UTF-8 => wchar */ int mbfl_filt_conv_utf8_wchar(int c, mbfl_convert_filter *filter) { int s; if (c < 0x80) { if (c >= 0) { CK((*filter->output_function)(c, filter->data)); } filter->status = 0; } else if (c < 0xc0) { int status = filter->status & 0xff; switch (status) { case 0x10: /* 2byte code 2nd char */ case 0x21: /* 3byte code 3rd char */ case 0x32: /* 4byte code 4th char */ case 0x43: /* 5byte code 5th char */ case 0x54: /* 6byte code 6th char */ filter->status = 0; s = filter->cache | (c & 0x3f); if ((status == 0x10 && s >= 0x80) || (status == 0x21 && s >= 0x800 && (s < 0xd800 || s > 0xdfff)) || (status == 0x32 && s >= 0x10000) || (status == 0x43 && s >= 0x200000) || (status == 0x54 && s >= 0x4000000 && s < MBFL_WCSGROUP_UCS4MAX)) { CK((*filter->output_function)(s, filter->data)); } break; case 0x20: /* 3byte code 2nd char */ case 0x31: /* 4byte code 3rd char */ case 0x42: /* 5byte code 4th char */ case 0x53: /* 6byte code 5th char */ filter->cache |= ((c & 0x3f) << 6); filter->status++; break; case 0x30: /* 4byte code 2nd char */ case 0x41: /* 5byte code 3rd char */ case 0x52: /* 6byte code 4th char */ filter->cache |= ((c & 0x3f) << 12); filter->status++; break; case 0x40: /* 5byte code 2nd char */ case 0x51: /* 6byte code 3rd char */ filter->cache |= ((c & 0x3f) << 18); filter->status++; break; case 0x50: /* 6byte code 2nd char */ filter->cache |= ((c & 0x3f) << 24); filter->status++; break; default: filter->status = 0; break; } } else if (c < 0xe0) { /* 2byte code first char */ filter->status = 0x10; filter->cache = (c & 0x1f) << 6; } else if (c < 0xf0) { /* 3byte code first char */ filter->status = 0x20; filter->cache = (c & 0xf) << 12; } else if (c < 0xf8) { /* 4byte code first char */ filter->status = 0x30; filter->cache = (c & 0x7) << 18; } else if (c < 0xfc) { /* 5byte code first char */ filter->status = 0x40; filter->cache = (c & 0x3) << 24; } else if (c < 0xfe) { /* 6 byte code first char */ filter->status = 0x50; filter->cache = (c & 0x1) << 30; } else { filter->status = 0; filter->cache = 0; } return c; }
/* * ISO-2022-JP-Mobile => wchar */ int mbfl_filt_conv_2022jp_mobile_wchar(int c, mbfl_convert_filter *filter) { int c1, s, w, snd = 0; retry: switch (filter->status & 0xf) { /* case 0x00: ASCII */ /* case 0x10: X 0201 latin */ /* case 0x20: X 0201 kana */ /* case 0x80: X 0208 */ case 0: if (c == 0x1b) { filter->status += 2; } else if (filter->status == 0x20 && c > 0x20 && c < 0x60) { /* kana */ CK((*filter->output_function)(0xff40 + c, filter->data)); } else if (filter->status == 0x80 && c > 0x20 && c < 0x80) { /* kanji first char */ filter->cache = c; filter->status += 1; } else if (c >= 0 && c < 0x80) { /* latin, CTLs */ CK((*filter->output_function)(c, filter->data)); } else if (c > 0xa0 && c < 0xe0) { /* GR kana */ CK((*filter->output_function)(0xfec0 + c, filter->data)); } else { w = c & MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; /* case 0x81: X 0208 second char */ case 1: w = 0; filter->status &= ~0xf; c1 = filter->cache; if (c > 0x20 && c < 0x7f) { s = (c1 - 0x21)*94 + c - 0x21; if (s <= 137) { if (s == 31) { w = 0xff3c; /* FULLWIDTH REVERSE SOLIDUS */ } else if (s == 32) { w = 0xff5e; /* FULLWIDTH TILDE */ } else if (s == 33) { w = 0x2225; /* PARALLEL TO */ } else if (s == 60) { w = 0xff0d; /* FULLWIDTH HYPHEN-MINUS */ } else if (s == 80) { w = 0xffe0; /* FULLWIDTH CENT SIGN */ } else if (s == 81) { w = 0xffe1; /* FULLWIDTH POUND SIGN */ } else if (s == 137) { w = 0xffe2; /* FULLWIDTH NOT SIGN */ } } if (w == 0) { if (s >= cp932ext1_ucs_table_min && s < cp932ext1_ucs_table_max) { /* vendor ext1 (13ku) */ w = cp932ext1_ucs_table[s - cp932ext1_ucs_table_min]; } else if (s >= 0 && s < jisx0208_ucs_table_size) { w = jisx0208_ucs_table[s]; } else { w = 0; } } if (s >= (84*94) && s < 91*94) { s += 22*94; if (filter->from->no_encoding == mbfl_no_encoding_2022jp_kddi) { w = mbfilter_sjis_emoji_kddi2unicode(s, &snd); } if (w > 0 && snd > 0) { CK((*filter->output_function)(snd, filter->data)); } } if (w <= 0) { w = (c1 << 8) | c; w &= MBFL_WCSPLANE_MASK; w |= MBFL_WCSPLANE_JIS0208; } CK((*filter->output_function)(w, filter->data)); } else if (c == 0x1b) { filter->status += 2; } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ CK((*filter->output_function)(c, filter->data)); } else { w = (c1 << 8) | c; w &= MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; /* ESC */ /* case 0x02: */ /* case 0x12: */ /* case 0x22: */ /* case 0x82: */ case 2: if (c == 0x24) { /* '$' */ filter->status++; } else if (c == 0x28) { /* '(' */ filter->status += 3; } else { filter->status &= ~0xf; CK((*filter->output_function)(0x1b, filter->data)); goto retry; } break; /* ESC $ */ /* case 0x03: */ /* case 0x13: */ /* case 0x23: */ /* case 0x83: */ case 3: if (c == 0x40 || c == 0x42) { /* '@' or 'B' */ filter->status = 0x80; } else if (c == 0x28) { /* '(' */ filter->status++; } else { filter->status &= ~0xf; CK((*filter->output_function)(0x1b, filter->data)); CK((*filter->output_function)(0x24, filter->data)); goto retry; } break; /* ESC $ ( */ /* case 0x04: */ /* case 0x14: */ /* case 0x24: */ /* case 0x84: */ case 4: if (c == 0x40 || c == 0x42) { /* '@' or 'B' */ filter->status = 0x80; } else { filter->status &= ~0xf; CK((*filter->output_function)(0x1b, filter->data)); CK((*filter->output_function)(0x24, filter->data)); CK((*filter->output_function)(0x28, filter->data)); goto retry; } break; /* ESC ( */ /* case 0x05: */ /* case 0x15: */ /* case 0x25: */ /* case 0x85: */ case 5: if (c == 0x42) { /* 'B' */ filter->status = 0; } else if (c == 0x4a) { /* 'J' */ filter->status = 0; } else if (c == 0x49) { /* 'I' */ filter->status = 0x20; } else { filter->status &= ~0xf; CK((*filter->output_function)(0x1b, filter->data)); CK((*filter->output_function)(0x28, filter->data)); goto retry; } break; default: filter->status = 0; break; } return c; }
/* * eucJP-win => wchar */ int mbfl_filt_conv_eucjpwin_wchar(int c, mbfl_convert_filter *filter) { int c1, s, w, n; switch (filter->status) { case 0: if (c >= 0 && c < 0x80) { /* latin */ CK((*filter->output_function)(c, filter->data)); } else if (c > 0xa0 && c < 0xff) { /* CP932 first char */ filter->status = 1; filter->cache = c; } else if (c == 0x8e) { /* kana first char */ filter->status = 2; } else if (c == 0x8f) { /* X 0212 first char */ filter->status = 3; } else { w = c & MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; case 1: /* got first half */ filter->status = 0; c1 = filter->cache; if (c > 0xa0 && c < 0xff) { w = 0; s = (c1 - 0xa1)*94 + c - 0xa1; if (s <= 137) { if (s == 31) { w = 0xff3c; /* FULLWIDTH REVERSE SOLIDUS */ } else if (s == 32) { w = 0xff5e; /* FULLWIDTH TILDE */ } else if (s == 33) { w = 0x2225; /* PARALLEL TO */ } else if (s == 60) { w = 0xff0d; /* FULLWIDTH HYPHEN-MINUS */ } else if (s == 80) { w = 0xffe0; /* FULLWIDTH CENT SIGN */ } else if (s == 81) { w = 0xffe1; /* FULLWIDTH POUND SIGN */ } else if (s == 137) { w = 0xffe2; /* FULLWIDTH NOT SIGN */ } } if (w == 0) { if (s >= cp932ext1_ucs_table_min && s < cp932ext1_ucs_table_max) { /* vendor ext1 (13ku) */ w = cp932ext1_ucs_table[s - cp932ext1_ucs_table_min]; } else if (s >= 0 && s < jisx0208_ucs_table_size) { /* X 0208 */ w = jisx0208_ucs_table[s]; } else if (s >= (84 * 94)) { /* user (85ku - 94ku) */ w = s - (84 * 94) + 0xe000; } } if (w <= 0) { w = ((c1 & 0x7f) << 8) | (c & 0x7f); w &= MBFL_WCSPLANE_MASK; w |= MBFL_WCSPLANE_WINCP932; } CK((*filter->output_function)(w, filter->data)); } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ CK((*filter->output_function)(c, filter->data)); } else { w = (c1 << 8) | c; w &= MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; case 2: /* got 0x8e, X0201 kana */ filter->status = 0; if (c > 0xa0 && c < 0xe0) { w = 0xfec0 + c; CK((*filter->output_function)(w, filter->data)); } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ CK((*filter->output_function)(c, filter->data)); } else { w = 0x8e00 | c; w &= MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; case 3: /* got 0x8f, X 0212 first char */ if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ CK((*filter->output_function)(c, filter->data)); filter->status = 0; } else { filter->status++; filter->cache = c; } break; case 4: /* got 0x8f, X 0212 second char */ filter->status = 0; c1 = filter->cache; if (c1 > 0xa0 && c1 < 0xff && c > 0xa0 && c < 0xff) { s = (c1 - 0xa1)*94 + c - 0xa1; if (s >= 0 && s < jisx0212_ucs_table_size) { w = jisx0212_ucs_table[s]; if (w == 0x007e) { w = 0xff5e; /* FULLWIDTH TILDE */ } } else if (s >= (82*94) && s < (84*94)) { /* vender ext3 (83ku - 84ku) <-> CP932 (115ku -120ku) */ s = (c1<< 8) | c; w = 0; n = 0; while (n < cp932ext3_eucjp_table_size) { if (s == cp932ext3_eucjp_table[n]) { if (n < (cp932ext3_ucs_table_max - cp932ext3_ucs_table_min)) { w = cp932ext3_ucs_table[n]; } break; } n++; } } else if (s >= (84*94)) { /* user (85ku - 94ku) */ w = s - (84*94) + (0xe000 + (94*10)); } else { w = 0; } if (w == 0x00A6) { w = 0xFFE4; /* FULLWIDTH BROKEN BAR */ } if (w <= 0) { w = ((c1 & 0x7f) << 8) | (c & 0x7f); w &= MBFL_WCSPLANE_MASK; w |= MBFL_WCSPLANE_JIS0212; } CK((*filter->output_function)(w, filter->data)); } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ CK((*filter->output_function)(c, filter->data)); } else { w = (c1 << 8) | c | 0x8f0000; w &= MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; default: filter->status = 0; break; } return c; }
/* * wchar => ISO-2022-JP-Mobile */ int mbfl_filt_conv_wchar_2022jp_mobile(int c, mbfl_convert_filter *filter) { int c1, c2, s1, s2; s1 = 0; s2 = 0; if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) { s1 = ucs_a1_jis_table[c - ucs_a1_jis_table_min]; } else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) { s1 = ucs_a2_jis_table[c - ucs_a2_jis_table_min]; } else if (c >= ucs_i_jis_table_min && c < ucs_i_jis_table_max) { s1 = ucs_i_jis_table[c - ucs_i_jis_table_min]; } else if (c >= ucs_r_jis_table_min && c < ucs_r_jis_table_max) { s1 = ucs_r_jis_table[c - ucs_r_jis_table_min]; } else if (c >= 0xe000 && c < (0xe000 + 20*94)) { /* user (95ku - 114ku) */ s1 = c - 0xe000; c1 = s1/94 + 0x7f; c2 = s1%94 + 0x21; s1 = (c1 << 8) | c2; } if (s1 <= 0) { c1 = c & ~MBFL_WCSPLANE_MASK; if (c1 == MBFL_WCSPLANE_WINCP932) { s1 = c & MBFL_WCSPLANE_MASK; s2 = 1; } else if (c1 == MBFL_WCSPLANE_JIS0208) { s1 = c & MBFL_WCSPLANE_MASK; } else if (c1 == MBFL_WCSPLANE_JIS0212) { s1 = c & MBFL_WCSPLANE_MASK; s1 |= 0x8080; } else if (c == 0xa5) { /* YEN SIGN */ s1 = 0x216f; /* FULLWIDTH YEN SIGN */ } else if (c == 0x203e) { /* OVER LINE */ s1 = 0x2131; /* FULLWIDTH MACRON */ } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */ s1 = 0x2140; } else if (c == 0xff5e) { /* FULLWIDTH TILDE */ s1 = 0x2141; } else if (c == 0x2225) { /* PARALLEL TO */ s1 = 0x2142; } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */ s1 = 0x215d; } else if (c == 0xffe0) { /* FULLWIDTH CENT SIGN */ s1 = 0x2171; } else if (c == 0xffe1) { /* FULLWIDTH POUND SIGN */ s1 = 0x2172; } else if (c == 0xffe2) { /* FULLWIDTH NOT SIGN */ s1 = 0x224c; } } if ((s1 <= 0) || (s1 >= 0xa1a1 && s2 == 0)) { /* not found or X 0212 */ s1 = -1; c1 = 0; c2 = cp932ext1_ucs_table_max - cp932ext1_ucs_table_min; while (c1 < c2) { /* CP932 vendor ext1 (13ku) */ if (c == cp932ext1_ucs_table[c1]) { s1 = ((c1/94 + 0x2d) << 8) + (c1%94 + 0x21); break; } c1++; } if (c == 0) { s1 = 0; } else if (s1 <= 0) { s1 = -1; } } if (filter->to->no_encoding == mbfl_no_encoding_2022jp_kddi && mbfilter_unicode2sjis_emoji_kddi(c, &s1, filter) > 0) { CODE2JIS(c1,c2,s1,s2); s1 -= 0x1600; } if (filter->status == 1 && filter->cache > 0) { return c; } if (s1 >= 0) { if (s1 < 0x80) { /* latin */ if ((filter->status & 0xff00) != 0) { CK((*filter->output_function)(0x1b, filter->data)); /* ESC */ CK((*filter->output_function)(0x28, filter->data)); /* '(' */ CK((*filter->output_function)(0x42, filter->data)); /* 'B' */ } CK((*filter->output_function)(s1, filter->data)); filter->status = 0; } else if (s1 > 0xa0 && s1 < 0xe0) { /* kana */ if ((filter->status & 0xff00) != 0x100) { CK((*filter->output_function)(0x1b, filter->data)); /* ESC */ CK((*filter->output_function)(0x28, filter->data)); /* '(' */ CK((*filter->output_function)(0x49, filter->data)); /* 'I' */ } filter->status = 0x100; CK((*filter->output_function)(s1 & 0x7f, filter->data)); } else if (s1 < 0x7e7f) { /* X 0208 */ if ((filter->status & 0xff00) != 0x200) { CK((*filter->output_function)(0x1b, filter->data)); /* ESC */ CK((*filter->output_function)(0x24, filter->data)); /* '$' */ CK((*filter->output_function)(0x42, filter->data)); /* 'B' */ } filter->status = 0x200; CK((*filter->output_function)((s1 >> 8) & 0xff, filter->data)); CK((*filter->output_function)(s1 & 0x7f, filter->data)); } } else { if (filter->illegal_mode != MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE) {
/* * cp51932 => wchar */ int mbfl_filt_conv_cp51932_wchar(int c, mbfl_convert_filter *filter) { int c1, s, w; switch (filter->status) { case 0: if (c >= 0 && c < 0x80) { /* latin */ CK((*filter->output_function)(c, filter->data)); } else if (c > 0xa0 && c < 0xff) { /* CP932 first char */ filter->status = 1; filter->cache = c; } else if (c == 0x8e) { /* kana first char */ filter->status = 2; } else { w = c & MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; case 1: /* got first half */ filter->status = 0; c1 = filter->cache; if (c > 0xa0 && c < 0xff) { w = 0; s = (c1 - 0xa1)*94 + c - 0xa1; if (s <= 137) { if (s == 31) { w = 0xff3c; /* FULLWIDTH REVERSE SOLIDUS */ } else if (s == 32) { w = 0xff5e; /* FULLWIDTH TILDE */ } else if (s == 33) { w = 0x2225; /* PARALLEL TO */ } else if (s == 60) { w = 0xff0d; /* FULLWIDTH HYPHEN-MINUS */ } else if (s == 80) { w = 0xffe0; /* FULLWIDTH CENT SIGN */ } else if (s == 81) { w = 0xffe1; /* FULLWIDTH POUND SIGN */ } else if (s == 137) { w = 0xffe2; /* FULLWIDTH NOT SIGN */ } } if (w == 0) { if (s >= cp932ext1_ucs_table_min && s < cp932ext1_ucs_table_max) { /* vendor ext1 (13ku) */ w = cp932ext1_ucs_table[s - cp932ext1_ucs_table_min]; } else if (s >= 0 && s < jisx0208_ucs_table_size) { /* X 0208 */ w = jisx0208_ucs_table[s]; } else if (s >= cp932ext2_ucs_table_min && s < cp932ext2_ucs_table_max) { /* vendor ext2 (89ku - 92ku) */ w = cp932ext2_ucs_table[s - cp932ext2_ucs_table_min]; } } if (w <= 0) { w = ((c1 & 0x7f) << 8) | (c & 0x7f); w &= MBFL_WCSPLANE_MASK; w |= MBFL_WCSPLANE_WINCP932; } CK((*filter->output_function)(w, filter->data)); } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ CK((*filter->output_function)(c, filter->data)); } else { w = (c1 << 8) | c; w &= MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; case 2: /* got 0x8e, X0201 kana */ filter->status = 0; if (c > 0xa0 && c < 0xe0) { w = 0xfec0 + c; CK((*filter->output_function)(w, filter->data)); } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ CK((*filter->output_function)(c, filter->data)); } else { w = 0x8e00 | c; w &= MBFL_WCSGROUP_MASK; w |= MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; default: filter->status = 0; break; } return c; }
/* * wchar => JIS */ int mbfl_filt_conv_wchar_jis_ms(int c, mbfl_convert_filter *filter) { int c1, s; s = 0; if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) { s = ucs_a1_jis_table[c - ucs_a1_jis_table_min]; } else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) { s = ucs_a2_jis_table[c - ucs_a2_jis_table_min]; } else if (c >= ucs_i_jis_table_min && c < ucs_i_jis_table_max) { s = ucs_i_jis_table[c - ucs_i_jis_table_min]; } else if (c >= ucs_r_jis_table_min && c < ucs_r_jis_table_max) { s = ucs_r_jis_table[c - ucs_r_jis_table_min]; } else if (c >= 0xe000 && c < (0xe000 + 10 * 94)) { /* PUE => Microsoft extended (pseudo 95ku - 114ku) */ /* See http://www.opengroup.or.jp/jvc/cde/ucs-conv.html#ch4_2 */ s = c - 0xe000; s = (s / 94 + 0x75) << 8 | (s % 94 + 0x21); } else if (c >= (0xe000 + 10 * 94) && c <= (0xe000 + 20 * 94)) { /* PUE => JISX0212 user-defined (G3 85ku - 94ku) */ /* See http://www.opengroup.or.jp/jvc/cde/ucs-conv.html#ch4_2 */ s = c - (0xe000 + 10 * 94); s = (s / 94 + 0xf5) << 8 | (s % 94 + 0xa1); } /* do some transliteration */ if (s <= 0) { c1 = c & ~MBFL_WCSPLANE_MASK; if (c1 == MBFL_WCSPLANE_JIS0208) { s = c & MBFL_WCSPLANE_MASK; } else if (c1 == MBFL_WCSPLANE_JIS0212) { s = c & MBFL_WCSPLANE_MASK; s |= 0x8080; } else if (c == 0xa5) { /* YEN SIGN */ s = 0x1005c; } else if (c == 0x203e) { /* OVER LINE */ s = 0x1007e; } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */ s = 0x2140; } else if (c == 0xff5e) { /* FULLWIDTH TILDE */ s = 0x2141; } else if (c == 0x2225) { /* PARALLEL TO */ s = 0x2142; } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */ s = 0x215d; } else if (c == 0xffe0) { /* FULLWIDTH CENT SIGN */ s = 0x2171; } else if (c == 0xffe1) { /* FULLWIDTH POUND SIGN */ s = 0x2172; } else if (c == 0xffe2) { /* FULLWIDTH NOT SIGN */ s = 0x224c; } } if (s <= 0 || (s >= 0x8080 && s < 0x10000)) { int i; s = -1; for (i = 0; i < cp932ext1_ucs_table_max - cp932ext1_ucs_table_min; i++) { const int oh = cp932ext1_ucs_table_min / 94; if (c == cp932ext1_ucs_table[i]) { s = ((i / 94 + oh + 0x21) << 8) + (i % 94 + 0x21); break; } } if (s < 0) { const int oh = cp932ext2_ucs_table_min / 94; const int cp932ext2_ucs_table_size = cp932ext2_ucs_table_max - cp932ext2_ucs_table_min; for (i = 0; i < cp932ext2_ucs_table_size; i++) { if (c == cp932ext2_ucs_table[i]) { s = ((i / 94 + oh + 0x21) << 8) + (i % 94 + 0x21); break; } } } if (s < 0) { const int cp932ext3_ucs_table_size = cp932ext3_ucs_table_max - cp932ext3_ucs_table_min; const int limit = cp932ext3_ucs_table_size > cp932ext3_eucjp_table_size ? cp932ext3_eucjp_table_size: cp932ext3_ucs_table_size; for (i = 0; i < limit; i++) { if (c == cp932ext3_ucs_table[i]) { s = cp932ext3_eucjp_table[i]; break; } } } if (c == 0) { s = 0; } else if (s <= 0) { s = -1; } } if (s >= 0) { if (s < 0x80) { /* ASCII */ if ((filter->status & 0xff00) != 0) { CK((*filter->output_function)(0x1b, filter->data)); /* ESC */ CK((*filter->output_function)(0x28, filter->data)); /* '(' */ CK((*filter->output_function)(0x42, filter->data)); /* 'B' */ } filter->status = 0; CK((*filter->output_function)(s, filter->data)); } else if (s < 0x100) { /* kana */ if ((filter->status & 0xff00) != 0x100) { CK((*filter->output_function)(0x1b, filter->data)); /* ESC */ CK((*filter->output_function)(0x28, filter->data)); /* '(' */ CK((*filter->output_function)(0x49, filter->data)); /* 'I' */ } filter->status = 0x100; CK((*filter->output_function)(s & 0x7f, filter->data)); } else if (s < 0x8080) { /* X 0208 */ if ((filter->status & 0xff00) != 0x200) { CK((*filter->output_function)(0x1b, filter->data)); /* ESC */ CK((*filter->output_function)(0x24, filter->data)); /* '$' */ CK((*filter->output_function)(0x42, filter->data)); /* 'B' */ } filter->status = 0x200; CK((*filter->output_function)((s >> 8) & 0x7f, filter->data)); CK((*filter->output_function)(s & 0x7f, filter->data)); } else if (s < 0x10000) { /* X 0212 */ if ((filter->status & 0xff00) != 0x300) { CK((*filter->output_function)(0x1b, filter->data)); /* ESC */ CK((*filter->output_function)(0x24, filter->data)); /* '$' */ CK((*filter->output_function)(0x28, filter->data)); /* '(' */ CK((*filter->output_function)(0x44, filter->data)); /* 'D' */ } filter->status = 0x300; CK((*filter->output_function)((s >> 8) & 0x7f, filter->data)); CK((*filter->output_function)(s & 0x7f, filter->data)); } else { /* X 0201 latin */ if ((filter->status & 0xff00) != 0x400) {