/* euc.c -- JIS/NEC/Shift-JIS to EUC Code Conversion Filter */ #include #define ESC 0x1b main(int argc, char *argv[]) { int c, c2, flag=0; FILE *fp; if (argc == 1) fp = stdin; else if ((fp=fopen(argv[1],"r")) == NULL) { fprintf(stderr, "file %s not found\n", argv[1]); exit(1); } while ((c=getc(fp)) != EOF) { if (c == ESC) { c = getc(fp); if (c == '(') { c2 = getc(fp); if ((c2=='H') || (c2=='J') || (c2=='@') || (c2=='B')) flag = 0; else { putchar(ESC); putchar(c); ungetc(c2,fp); } } else if (c == '$') { c2 = getc(fp); if ((c2=='@') || (c2=='B')) flag = 1; else if (c2 == '(') { if ((c2=getc(fp)) == 'B') flag = 1; else { putchar(ESC); putchar(c); putchar('('); ungetc(c2,fp); } } else if ((c2=='H') || (c2=='J')) flag = 0; else { putchar(ESC); putchar(c); ungetc(c2,fp); } } else if (c == 'H') flag = 0; else if (c == 'K') flag = 1; else { putchar(ESC); putchar(c); } } else if ((flag!=0) && (c>=0x21) && (c<=0x7e)) { c2 = getc(fp); if ((c2<=0x20) || (c2>=0x7f)) { putchar(c); ungetc(c2,fp); } else { putchar(c | 0x80); putchar(c2 | 0x80); } } else if ((c>=0xa0) && (c<=0xdf)) { putchar(0xaa); putchar(c); } else if ((c>=0x81) && (c<=0xef)) { c2 = getc(fp); if ((c2<=0x3f) || (c2==0x7f) || (c2>=0xfd)) { putchar(c); ungetc(c2,fp); } else { if (c >= 0xa0) c = c - 0x40; c = (c-0x30)*2; if (c2 <= 0x7f) c2 = c2 + 1; if (c2 <= 0x9e) { c2 = c2 + 0x60; c = c - 1; } else c2 = c2 + 2; putchar(c); putchar(c2); } } else if (c == '\r') { c2 = getc(fp); if (c2 == '\n') putchar('\n'); else { putchar('\r'); ungetc(c2,fp); } } else putchar(c); } if (fp != stdin) fclose(fp); }