#include #include #include char *basename(char*); void maketab(unsigned char*); void conv(); void convqp(); void putbuf(unsigned char*, int); void convhtml(); unsigned char tab_alt2koi[] = { 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0x90, 0x91, 0x92, 0x81, 0x87, 0xb2, 0xb4, 0xa7, 0xa6, 0xb5, 0xa1, 0xa8, 0xae, 0xad, 0xac, 0x83, 0x84, 0x89, 0x88, 0x86, 0x80, 0x8a, 0xaf, 0xb0, 0xab, 0xa5, 0xbb, 0xb8, 0xb1, 0xa0, 0xbe, 0xb9, 0xba, 0xb6, 0xb7, 0xaa, 0xa9, 0xa2, 0xa4, 0xbd, 0xbc, 0x85, 0x82, 0x8d, 0x8c, 0x8e, 0x8f, 0x8b, 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, 0xb3, 0xa3, 0x99, 0x98, 0x93, 0x9b, 0x9f, 0x97, 0x9c, 0x95, 0x9e, 0x96, 0xbf, 0x9d, 0x94, 0x9a }; unsigned char tab_koi2alt[] = { 0xc4, 0xb3, 0xda, 0xbf, 0xc0, 0xd9, 0xc3, 0xb4, 0xc2, 0xc1, 0xc5, 0xdf, 0xdc, 0xdb, 0xdd, 0xde, 0xb0, 0xb1, 0xb2, 0xf4, 0xfe, 0xf9, 0xfb, 0xf7, 0xf3, 0xf2, 0xff, 0xf5, 0xf8, 0xfd, 0xfa, 0xf6, 0xcd, 0xba, 0xd5, 0xf1, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, 0xcc, 0xb5, 0xf0, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0xfc, 0xee, 0xa0, 0xa1, 0xe6, 0xa4, 0xa5, 0xe4, 0xa3, 0xe5, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xef, 0xe0, 0xe1, 0xe2, 0xe3, 0xa6, 0xa2, 0xec, 0xeb, 0xa7, 0xe8, 0xed, 0xe9, 0xe7, 0xea, 0x9e, 0x80, 0x81, 0x96, 0x84, 0x85, 0x94, 0x83, 0x95, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x9f, 0x90, 0x91, 0x92, 0x93, 0x86, 0x82, 0x9c, 0x9b, 0x87, 0x98, 0x9d, 0x99, 0x97, 0x9a }; unsigned char tab_alt2win[] = { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf }; unsigned char tab_win2alt[] = { 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef }; unsigned char tab_alt2iso[] = { 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0x9b, 0x9c, 0x9d, 0xa5, 0xa7, 0x83, 0x84, 0x85, 0x86, 0x97, 0x95, 0x91, 0x92, 0x8b, 0x8c, 0xa1, 0xa3, 0xa8, 0xa6, 0xa9, 0xa4, 0xaa, 0x8d, 0x8e, 0x93, 0x90, 0x98, 0x96, 0x99, 0x94, 0x9a, 0x80, 0x81, 0x82, 0x87, 0x88, 0x89, 0x8a, 0x8f, 0x9e, 0x9f, 0xa2, 0xa0, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; unsigned char tab_iso2alt[] = { 0xcf, 0xd0, 0xd1, 0xb5, 0xb6, 0xb7, 0xb8, 0xd2, 0xd3, 0xd4, 0xd5, 0xbd, 0xbe, 0xc6, 0xc7, 0xd6, 0xc9, 0xbb, 0xbc, 0xc8, 0xcd, 0xba, 0xcb, 0xb9, 0xca, 0xcc, 0xce, 0xb0, 0xb1, 0xb2, 0xd7, 0xd8, 0xda, 0xbf, 0xd9, 0xc0, 0xc4, 0xb3, 0xc2, 0xb4, 0xc1, 0xc3, 0xc5, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; unsigned char tab[] = { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; char tab_hex[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }; struct html { unsigned char *str; int code; }; struct html tab_html[] = { "€", 128, "", 129, "‚", 130, "ƒ", 131, "„", 132, "…", 133, "†", 134, "‡", 135, "ˆ", 136, "‰", 137, "Š", 138, "‹", 139, "Œ", 140, "", 141, "Ž", 142, "", 143, "", 144, "‘", 145, "’", 146, "“", 147, "”", 148, "•", 149, "–", 150, "—", 151, "˜", 152, "™", 153, "š", 154, "›", 155, "œ", 156, "", 157, "ž", 158, "Ÿ", 159, " ", 160, "¡", 161, "¢", 162, "£", 163, "¤", 164, "¥", 165, "¦", 166, "§", 167, "¨", 168, "©", 169, "ª", 170, "«", 171, "¬", 172, "­", 173, "®", 174, "¯", 175, "°", 176, "±", 177, "²", 178, "³", 179, "´", 180, "µ", 181, "¶", 182, "·", 183, "¸", 184, "¹", 185, "º", 186, "»", 187, "¼", 188, "½", 189, "¾", 190, "¿", 191, "À", 192, "Á", 193, "Â", 194, "Ã", 195, "Ä", 196, "Å", 197, "Æ", 198, "Ç", 199, "È", 200, "É", 201, "Ê", 202, "Ë", 203, "Ì", 204, "Í", 205, "Î", 206, "Ï", 207, "Ð", 208, "Ñ", 209, "Ò", 210, "Ó", 211, "Ô", 212, "Õ", 213, "Ö", 214, "×", 215, "Ø", 216, "Ù", 217, "Ú", 218, "Û", 219, "Ü", 220, "Ý", 221, "Þ", 222, "ß", 223, "à", 224, "á", 225, "â", 226, "ã", 227, "ä", 228, "å", 229, "æ", 230, "ç", 231, "è", 232, "é", 233, "ê", 234, "ë", 235, "ì", 236, "í", 237, "î", 238, "ï", 239, "ð", 240, "ñ", 241, "ò", 242, "ó", 243, "ô", 244, "õ", 245, "ö", 246, "÷", 247, "ø", 248, "ù", 249, "ú", 250, "û", 251, "ü", 252, "ý", 253, "þ", 254, "ÿ", 255, " ", 160, "¡", 161, "¢", 162, "£", 163, "¤", 164, "¥", 165, "¦", 166, "§", 167, "¨", 168, "©", 169, "ª", 170, "«", 171, "¬", 172, "­", 173, "®", 174, "¯", 175, "°", 176, "±", 177, "²", 178, "³", 179, "´", 180, "µ", 181, "¶", 182, "·", 183, "¸", 184, "¹", 185, "º", 186, "»", 187, "¼", 188, "½", 189, "¾", 190, "¿", 191, "À", 192, "Á", 193, "Â", 194, "Ã", 195, "Ä", 196, "Å", 197, "Æ", 198, "Ç", 199, "È", 200, "É", 201, "Ê", 202, "Ë", 203, "Ì", 204, "Í", 205, "Î", 206, "Ï", 207, "Ð", 208, "Ñ", 209, "Ò", 210, "Ó", 211, "Ô", 212, "Õ", 213, "Ö", 214, "×", 215, "Ø", 216, "Ù", 217, "Ú", 218, "Û", 219, "Ü", 220, "Ý", 221, "Þ", 222, "ß", 223, "à", 224, "á", 225, "â", 226, "ã", 227, "ä", 228, "å", 229, "æ", 230, "ç", 231, "è", 232, "é", 233, "ê", 234, "ë", 235, "ì", 236, "í", 237, "î", 238, "ï", 239, "ð", 240, "ñ", 241, "ò", 242, "ó", 243, "ô", 244, "õ", 245, "ö", 246, "÷", 247, "ø", 248, "ù", 249, "ú", 250, "û", 251, "ü", 252, "ý", 253, "þ", 254, "ÿ", 255, NULL, 0 }; #define USAGE "Usage: {codeset_in2codeset_out | reconv} [-q] [-w]\n"\ " codeset_in, codeset_out\talt | koi | win | iso\n"\ " -q\t\t\t\tfrom Quoted-Printable to ASCII\n"\ " -w\t\t\t\tfrom HTML escape sequences to ASCII\n" #define MAXHTMLSTR 8 #define convchar(c) (((c) & 0x80) ? tab[(c) & 0x7f] : (c)) #define hexchar(c) (((c) & 0x80) ? -1 : tab_hex[(c)]) char *basename(char *path) { char *basename; if((basename = strrchr(path, (int) '/')) == NULL) return(path); else return(basename + 1); } void maketab(unsigned char *tab_conv) { int ch; for(ch = 0; ch < 128; ch++) tab[ch] = tab_conv[tab[ch] & 0x7f]; } void conv() { int ch; while((ch = getchar()) != EOF) putchar(convchar(ch)); } void convqp() { int ch1, ch2, hch1, hch2; while((ch1 = getchar()) != EOF) { if(ch1 == '=') { if((ch1 = getchar()) == EOF) { putchar('='); break; } if(ch1 != '\n') { if((ch2 = getchar()) == EOF) { putchar('='); putchar(convchar(ch1)); break; } hch1 = hexchar(ch1); hch2 = hexchar(ch2); if(hch1 == -1 || hch2 == -1) { putchar('='); putchar(convchar(ch1)); putchar(convchar(ch2)); continue; } putchar(convchar(hch1 << 4 | hch2)); } } else putchar(convchar(ch1)); } } void putbuf(unsigned char *buf, int len) { int i; for(i = 0; i < len; i++) putchar(convchar(buf[i])); } void convhtml() { struct html *phtml; unsigned char buf[MAXHTMLSTR + 1]; int len = 0, ch; while((ch = getchar()) != EOF) { switch(ch) { case '&': if(len) putbuf(buf, len); buf[0] = ch; len = 1; break; case ';': if(!len) { putchar(';'); break; } buf[len++] = ch; buf[len] = 0; for(phtml = tab_html; phtml->str != NULL; phtml++) if(!strcmp(phtml->str, buf)) { putchar(convchar(phtml->code)); break; } if(phtml->str == NULL) putbuf(buf, len); len = 0; break; default: if(!len) { putchar(convchar(ch)); break; } buf[len++] = ch; if(len == MAXHTMLSTR) { putbuf(buf, len); len = 0; } break; } } if(len) putbuf(buf, len); } int main(int argc, char *argv[]) { char *bname; bname = basename(argv[0]); if(!strcmp(bname, "alt2koi")) { maketab(tab_alt2koi); } else if(!strcmp(bname, "koi2alt")) { maketab(tab_koi2alt); } else if(!strcmp(bname, "alt2win")) { maketab(tab_alt2win); } else if(!strcmp(bname, "win2alt")) { maketab(tab_win2alt); } else if(!strcmp(bname, "alt2iso")) { maketab(tab_alt2iso); } else if(!strcmp(bname, "iso2alt")) { maketab(tab_iso2alt); } else if(!strcmp(bname, "koi2win")) { maketab(tab_koi2alt); maketab(tab_alt2win); } else if(!strcmp(bname, "win2koi")) { maketab(tab_win2alt); maketab(tab_alt2koi); } else if(!strcmp(bname, "koi2iso")) { maketab(tab_koi2alt); maketab(tab_alt2iso); } else if(!strcmp(bname, "iso2koi")) { maketab(tab_iso2alt); maketab(tab_alt2koi); } else if(!strcmp(bname, "win2iso")) { maketab(tab_win2alt); maketab(tab_alt2iso); } else if(!strcmp(bname, "iso2win")) { maketab(tab_iso2alt); maketab(tab_alt2win); } if(argc < 2 || strlen(argv[1]) < 2 || argv[1][0] != '-') conv(); else switch(argv[1][1]) { case 'q': convqp(); break; case 'w': convhtml(); break; default: fprintf(stderr, "%s", USAGE); return(1); } return(0); }