_WCRTLINK int _ismbbkana( unsigned int ch ) { if( __MBCodePage == 932 ) { return( iskana( ch ) ); } else { return( 0 ); } }
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'; }
const char *kanji_fromeuc(char *s,size_t bytes,const char *t,int kc) { u_char c; const char *p; enum {KM_ank, KM_kanji, KM_kana} km; p=s; switch(kc) { case KC_euc: return t; case KC_sjis: for(;*t!='\0'&& bytes>0;) { c=*t++; if (c==0x8e&& iskana(*t)) c=*t++; else { if (iseuc(c)&& iseuc(*t)) { *s++= EUCtoSJIStable1[c - 0xa1]; --bytes; c= *(u_char *)t - ((c&1)==0 ? 2 : *(u_char *)t>=0xe0? 0x60: 0x61); ++t; } } *s++=c; --bytes; } *s='\0'; break; case KC_jis: km=KM_ank; for(;*t!='\0'&& bytes>0;) { c=*t++; if (iseuc(c)&& km!=KM_kanji) { if (bytes<3) break; *s++='\x1b'; *s++='$'; *s++='B'; bytes-=3; km=KM_kanji; } if (c==0x8e && iskana(*t)) { if (km!=KM_kana) { if (bytes<3) break; *s++='\x1b'; *s++='('; *s++='I'; bytes-=3; km=KM_kana; } c=*t++; } else { if (!iseuc(c) && km!=KM_ank) { if (bytes<3) break; *s++='\x1b'; *s++='('; *s++='B'; bytes-=3; km=KM_ank; } } *s++= (c&0x7f); --bytes; } if (km!=KM_ank&& bytes>=3) strcpy(s,"\x1b(B"); else *s='\0'; } return p; }