static char *ConvJIStoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put) { int Kcode; int Daku; Dt = (uchar)Dt + (uchar)0x80; if(cInfo->KanaCnv == NO) { if((uchar)Dt != (uchar)0x80) *Put++ = Dt; } else { if(cInfo->KanaPrev != 0) { Daku = AskDakuon(cInfo->KanaPrev, Dt); Kcode = _mbcjistojms(HanKataToZen(cInfo->KanaPrev)) + Daku; *Put++ = HIGH8(Kcode); *Put++ = LOW8(Kcode); if((Daku == 0) && ((uchar)Dt != (uchar)0x80)) cInfo->KanaPrev = Dt; else cInfo->KanaPrev = 0; } else if((uchar)Dt != (uchar)0x80) cInfo->KanaPrev = Dt; } return(Put); }
/* 文字列の出力 */ LOCAL W output_string(W fd, W len, TC *tc, W hankaku) { W err, n, pos; UH sjis; UB *buf; if (len < 1) { err = ER_OK; goto fin0; } /* 入力サイズを超えることは決してない */ buf = malloc(len); if (buf == NULL) { P(("output_string: malloc NULL\n")); err = ER_NOMEM; goto fin0; } len /= 2; pos = 0; while (len-- > 0) { switch (*tc) { case TAB: buf[pos++] = TAB; break; case LF: case CR: buf[pos++] = CR; buf[pos++] = LF; break; default: /* 言語ID */ if ((*tc & 0xff00) == 0xfe00) { LangState = *tc; break; } /* 日本語以外の言語が指定されている場合 */ if (LangState != LANGJP) { sjis = _mbcjistojms(0); buf[pos++] = sjis >> 8; buf[pos++] = sjis; break; } /* 半角化可能な物は半角で出力 */ if (hankaku) { n = zen2han(*tc, &buf[pos]); if (n > 0) { pos += n; break; } } /* 全角 */ sjis = _mbcjistojms(*tc); buf[pos++] = sjis >> 8; buf[pos++] = sjis; break; } tc++; }
int ConvJIStoSJIS(CODECONVINFO *cInfo) { int Kcode; char *Str; char *Put; char *Limit; int Continue; cInfo->KanaProc = &ConvJIStoSJISkanaProc; Continue = NO; Str = cInfo->Str; Put = cInfo->Buf; Limit = cInfo->Buf + cInfo->BufSize - 3; for(; cInfo->StrLen > 0; cInfo->StrLen--) { if(Put >= Limit) { Continue = YES; break; } if(cInfo->EscProc == 0) { if(*Str == 0x1B) { if(cInfo->KanjiFst != 0) { *Put++ = cInfo->KanjiFst; cInfo->KanjiFst = 0; } Put = ConvJIStoSJISkanaProc(cInfo, 0, Put); cInfo->EscCode[cInfo->EscProc] = *Str++; cInfo->EscProc++; } else { if(cInfo->KanjiMode == CONV_KANA) { if(cInfo->KanjiFst != 0) { *Put++ = cInfo->KanjiFst; cInfo->KanjiFst = 0; } if((*Str >= 0x21) && (*Str <= 0x5F)) { Put = ConvJIStoSJISkanaProc(cInfo, *Str++, Put); } else { Put = ConvJIStoSJISkanaProc(cInfo, 0, Put); *Put++ = *Str++; } } else if(cInfo->KanjiMode == CONV_KANJI) { Put = ConvJIStoSJISkanaProc(cInfo, 0, Put); if((*Str >= 0x21) && (*Str <= 0x7E)) { if(cInfo->KanjiFst == 0) cInfo->KanjiFst = *Str++; else { Kcode = _mbcjistojms((cInfo->KanjiFst * 0x100) + *Str++); *Put++ = HIGH8(Kcode); *Put++ = LOW8(Kcode); cInfo->KanjiFst = 0; } } else { if(cInfo->KanjiFst == 0) *Put++ = *Str++; else { *Put++ = cInfo->KanjiFst; *Put++ = *Str++; cInfo->KanjiFst = 0; } } } else { Put = ConvJIStoSJISkanaProc(cInfo, 0, Put); *Put++ = *Str++; } } } else if(cInfo->EscProc == 1) { if((*Str == '$') || (*Str == '(')) { cInfo->EscCode[cInfo->EscProc] = *Str++; cInfo->EscProc++; } else { *Put++ = cInfo->EscCode[0]; *Put++ = *Str++; cInfo->EscProc = 0; } } else if(cInfo->EscProc == 2) { if((cInfo->EscCode[1] == '$') && ((*Str == 'B') || (*Str == '@'))) cInfo->KanjiMode = CONV_KANJI; else if((cInfo->EscCode[1] == '(') && (*Str == 'I')) cInfo->KanjiMode = CONV_KANA; else if((cInfo->EscCode[1] == '(') && ((*Str == 'B') || (*Str == 'J') || (*Str == 'H'))) cInfo->KanjiMode = CONV_ASCII; else { *Put++ = cInfo->EscCode[0]; *Put++ = cInfo->EscCode[1]; if((cInfo->KanjiMode == CONV_KANJI) && ((*Str >= 0x21) && (*Str <= 0x7E))) cInfo->KanjiFst = *Str; else *Put++ = *Str; } Str++; cInfo->EscProc = 0; } } cInfo->Str = Str; cInfo->OutLen = Put - cInfo->Buf; return(Continue); }
int ConvEUCtoSJIS(CODECONVINFO *cInfo) { int Kcode; char *Str; char *Put; char *Limit; int Continue; cInfo->KanaProc = &ConvEUCtoSJISkanaProc; Continue = NO; Str = cInfo->Str; Put = cInfo->Buf; Limit = cInfo->Buf + cInfo->BufSize - 2; for(; cInfo->StrLen > 0; cInfo->StrLen--) { if(Put >= Limit) { Continue = YES; break; } if((*Str & 0x80) != 0) { if(cInfo->KanjiFst == 0) cInfo->KanjiFst = *Str++; else { if((uchar)cInfo->KanjiFst == (uchar)0x8E) /* 半角カタカナ */ { Put = ConvEUCtoSJISkanaProc(cInfo, *Str++, Put); } else { Put = ConvEUCtoSJISkanaProc(cInfo, 0, Put); Kcode = _mbcjistojms(((cInfo->KanjiFst & 0x7F) * 0x100) + (*Str++ & 0x7F)); *Put++ = HIGH8(Kcode); *Put++ = LOW8(Kcode); } cInfo->KanjiFst = 0; } } else { Put = ConvEUCtoSJISkanaProc(cInfo, 0, Put); if(cInfo->KanjiFst != 0) { *Put++ = cInfo->KanjiFst; cInfo->KanjiFst = 0; } *Put++ = *Str++; } } cInfo->Str = Str; cInfo->OutLen = Put - cInfo->Buf; return(Continue); }