home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 22 gnu / 22-gnu.zip / gnurecod.zip / cdcnos.c < prev    next >
C/C++ Source or Header  |  1994-02-04  |  8KB  |  323 lines

  1. /* Conversion of files between different charsets and usages.
  2.    Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
  3.    Francois Pinard <pinard@iro.umontreal.ca>, 1988.
  4.  
  5.    This program is free software; you can redistribute it and/or modify
  6.    it under the terms of the GNU General Public License as published by
  7.    the Free Software Foundation; either version 2, or (at your option)
  8.    any later version.
  9.  
  10.    This program is distributed in the hope that it will be useful, but
  11.    WITHOUT ANY WARRANTY; without even the implied warranty of
  12.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.    General Public License for more details.
  14.  
  15.    You should have received a copy of the GNU General Public License
  16.    along with this program; if not, write to the Free Software
  17.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19.  
  20. #include "recode.h"
  21.  
  22. static const char *const translation_table[128] =
  23.   {
  24.     "^5",            /*   0 */
  25.     "^6",            /*   1 */
  26.     "^7",            /*   2 */
  27.     "^8",            /*   3 */
  28.     "^9",            /*   4 */
  29.     "^+",            /*   5 */
  30.     "^-",            /*   6 */
  31.     "^*",            /*   7 */
  32.     "^/",            /*   8 */
  33.     "^(",            /*   9 */
  34.     "\n",            /*  10, would have been "^)" */
  35.     "^$",            /*  11 */
  36.     "^=",            /*  12 */
  37.     "^ ",            /*  13 */
  38.     "^,",            /*  14 */
  39.     "^.",            /*  15 */
  40.     "^#",            /*  16 */
  41.     "^[",            /*  17 */
  42.     "^]",            /*  18 */
  43.     "^%",            /*  19 */
  44.     "^\"",            /*  20 */
  45.     "^_",            /*  21 */
  46.     "^!",            /*  22 */
  47.     "^&",            /*  23 */
  48.     "^'",            /*  24 */
  49.     "^?",            /*  25 */
  50.     "^<",            /*  26 */
  51.     "^>",            /*  27 */
  52.     "^@",            /*  28 */
  53.     "^\\",            /*  29 */
  54.     "^^",            /*  30 */
  55.     "^;",            /*  31 */
  56.     " ",            /*  32 */
  57.     "!",            /*  33 */
  58.     "\"",            /*  34 */
  59.     "#",            /*  35 */
  60.     "$",            /*  36 */
  61.     "%",            /*  37 */
  62.     "&",            /*  38 */
  63.     "'",            /*  39 */
  64.     "(",            /*  40 */
  65.     ")",            /*  41 */
  66.     "*",            /*  42 */
  67.     "+",            /*  43 */
  68.     ",",            /*  44 */
  69.     "-",            /*  45 */
  70.     ".",            /*  46 */
  71.     "/",            /*  47 */
  72.     "0",            /*  48 */
  73.     "1",            /*  49 */
  74.     "2",            /*  50 */
  75.     "3",            /*  51 */
  76.     "4",            /*  52 */
  77.     "5",            /*  53 */
  78.     "6",            /*  54 */
  79.     "7",            /*  55 */
  80.     "8",            /*  56 */
  81.     "9",            /*  57 */
  82.     "@D",            /*  58 */
  83.     ";",            /*  59 */
  84.     "<",            /*  60 */
  85.     "=",            /*  61 */
  86.     ">",            /*  62 */
  87.     "?",            /*  63 */
  88.     "@A",            /*  64 */
  89.     "A",            /*  65 */
  90.     "B",            /*  66 */
  91.     "C",            /*  67 */
  92.     "D",            /*  68 */
  93.     "E",            /*  69 */
  94.     "F",            /*  70 */
  95.     "G",            /*  71 */
  96.     "H",            /*  72 */
  97.     "I",            /*  73 */
  98.     "J",            /*  74 */
  99.     "K",            /*  75 */
  100.     "L",            /*  76 */
  101.     "M",            /*  77 */
  102.     "N",            /*  78 */
  103.     "O",            /*  79 */
  104.     "P",            /*  80 */
  105.     "Q",            /*  81 */
  106.     "R",            /*  82 */
  107.     "S",            /*  83 */
  108.     "T",            /*  84 */
  109.     "U",            /*  85 */
  110.     "V",            /*  86 */
  111.     "W",            /*  87 */
  112.     "X",            /*  88 */
  113.     "Y",            /*  89 */
  114.     "Z",            /*  90 */
  115.     "[",            /*  91 */
  116.     "\\",            /*  92 */
  117.     "]",            /*  93 */
  118.     "@B",            /*  94 */
  119.     "_",            /*  95 */
  120.     "@G",            /*  96 */
  121.     "^A",            /*  97 */
  122.     "^B",            /*  98 */
  123.     "^C",            /*  99 */
  124.     "^D",            /* 100 */
  125.     "^E",            /* 101 */
  126.     "^F",            /* 102 */
  127.     "^G",            /* 103 */
  128.     "^H",            /* 104 */
  129.     "^I",            /* 105 */
  130.     "^J",            /* 106 */
  131.     "^K",            /* 107 */
  132.     "^L",            /* 108 */
  133.     "^M",            /* 109 */
  134.     "^N",            /* 110 */
  135.     "^O",            /* 111 */
  136.     "^P",            /* 112 */
  137.     "^Q",            /* 113 */
  138.     "^R",            /* 114 */
  139.     "^S",            /* 115 */
  140.     "^T",            /* 116 */
  141.     "^U",            /* 117 */
  142.     "^V",            /* 118 */
  143.     "^W",            /* 119 */
  144.     "^X",            /* 120 */
  145.     "^Y",            /* 121 */
  146.     "^Z",            /* 122 */
  147.     "^0",            /* 123 */
  148.     "^1",            /* 124 */
  149.     "^2",            /* 125 */
  150.     "^3",            /* 126 */
  151.     "^4",            /* 127 */
  152.   };
  153.  
  154. static void
  155. init_ascii_cdcnos (STEP *step)
  156. {
  157.   const char **table;
  158.   int counter;
  159.  
  160.   table = (const char **) xmalloc (256 * sizeof (char *));
  161.   for (counter = 0; counter < 128; counter++)
  162.     table[counter] = translation_table[counter];
  163.   for (; counter < 256; counter++)
  164.     table[counter] = NULL;
  165.  
  166.   step->one_to_many = table;
  167. }
  168.  
  169. /* Previous obsolete lex code:
  170.  
  171. @A            { output ('@'); }
  172. @B            { output ('^'); }
  173. @D            { output (':'); }
  174. @G            { output ('`'); }
  175.  
  176. \^" "            { output ( 13); }
  177. \^!            { output ( 22); }
  178. \^\"            { output ( 20); }
  179. \^#            { output ( 16); }
  180. \^$            { output ( 11); }
  181. \^\%            { output ( 19); }
  182. \^&            { output ( 23); }
  183. \^'            { output ( 24); }
  184. \^\(            { output (  9); }
  185. \^\)            { output ( 10); }
  186. \^\*            { output (  7); }
  187. \^\+            { output (  5); }
  188. \^\,            { output ( 14); }
  189. \^-            { output (  6); }
  190. \^\.            { output ( 15); }
  191. \^\/            { output (  8); }
  192.  
  193. \^0            { output ('{'); }
  194. \^1            { output ('|'); }
  195. \^2            { output ('}'); }
  196. \^3            { output ('~'); }
  197. \^4            { output (127); }
  198.  
  199. \^5            { output (  0); }
  200. \^6            { output (  1); }
  201. \^7            { output (  2); }
  202. \^8            { output (  3); }
  203. \^9            { output (  4); }
  204.  
  205. \^;            { output ( 31); }
  206. \^<            { output ( 26); }
  207. \^=            { output ( 12); }
  208. \^>            { output ( 27); }
  209. \^?            { output ( 25); }
  210. \^@            { output ( 28); }
  211.  
  212. \^[A-Z]            { output (yytext[1]-'A'+'a'); }
  213.  
  214. \^\[            { output ( 17); }
  215. \^\\            { output ( 29); }
  216. \^]            { output ( 18); }
  217. \^\^            { output ( 30); }
  218. \^_            { output ( 21); }
  219.  
  220. \^[a-z]            { output (yytext[1]); }
  221.  
  222. */
  223.  
  224. static int
  225. file_cdcnos_ascii (const STEP *step, FILE *input_file, FILE *output_file)
  226. {
  227.   int reversible;        /* reversibility of recoding */
  228.   int input_char;        /* current character */
  229.  
  230.   reversible = 1;
  231.   while (input_char = getc (input_file), input_char != EOF)
  232.     {
  233.       switch (input_char)
  234.     {
  235.         case '@':
  236.       switch ((input_char = getc (input_file)))
  237.         {
  238.         case 'A': case 'a': input_char = '@'; break;
  239.         case 'B': case 'b': input_char = '^'; break;
  240.         case 'D': case 'd': input_char = ':'; break;
  241.         case 'G': case 'g': input_char = '`'; break;
  242.  
  243.         default:
  244.           reversible = 0;
  245.           putc ('@', output_file);
  246.           if (input_char == EOF)
  247.         return 0;
  248.         }
  249.       break;
  250.  
  251.     case '^':
  252.       input_char = getc (input_file);
  253.       if (input_char >= 'A' && input_char <= 'Z')
  254.         input_char += 'a' - 'A';
  255.       else if (input_char < 'a' || input_char > 'z')
  256.         switch (input_char)
  257.           {
  258.           case ' ': input_char = 13; break;
  259.           case '!': input_char = 22; break;
  260.           case '"': input_char = 20; break;
  261.           case '#': input_char = 16; break;
  262.           case '$': input_char = 11; break;
  263.           case '%': input_char = 19; break;
  264.           case '&': input_char = 23; break;
  265.           case '\'': input_char = 24; break;
  266.           case '(': input_char = 9; break;
  267.  
  268.           case ')':
  269.         reversible = 0;
  270.         input_char = '\n'; /* 10 */
  271.         break;
  272.  
  273.           case '*': input_char = 7; break;
  274.           case '+': input_char = 5; break;
  275.           case ',': input_char = 14; break;
  276.           case '-': input_char = 6; break;
  277.           case '.': input_char = 15; break;
  278.           case '/': input_char = 8; break;
  279.           case '0': input_char = '{'; break;
  280.           case '1': input_char = '|'; break;
  281.           case '2': input_char = '}'; break;
  282.           case '3': input_char = '~'; break;
  283.           case '4': input_char = 127; break;
  284.           case '5': input_char = 0; break;
  285.           case '6': input_char = 1; break;
  286.           case '7': input_char = 2; break;
  287.           case '8': input_char = 3; break;
  288.           case '9': input_char = 4; break;
  289.           case ';': input_char = 31; break;
  290.           case '<': input_char = 26; break;
  291.           case '=': input_char = 12; break;
  292.           case '>': input_char = 27; break;
  293.           case '?': input_char = 25; break;
  294.           case '@': input_char = 28; break;
  295.           case '[': input_char = 17; break;
  296.           case '\\': input_char = 29; break;
  297.           case ']': input_char = 18; break;
  298.           case '^': input_char = 30; break;
  299.           case '_': input_char = 21; break;
  300.  
  301.           default:
  302.         reversible = 0;
  303.             putc ('^', output_file);
  304.             if (input_char == EOF)
  305.           return 0;
  306.           }
  307.       break;
  308.     }
  309.       putc (input_char, output_file);
  310.     }
  311.   return reversible;
  312. }
  313.  
  314. void
  315. module_cdcnos (void)
  316. {
  317.   declare_step ("ASCII-BS", "CDC-NOS", ONE_TO_MANY, init_ascii_cdcnos,
  318.         file_one_to_many);
  319.   declare_step ("CDC-NOS", "ASCII-BS", MANY_TO_ONE, NULL, file_cdcnos_ascii);
  320.  
  321.   declare_alias ("NOS", "CDC-NOS");
  322. }
  323.