diff options
Diffstat (limited to 'language/japanese/ptex/kanji.c')
-rw-r--r-- | language/japanese/ptex/kanji.c | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/language/japanese/ptex/kanji.c b/language/japanese/ptex/kanji.c new file mode 100644 index 0000000000..c14562fb44 --- /dev/null +++ b/language/japanese/ptex/kanji.c @@ -0,0 +1,233 @@ +/* + * KANJI Code conversion routines. + */ + +#define KANJI_C +#include "kanji.h" + +boolean iskanji1(c) + unsigned char c; +{ + c &= 0xff; + if (prockanjicode == SJIS) + return((c>=0x81 && c<=0x9f) || (c>=0xe0 && c<=0xfc)); + else + return(c>=0xa1 && c<=0xfe); +} + +boolean iskanji2(c) + unsigned char c; +{ + c &= 0xff; + if (prockanjicode == SJIS) + return(c>=0x40 && c<=0xfc && c!=0x7f); + else + return(c>=0xa1 && c<=0xfe); +} + +boolean checkkanji(c) + integer c; +{ + if(c<0 || c>256) + return(iskanji1(c>>8) && iskanji2(c & 0xff)); + return(-1); +} + +#ifdef OLDSTYLE +integer calcpos(c) +{ + register int c1, c2; + + if(c<256) return(c<<1); + c1 = c>>8; + c2 = c & 0xff; + if(c1) { + if (prockanjicode == SJIS) + return((c2+(c2<<(c1-0x81)) & 0xff)<<1); + else + return((c2+(c2<<(c1-0xa1)) & 0xff)<<1); + } else + return(((c2+c2+1) & 0xff)<<1); +} +#else /* OLDSTYLE */ +integer calcpos(c) + integer c; +{ + register unsigned char c1, c2; + integer ret; + + if(c>=0 && c<=255) return(c); + c1 = (c >> 8) & 0xff; + c2 = c & 0xff; + if(iskanji1(c1)) { + if (prockanjicode == SJIS) { + c1 = ((c1 - 0x81) % 4) * 64; /* c1 = 0, 64, 128, 192 */ + c2 = c2 % 64; /* c2 = 0..63 */ + } else { + c1 = ((c1 - 0xa1) % 4) * 64; /* c1 = 0, 64, 128, 192 */ + c2 = c2 % 64; /* c2 = 0..63 */ + } + return(c1 + c2); /* ret = 0..255 */ + } else + return(c2); +} +#endif /* OLDSTYLE */ + +/* + * EUC to JIS X0208 code conversion + */ +integer EUCtoJIS(kcode) + integer kcode; +{ + return(kcode & 0x7f7f); +} + +/* + * JIS X0208 to EUC code conversion + */ +integer JIStoEUC(kcode) + integer kcode; +{ + return(kcode | 0x8080); +} + +/* + * SJIStoJIS : Shift JIS to JIS Kanji code conversion + */ +integer SJIStoJIS(kcode) + integer kcode; +{ + register short byte1, byte2; + + byte1 = (kcode>>8) & 0xff; + byte2 = kcode & 0xff; + byte1 -= ( byte1>=0xa0 ) ? 0xc1 : 0x81; + kcode = ((byte1<<1) + 0x21)<<8; + if( byte2>=0x9f ) { + kcode += 0x0100; + kcode |= (byte2 - 0x7e) & 0xff; + } else { + kcode |= (byte2 - ((byte2<=0x7e) ? 0x1f : 0x20 )) & 0xff; + } + return(kcode); +} + +/* + * JIS X0208 to Shift JIS code conversion + */ +integer JIStoSJIS(kcode) + integer kcode; +{ + register integer high, low; + register integer nh, nl; + + high = (kcode>>8) & 0xff; + low = kcode & 0xff; + nh = ((high-0x21)>>1) + 0x81; + if (nh>0x9f) nh += 0x40; + if (high & 1) { + nl = low + 0x1f; + if (low>0x5f) nl++; + } else + nl = low + 0x7e; + if(iskanji1(nh) && iskanji2(nl)) + return((nh<<8) | nl); + else + return(0x813f); +} + +/* + * Shift JIS to EUC Kanji code conversion + */ +integer SJIStoEUC(kcode) + integer kcode; +{ + return(SJIStoJIS(kcode) | 0x8080 ); +} + +/* + * EUC to SJIS Kanji code conversion + */ +integer EUCtoSJIS(kcode) + integer kcode; +{ + return(JIStoSJIS(kcode & 0x7f7f)); +} + +/* + * KUTEN to JIS kanji code conversion + */ +integer kuten2jis(kcode) + integer kcode; +{ + register short byte1, byte2; + + byte1 = (kcode>>8) & 0xff; + byte2 = kcode & 0xff; + + /* in case of undefined in kuten code table */ + if (byte1 == 0 || byte1 > 95 || byte2 == 0 || byte2 > 95) + return(-1); + + byte1 += 0x20; + byte2 += 0x20; + + return (byte1<<8 | byte2); +} + +/* + * KUTEN to EUC Kanji code conversion + */ +integer KUTENtoEUC(kcode) + integer kcode; +{ + return(JIStoEUC(kuten2jis(kcode))); +} + +/* + * KUTENtoSJIS Kanji code conversion + */ +integer KUTENtoSJIS(kcode) + integer kcode; +{ + return(JIStoSJIS(kuten2jis(kcode))); +} + +void putc2(c, fp) + unsigned char c; + FILE *fp; +{ + static integer kanji[NOFILE]; + static unsigned char c1[NOFILE]; + integer jc; + register fd; + + fd = fileno(fp); + if (kanji[fd] == 1) { + jc = (c1[fd] << 8) | c; + if (prockanjicode == JIS) jc = EUCtoJIS(jc); + (void) putc(jc >> 8, fp); + (void) putc(jc & 0xff, fp); + kanji[fd] = 2; + } else if (iskanji1(c)) { + if (kanji[fd] == 0) { + if (prockanjicode == JIS) { + (void) putc('\033', fp); + (void) putc('$', fp); + (void) putc('B', fp); + } + } + c1[fd] = c; + kanji[fd] = 1; + } else { + if (kanji[fd] == 2) { + if (prockanjicode == JIS) { + (void) putc('\033', fp); + (void) putc('(', fp); + (void) putc('B', fp); + } + kanji[fd] = 0; + } + (void) putc(c, fp); + } +} |