#include <string.h>
#include <ctype.h>

#include <charsettools.h>

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



syntax highlighted by Code2HTML, v. 0.9.1