--- source/kanji.c.orig Mon Dec 4 03:44:17 2000 +++ source/kanji.c Mon Dec 4 03:44:17 2000 @@ -0,0 +1,133 @@ +/* kanji.c */ +#include "kanji.h" + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#define ESC '\033' +#define KI1 '$' +#define KI21 'B' +#define KI22 '@' +#define KO1 '(' +#define KO21 'B' +#define KO22 'J' +#define KO23 'H' + +#define EUC2JIS(c) (unsigned char)((c) & 0x7f) +#define JIS2EUC(c) (char)((c) | 0x80) + +/* proto types */ +static int ParseESC(char **jisstr); + +/* Euc2Jis : convert euc to jis. */ +/* eucstr : input string (euc) */ +/* jisstr : output string (jis) */ +/* limit : output string limit length */ +int Euc2Jis(unsigned char *eucstr, char *jisstr, int limit) +{ + int length, shifted; + + shifted = FALSE; + + while (*eucstr) { + length = 0; + if(ISKANJI(*eucstr)){ + if(!shifted){ + *jisstr++ = ESC; + *jisstr++ = KI1; + *jisstr++ = KI21; + shifted = TRUE; + length += 3; + } + *jisstr++ = EUC2JIS(*eucstr++); + *jisstr++ = EUC2JIS(*eucstr++); + length += 2; + }else{ + if(shifted){ + *jisstr++ = ESC; + *jisstr++ = KO1; + *jisstr++ = KO21; + length += 3; + shifted = FALSE; + } + *jisstr++ = *eucstr++; + length += 1; + } + + limit -= length; + if(limit < 4){ + jisstr -= length; + break; /* goto _break_1; */ + } + } + _break_1: + if (shifted) { + *jisstr++ = ESC; + *jisstr++ = KO1; + *jisstr++ = KO21; + } + *jisstr = '\0'; + return 0; +} + + +/* Jis2Euc : convert jis to euc. */ +/* jisstr : input string (jis) */ +/* eucstr : output string (euc) */ +void Jis2Euc(char *jisstr, unsigned char *eucstr) +{ + int shifted; + char c; + char* bg = eucstr; + + shifted = FALSE; + + while ((c = *jisstr++) != '\0') { + if (c == ESC) { + shifted = ParseESC(&jisstr); + }else{ + if (shifted) { + if (*jisstr) { + *eucstr++ = JIS2EUC(c); + *eucstr++ = JIS2EUC(*jisstr); + jisstr++; + } + }else{ + *eucstr++ = c; + } + } + } + *eucstr = '\0'; +} + + +/* ParseESC : parse escape code */ +/* input : esc code */ +/* output : ESC $ B / ESC $ @ / ESC $ @ : shifted and skip esc code */ +/* ESC ( B / ESC ( J / ESC ( H : unshifted and skip esc code */ +int ParseESC(char **jisstr) +{ + char c1, c2; + int shifted; + char* pos = *jisstr; + + shifted = FALSE; + c1 = *pos++; c2 = c1 ? *pos++ : '\0'; + + if (c1 == KO1) { + if (c2 == KO21 || c2 == KO22 || c2 == KO23) { + *jisstr = pos; + } + } else if (c1 == KI1) { + if (c2 == KI21 || c2 == KI22) { + *jisstr = pos; + shifted = TRUE; + } + } + return shifted; +}