diff --git a/src/modules/_Charset/iso2022.c b/src/modules/_Charset/iso2022.c index c69e4095ca25f284b174c3a65f0ef056d9fb8a10..8ac5fc95a82b07f9e2475a9b2879e717497c2359 100644 --- a/src/modules/_Charset/iso2022.c +++ b/src/modules/_Charset/iso2022.c @@ -3,7 +3,7 @@ #endif /* HAVE_CONFIG_H */ #include "global.h" -RCSID("$Id: iso2022.c,v 1.12 1999/07/28 21:16:37 marcus Exp $"); +RCSID("$Id: iso2022.c,v 1.13 1999/07/28 21:34:34 marcus Exp $"); #include "program.h" #include "interpret.h" #include "stralloc.h" @@ -498,13 +498,17 @@ static void eat_enc_string(struct pike_string *str, struct iso2022enc_stor *s, } else { /* Need to switch to another map */ - int mode, index=0, ch; - UNICHAR *ttab = NULL; + int mode, index=0, ch, ch2; + UNICHAR *ttab = NULL, *ttt; p_wchar1 *rmap = NULL; if(c>=0x3000) { /* CJK */ - error("Not implemented.\n"); + + /* FIXME: Need to support Chinese and Korean, too... */ + mode = MODE_9494; + index = 0x12; + } else if(c<0x180) { unsigned char map1[] = { 0x02, 0x00, 0x15, 0x00, 0xa0, 0xa0, 0x02, 0xff, @@ -520,11 +524,32 @@ static void eat_enc_string(struct pike_string *str, struct iso2022enc_stor *s, if(index!=0 && (ttab = transltab[mode][index-0x10])!=NULL) { switch(mode) { + case MODE_94: + rmap = (p_wchar1 *)xalloc((0x10000-0x100)*sizeof(p_wchar1)); + memset(rmap, 0, (0x10000-0x100)*sizeof(p_wchar1)); + for(ch=0; ch<94; ch++) + if(ttab[ch]>=0x100 && ttab[ch]!=0xfffd) + rmap[ttab[ch]-0x100]=ch+33; + if(rmap[c-0x100]) { + string_builder_strcat(&s->strbuild, "\033("); + string_builder_putchar(&s->strbuild, 48+index); + string_builder_putchar(&s->strbuild, rmap[c-0x100]); + s->g[0].transl = ttab; + s->g[0].mode = MODE_94; + s->g[0].index = index; + if(s->r[0].map != NULL) + free(s->r[0].map); + s->r[0].map = rmap; + s->r[0].lo = 0x100; + s->r[0].hi = 0x10000; + } else + ttab = NULL; + break; case MODE_96: rmap = (p_wchar1 *)xalloc((0x10000-0x100)*sizeof(p_wchar1)); memset(rmap, 0, (0x10000-0x100)*sizeof(p_wchar1)); for(ch=0; ch<96; ch++) - if(ttab[ch]>=0x100) + if(ttab[ch]>=0x100 && ttab[ch]!=0xfffd) rmap[ttab[ch]-0x100]=ch+32; if(rmap[c-0x100]) { string_builder_strcat(&s->strbuild, "\033-"); @@ -541,6 +566,52 @@ static void eat_enc_string(struct pike_string *str, struct iso2022enc_stor *s, } else ttab = NULL; break; + case MODE_9494: + rmap = (p_wchar1 *)xalloc((0x10000-0x100)*sizeof(p_wchar1)); + memset(rmap, 0, (0x10000-0x100)*sizeof(p_wchar1)); + for(ttt=ttab, ch=0; ch<94; ch++) + for(ch2=0; ch2<94; ch2++, ttt++) + if(*ttt>=0x100 && *ttt!=0xfffd) + rmap[*ttt-0x100]=((ch+33)<<8)|(ch2+33); + if(rmap[c-0x100]) { + string_builder_strcat(&s->strbuild, "\033$("); + string_builder_putchar(&s->strbuild, 48+index); + string_builder_putchar(&s->strbuild, rmap[c-0x100]>>8); + string_builder_putchar(&s->strbuild, rmap[c-0x100]&0xff); + s->g[0].transl = ttab; + s->g[0].mode = MODE_9494; + s->g[0].index = index; + if(s->r[0].map != NULL) + free(s->r[0].map); + s->r[0].map = rmap; + s->r[0].lo = 0x100; + s->r[0].hi = 0x10000; + } else + ttab = NULL; + break; + case MODE_9696: + rmap = (p_wchar1 *)xalloc((0x10000-0x100)*sizeof(p_wchar1)); + memset(rmap, 0, (0x10000-0x100)*sizeof(p_wchar1)); + for(ttt=ttab, ch=0; ch<96; ch++) + for(ch2=0; ch2<96; ch2++, ttt++) + if(*ttt>=0x100 && *ttt!=0xfffd) + rmap[*ttt-0x100]=((ch+32)<<8)|(ch2+32); + if(rmap[c-0x100]) { + string_builder_strcat(&s->strbuild, "\033$-"); + string_builder_putchar(&s->strbuild, 48+index); + string_builder_putchar(&s->strbuild, (rmap[c-0x100]>>8)|0x80); + string_builder_putchar(&s->strbuild, (rmap[c-0x100]&0xff)|0x80); + s->g[1].transl = ttab; + s->g[1].mode = MODE_9696; + s->g[1].index = index; + if(s->r[1].map != NULL) + free(s->r[1].map); + s->r[1].map = rmap; + s->r[1].lo = 0x100; + s->r[1].hi = 0x10000; + } else + ttab = NULL; + break; } } if(ttab == NULL) {