#include #include #include void ibm2ascii(const char *in, char *out, bool clean) { while(*in!=0) { if(*in>=0 && *in<126) { if(*in>=' ' || clean) *(out++)=*in; } else { switch(*in) { case '': *(out++)='a'; *(out++)='e'; break; case '': *(out++)='o'; *(out++)='e'; break; case '': *(out++)='u'; *(out++)='e'; break; case '': *(out++)='s'; *(out++)='s'; break; case '': *(out++)='A'; *(out++)=islower(*(in+1))?'e':'E'; break; case '': *(out++)='O'; *(out++)=islower(*(in+1))?'e':'E'; break; case '': *(out++)='U'; *(out++)=islower(*(in+1))?'e':'E'; break; default: { char data=*in; ibm2iso(&data, 1); if(data>=0 && data<126) *(out++)=data; } } } in++; } *out=0; } void iso2ascii(const char *in, char *out, bool clean) { while(*in!=0) { if(*in>=0 && *in<126) { if(*in>=' ' || clean) *(out++)=*in; } else { char data=*in; iso2ibm(&data, 1); switch(data) { case '': *(out++)='a'; *(out++)='e'; break; case '': *(out++)='o'; *(out++)='e'; break; case '': *(out++)='u'; *(out++)='e'; break; case '': *(out++)='s'; *(out++)='s'; break; case '': *(out++)='A'; *(out++)=islower(*(in+1))?'e':'E'; break; case '': *(out++)='O'; *(out++)=islower(*(in+1))?'e':'E'; break; case '': *(out++)='U'; *(out++)=islower(*(in+1))?'e':'E'; break; default: if(data>=0 && data<126) *(out++)=data; } } in++; } *out=0; } #define BAD ' ' static char s_437xiso[]= /* 000-255 */ { 0, 1, 2, 3, 4, 5, 6, 7, /* 000-007 */ 8, 9, 10, 11, 12, 13, 14, 15, /* 008-015 */ 16, 17, 18, 19, 182, 167, 22, 23, /* 016-023 */ 24, 25, 26, 27, 28, 29, 30, 31, /* 024-031 */ ' ', '!', 34, '#', '$', 37, '&', 39, /* 032-039 */ '(', ')', '*', '+', ',', '-', '.', '/', /* 040-047 */ '0', '1', '2', '3', '4', '5', '6', '7', /* 048-055 */ '8', '9', ':', ';', '<', '=', '>', '?', /* 056-063 */ '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', /* 064-071 */ 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', /* 072-079 */ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', /* 080-087 */ 'X', 'Y', 'Z', '[', 92, ']', '^', '_', /* 088-095 */ 96, 'a', 'b', 'c', 'd', 'e', 'f', 'g', /* 096-103 */ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', /* 104-111 */ 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', /* 112-119 */ 'x', 'y', 'z', '{', '|', '}', 126, 127, /* 120-127 */ 199, 252, 233, 226, 228, 224, 229, 231, /* 128-135 */ 234, 235, 232, 239, 238, 236, 196, 197, /* 136-143 */ 201, 230, 198, 244, 246, 242, 251, 249, /* 144-151 */ 255, 214, 220, 162, 163, 165, 'P', 'f', /* 152-159 */ 225, 237, 243, 250, 241, 209, 170, 186, /* 160-167 */ 191, '-', 172, 189, 188, 161, 171, 187, /* 168-175 */ '#', '#', '#', '|', '|', '|', '|', '+', /* 176-183 */ '+', '|', '|', '+', '+', '+', '+', '+', /* 184-191 */ '+', '-', '-', '|', '-', '+', '|', '|', /* 192-199 */ '+', '+', '-', '|', '|', '-', '+', '-', /* 200-207 */ '-', '-', '-', '+', '+', '+', '+', '+', /* 208-215 */ '+', '+', '+', '#', '#', '#', '#', '#', /* 216-223 */ 'a', 223, 'G', 'n', 'S', 's', 181, 't', /* 224-231 */ 'O', 'O', 'O', 'd', BAD, 'O', 'e', BAD, /* 232-239 */ '=', 177, BAD, BAD, BAD, BAD, 247, '=', /* 240-247 */ 176, 183, 183, 'V', 'n', 178, 183, ' ' /* 248-255 */ }; #undef BAD void ibm2iso(char *buffer, size_t len) { while(len--) { *buffer=s_437xiso[(byte)*buffer]; buffer++; } } #define BAD ' ' static char s_isox437[]= /* 000-255 */ { 0, 1, 2, 3, 4, 5, 6, 7, /* 000-007 */ 8, 9, 10, 11, 12, 13, 14, 15, /* 008-015 */ 16, 17, 18, 19, 20, 21, 22, 23, /* 016-023 */ 24, 25, 26, 27, 28, 29, 30, 31, /* 024-031 */ ' ', '!', 34, '#', '$', 37, '&', 39, /* 032-039 */ '(', ')', '*', '+', ',', '-', '.', '/', /* 040-047 */ '0', '1', '2', '3', '4', '5', '6', '7', /* 048-055 */ '8', '9', ':', ';', '<', '=', '>', '?', /* 056-063 */ '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', /* 064-071 */ 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', /* 072-079 */ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', /* 080-087 */ 'X', 'Y', 'Z', '[', 92, ']', '^', '_', /* 088-095 */ 96, 'a', 'b', 'c', 'd', 'e', 'f', 'g', /* 096-103 */ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', /* 104-111 */ 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', /* 112-119 */ 'x', 'y', 'z', '{', '|', '}', 126, 127, /* 120-127 */ BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, /* 128-135 */ BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, /* 136-143 */ BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, /* 144-151 */ BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, /* 152-159 */ ' ', 173, 155, 156, 'o', 157, '|', 21, /* 160-167 */ 34, 'C', 166, 174, 170, '-', 'R', '-', /* 168-175 */ 248, 241, 253, '3', 39, 230, 20, 250, /* 176-183 */ ',', '1', 167, 175, 172, 171, BAD, 168, /* 184-191 */ 'A', 'A', 'A', 'A', 142, 143, 146, 128, /* 192-199 */ 'E', 144, 'E', 'E', 'I', 'I', 'I', 'I', /* 200-207 */ 'D', 165, 'O', 'O', 'O', 'O', 153, 'X', /* 208-215 */ 'O', 'U', 'U', 'U', 154, 'Y', 'P', 225, /* 216-223 */ 133, 160, 131, 'a', 132, 134, 145, 135, /* 224-231 */ 138, 130, 136, 137, 141, 161, 140, 139, /* 232-239 */ 'd', 164, 149, 162, 147, 'o', 148, 246, /* 240-247 */ 'o', 151, 163, 150, 129, 'y', 'p', 152 /* 248-255 */ }; void iso2ibm(char *buffer, size_t len) { while(len--) { *buffer=s_isox437[(byte)*buffer]; buffer++; } } #undef BAD