home *** CD-ROM | disk | FTP | other *** search
/ Mega Top 1 / os2_top1.zip / os2_top1 / APPS / TEKST / GRECODE / ICONQNX.C < prev    next >
C/C++ Source or Header  |  1993-12-06  |  5KB  |  223 lines

  1. /* Conversion of files between different charsets and usages.
  2.    Copyright (C) 1990, 1993 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. #define DOS_CR 13        /* carriage return */
  23. #define DOS_LF 10        /* line feed */
  24. #define DOS_EOF 26        /* old end of file */
  25.  
  26. #define ESCAPE 25        /* escape for diacritic application */
  27. #define ENDLINE 30        /* end-line code for QNX */
  28.  
  29. #define TRANSLATE_AND_BREAK(c2, c3) \
  30.   putc (ESCAPE, output_file); \
  31.   putc (c2, output_file); \
  32.   putc (c3, output_file); \
  33.   input_char = getc (input_file); \
  34.   break;
  35.  
  36. static void
  37. file_ibmpc_iconqnx (const STEP *step, FILE *input_file, FILE *output_file)
  38. {
  39.   int input_char;
  40.  
  41.   input_char = getc (input_file);
  42.   while (input_char != EOF && input_char != DOS_EOF)
  43.     switch (input_char)
  44.       {
  45.       case 133: TRANSLATE_AND_BREAK ('A', 'a');
  46.       case 138: TRANSLATE_AND_BREAK ('A', 'e');
  47.       case 151: TRANSLATE_AND_BREAK ('A', 'u');
  48.       case 130: TRANSLATE_AND_BREAK ('B', 'e');
  49.       case 144: TRANSLATE_AND_BREAK ('B', 'E');
  50.       case 131: TRANSLATE_AND_BREAK ('C', 'a');
  51.       case 136: TRANSLATE_AND_BREAK ('C', 'e');
  52.       case 140: TRANSLATE_AND_BREAK ('C', 'i');
  53.       case 147: TRANSLATE_AND_BREAK ('C', 'o');
  54.       case 150: TRANSLATE_AND_BREAK ('C', 'u');
  55.       case 137: TRANSLATE_AND_BREAK ('H', 'e');
  56.       case 139: TRANSLATE_AND_BREAK ('H', 'i');
  57.       case 129: TRANSLATE_AND_BREAK ('H', 'u');
  58.       case 135: TRANSLATE_AND_BREAK ('K', 'c');
  59.       case 128: TRANSLATE_AND_BREAK ('K', 'C');
  60.  
  61.       case DOS_CR:
  62.     input_char = getc (input_file);
  63.     if (input_char == DOS_LF)
  64.       {
  65.         putc (ENDLINE, output_file);
  66.         input_char = getc (input_file);
  67.       }
  68.     else
  69.       putc (DOS_CR, output_file);
  70.     break;
  71.  
  72.       default:
  73.     putc (input_char, output_file);
  74.     input_char = getc (input_file);
  75.       }
  76. }
  77.  
  78. /* Previous obsolete lex code:
  79.  
  80. Esc            25
  81.  
  82. %%
  83.  
  84. {Esc}Aa            { output (133); }
  85. {Esc}Ae            { output (138); }
  86. {Esc}Au            { output (151); }
  87.  
  88. {Esc}Be            { output (130); }
  89. {Esc}BE            { output (144); }
  90.  
  91. {Esc}Ca            { output (131); }
  92. {Esc}Ce            { output (136); }
  93. {Esc}Ci            { output (140); }
  94. {Esc}Co            { output (147); }
  95. {Esc}Cu            { output (150); }
  96.  
  97. {Esc}He            { output (137); }
  98. {Esc}Hi            { output (139); }
  99. {Esc}Hu            { output (129); }
  100.  
  101. {Esc}Kc            { output (135); }
  102. {Esc}KC            { output (128); }
  103.  
  104. */
  105.  
  106. static void
  107. file_iconqnx_ibmpc (const STEP *step, FILE *input_file, FILE *output_file)
  108. {
  109.   int input_char;        /* current character */
  110.  
  111.   while (input_char = getc (input_file), input_char != EOF)
  112.     {
  113.       switch (input_char)
  114.     {
  115.     case ENDLINE:
  116.       putc (DOS_CR, output_file);
  117.       putc (DOS_LF, output_file);
  118.       break;
  119.  
  120.     case ESCAPE:
  121.       input_char = getc (input_file);
  122.       switch (input_char)
  123.         {
  124.         case 'A':
  125.           input_char = getc (input_file);
  126.           switch (input_char)
  127.         {
  128.         case 'a': input_char = 133; break;
  129.         case 'e': input_char = 138; break;
  130.         case 'u': input_char = 151; break;
  131.  
  132.         default:
  133.           putc (ESCAPE, output_file);
  134.           putc ('A', output_file);
  135.           if (input_char == EOF)
  136.             return;
  137.         }
  138.           break;
  139.  
  140.         case 'B':
  141.           input_char = getc (input_file);
  142.           switch (input_char)
  143.         {
  144.         case 'e': input_char = 130; break;
  145.         case 'E': input_char = 144; break;
  146.  
  147.         default:
  148.           putc (ESCAPE, output_file);
  149.           putc ('B', output_file);
  150.           if (input_char == EOF)
  151.             return;
  152.         }
  153.           break;
  154.  
  155.         case 'C':
  156.           input_char = getc (input_file);
  157.           switch (input_char)
  158.         {
  159.         case 'a': input_char = 131; break;
  160.         case 'e': input_char = 136; break;
  161.         case 'i': input_char = 140; break;
  162.         case 'o': input_char = 147; break;
  163.         case 'u': input_char = 150; break;
  164.  
  165.         default:
  166.           putc (ESCAPE, output_file);
  167.           putc ('C', output_file);
  168.           if (input_char == EOF)
  169.             return;
  170.         }
  171.           break;
  172.  
  173.         case 'H':
  174.           input_char = getc (input_file);
  175.           switch (input_char)
  176.         {
  177.         case 'e': input_char = 137; break;
  178.         case 'i': input_char = 139; break;
  179.         case 'u': input_char = 129; break;
  180.  
  181.         default:
  182.           putc (ESCAPE, output_file);
  183.           putc ('H', output_file);
  184.           if (input_char == EOF)
  185.             return;
  186.         }
  187.           break;
  188.  
  189.         case 'K':
  190.           input_char = getc (input_file);
  191.           switch (input_char)
  192.         {
  193.         case 'c': input_char = 135; break;
  194.         case 'C': input_char = 128; break;
  195.  
  196.         default:
  197.           putc (ESCAPE, output_file);
  198.           putc ('K', output_file);
  199.           if (input_char == EOF)
  200.             return;
  201.         }
  202.           break;
  203.  
  204.         default:
  205.           putc (ESCAPE, output_file);
  206.           if (input_char == EOF)
  207.         return;
  208.         }
  209.       /* fall through */
  210.  
  211.     default:
  212.       putc (input_char, output_file);
  213.     }
  214.     }
  215. }
  216.  
  217. void
  218. module_iconqnx (void)
  219. {
  220.   declare_step ("ibmpc", "iconqnx", MANY_TO_MANY, NULL, file_ibmpc_iconqnx);
  221.   declare_step ("iconqnx", "ibmpc", MANY_TO_MANY, NULL, file_iconqnx_ibmpc);
  222. }
  223.