sinocode.c
上传用户:minyiyu
上传日期:2018-12-24
资源大小:864k
文件大小:19k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /*
  2.   Copyright (C) 1992 Per Hammarlund <perham@nada.kth.se>
  3. */
  4. /*
  5.   Written by Per Hammarlund <perham@nada.kth.se>
  6.   Helpful remarks from Ken-Ichi Handa <handa@etl.go.jp>.
  7.   The sinoco??.cod (translation) files are provided by Urs Widmer
  8.   <a06g@alf.zfn.uni-bremen.de>.
  9. */
  10. /*
  11.   This program is free software; you can redistribute it and/or modify
  12.   it under the terms of the GNU General Public License as published by
  13.   the Free Software Foundation; either version 1, or (at your option)
  14.   any later version.
  15.  
  16.   This program is distributed in the hope that it will be useful,
  17.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.   GNU General Public License for more details.
  20.  
  21.   You should have received a copy of the GNU General Public License
  22.   along with this program; if not, write to the Free Software
  23.   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  24. */ 
  25. #include <stdio.h>
  26. #include <strings.h>
  27. #include <stdlib.h>
  28. #define VERSIONSTRING "Sinocode Version 0.11"
  29. /* make sure that you have a "/" at */
  30. /* the end of this string. */
  31. #ifndef TRANSLATIONSFILESDIR
  32. #define TRANSLATIONSFILESDIR "/home/sans/perham/src/new-sinocode/"
  33. #endif
  34. #define PROGNAME 0
  35. #define HELPORVERSION 1
  36. #define INFILECONV 1
  37. #define INFILENAME 2
  38. #define OUTFILECONV 3
  39. #define OUTFILENAME 4
  40. #define GB_2312_TO_BIG_5     0
  41. #define GB_2312_TO_IBM_555   1
  42. #define GB_2312_TO_JIS_EUC   2
  43. #define BIG_5_TO_GB_2312     3
  44. #define BIG_5_TO_IBM_555     4
  45. #define BIG_5_TO_JIS_EUC     5
  46. #define JIS_EUC_TO_GB_2312   6
  47. #define JIS_EUC_TO_BIG_5     7
  48. #define IBM_555_TO_BIG_5     8
  49. #define IBM_555_TO_GB_2312   9
  50. /* this should be done with a malloc */
  51. /* depending on the size of the */
  52. /* translation file... */
  53. #define NO_CHAR_IN_TABLE 16000
  54. #define FIRST 0
  55. #define SECOND 1
  56. #define NULL 0
  57. /* numbering the coding */
  58. #define NO_CODES     4
  59. #define JIS_EUC_CODE 0
  60. #define BIG5_CODE    1
  61. #define GB2312_CODE  2
  62. #define IBM555_CODE  3
  63. /* some strings for some useful */
  64. /* missing characters */
  65. #define NO_NAMED_CHARACTERS 3
  66. #define FAT_EQUAL  "fat_equal"
  67. #define BLACK_BOX  "black_box"
  68. #define SQUARE_BOX "square_box"
  69. /* the names of the missing chars */
  70. /* enviornment vars */
  71. #define SINOCODE_DEFAULT_MISSING_CHAR "SINOMISSDEF"
  72. #define JIS_EUC_CHAR                  "SINOJISEUC"
  73. #define BIG5_CHAR                     "SINOBIG5"
  74. #define GB2312_CHAR                   "SINOGB2312"
  75. #define IBM555_CHAR                   "SINOIBM555"
  76. typedef unsigned short u16;
  77. typedef struct code_pair
  78. {
  79.   char first, second;
  80. } code_pair;
  81. typedef struct named_character 
  82. {
  83.   char * char_name;
  84.   code_pair character_codes[NO_CODES];
  85. } named_character;
  86. named_character codes_for_named_characters[NO_NAMED_CHARACTERS] = 
  87. {
  88.   {FAT_EQUAL,
  89.      {
  90.        {(char) 0xA2, (char) 0xAE},
  91.        {(char) 0x21, (char) 0x7E},
  92.        {(char) 0xA1, (char) 0xFE},
  93.        {(char) 0x22, (char) 0x2E}
  94.      }},
  95.   {BLACK_BOX,
  96.      {
  97.        {(char) 0xA2, (char) 0xA3},
  98.        {(char) 0xA1, (char) 0xBD},
  99.        {(char) 0xA1, (char) 0xF6},
  100.        {(char) 0xFF, (char) 0xFF}
  101.      }},
  102.   {SQUARE_BOX,
  103.      {
  104.        {(char) 0xA2, (char) 0xA2},
  105.        {(char) 0xA1, (char) 0xBC},
  106.        {(char) 0xA1, (char) 0xF5},
  107.        {(char) 0xFF, (char) 0xFF}
  108.      }}};
  109.   
  110. char * env_vars_to_check[NO_CODES] = 
  111. {
  112.   JIS_EUC_CHAR,
  113.   BIG5_CHAR,
  114.   GB2312_CHAR,
  115.   IBM555_CHAR
  116.   };
  117. char * default_missing_char_names[NO_CODES] =
  118.   {
  119.     FAT_EQUAL,
  120.     FAT_EQUAL,
  121.     FAT_EQUAL,
  122.     FAT_EQUAL
  123.   };
  124. char default_missing_char_codes[NO_CODES][2];
  125. static int translation_table[NO_CHAR_IN_TABLE][2];
  126. static char * progname;
  127. /* file names of the translation files */
  128. static char * translation_files[10] = 
  129. {
  130.   "sinocogb.cod",
  131.   "sinocogb.cod",
  132.   "sinocogj.cod",
  133.   "sinocobg.cod",
  134.   "",
  135.   "sinocobj.cod",
  136.   "sinocojg.cod",
  137.   "sinocojb.cod",
  138.   "",
  139.   "sinocobg.cod"
  140.   };
  141. void print_help()
  142. {
  143.   fprintf( stdout, "There is no help so far!n");
  144. }
  145. void setup_missing_chars_to_use(void)
  146. {
  147.   char * env_ptr;
  148.   int i, j;
  149. /* first check the default env var */
  150.   if( (env_ptr = getenv( SINOCODE_DEFAULT_MISSING_CHAR )) != NULL)
  151.     for( i = 0; i < NO_CODES; i++)
  152.       default_missing_char_names[i] = env_ptr;
  153.   
  154. /* Then check the others */
  155.   for( i = 0; i < NO_CODES; i++)
  156.     if( (env_ptr = getenv(env_vars_to_check[i])) != NULL )
  157.       default_missing_char_names[i] = env_ptr;
  158.   
  159. /* Then set the codes up from the */
  160. /* names they have been given */
  161.   for( i = 0; i < NO_CODES; i++)
  162.     {
  163. /* possibly loop through all the */
  164. /* indexes */
  165.       for( j = 0; j < NO_NAMED_CHARACTERS; j++)
  166. if( ! strcmp(default_missing_char_names[i],
  167.      codes_for_named_characters[j].char_name))
  168.   break;
  169. /* now we have either found a coding */
  170. /* or we have to use the two byte */
  171. /* string supplied by the user */
  172.       if( j != NO_NAMED_CHARACTERS )
  173. {
  174.   default_missing_char_codes[i][0] =
  175.     codes_for_named_characters[j].character_codes[i].first;
  176.   default_missing_char_codes[i][1] =
  177.     codes_for_named_characters[j].character_codes[i].second;
  178. }
  179.       else
  180. /* use what the user has supplied */
  181. if( 2 == strlen( default_missing_char_names[i] ))
  182.   {
  183.     default_missing_char_codes[i][0] =
  184.       default_missing_char_names[i][0];
  185.     default_missing_char_codes[i][1] =
  186.       default_missing_char_names[i][1];
  187.   }
  188. else
  189.   {
  190.     fprintf( stderr,
  191.     "%s: Your environment variables "%s" or "%s" arennot correct.n",
  192.     progname,
  193.     SINOCODE_DEFAULT_MISSING_CHAR,
  194.     env_vars_to_check[i]);
  195.     fprintf(stderr, "Either they should contain one of the following strings:n");
  196.     for( i = 0; i < NO_NAMED_CHARACTERS; i++)
  197.       fprintf( stderr, ""%s"n",
  198.       codes_for_named_characters[i].char_name );
  199.     fprintf( stderr, "Or be a two byte code for a charactersn");
  200.     exit(1);
  201.   }
  202.     }
  203. } /* setup_missing_chars_to_use */
  204.   
  205. void read_translation_table( char *filename )
  206. {
  207.   char *realpath;
  208.   FILE *tranfp;
  209.   int i, junk;
  210.   
  211. /* allocate memory for the real */
  212. /* filename */
  213.   if( ! (realpath = (char *) malloc(strlen(TRANSLATIONSFILESDIR) +
  214.     strlen(filename) +
  215.     1)))
  216.     {
  217.       fprintf( stderr, "%s: Couldn't get enough memory.n",
  218.       progname );
  219.       exit( 1 );
  220.     }
  221.   
  222.   strcpy( realpath, TRANSLATIONSFILESDIR);
  223.   strcat( realpath, filename );
  224.   if( !(tranfp = fopen( realpath, "r" )))
  225.     {
  226.       fprintf( stderr, "%s: Couldn't open translation file: "%s"n",
  227.       progname, realpath );
  228.       exit( 1 );
  229.     }
  230.   
  231.   for( i = 1; 1; i++ )
  232.     {
  233.       translation_table[i][FIRST] = getc( tranfp );
  234.       translation_table[i][SECOND] = getc( tranfp );
  235.       junk = getc( tranfp );
  236.       if( junk == EOF )
  237. break;
  238.     }
  239.   return;
  240. }
  241. void find_gb_big_code(int ch1, int ch2, int * outch1, int * outch2)
  242. {
  243.   int index;
  244.   
  245.   index = ((ch1 - 161) * 94)+ ch2 - 160;
  246.   *outch1 = translation_table[index][FIRST];
  247.   *outch2 = translation_table[index][SECOND];
  248.   return;
  249. }
  250. void find_big_gb_code( int ch1, int ch2, int * outch1, int * outch2 )
  251. {
  252.   int index;
  253.   index = ((ch1-161)*157)+ch2-63-((ch2 < 161)?0:34);
  254.   *outch1 = translation_table[index][FIRST];
  255.   *outch2 = translation_table[index][SECOND];
  256.   return;
  257. } /* find_big_gb_code */
  258. void find_big( int char1, int char2,
  259.       int * outchar1, int * outchar2 )
  260. {
  261.   int rno, tmp1, tmp2;
  262.   rno = (char1-137)*188 + char2 - 63 - (char2>126)?1:0;
  263.   rno -= (rno>408)?93:0;
  264.   tmp1 = rno%157+161;
  265.   tmp2 = (rno - ((rno % 157) * 157))+63;
  266.   tmp2 += (tmp2>126)?34:0;
  267.   *outchar1 = tmp1;
  268.   *outchar2 = tmp2;
  269.   return;  
  270. } /* find_big */
  271. void find_ibm( int char1, int char2,
  272.       int * outchar1, int * outchar2 )
  273. {
  274.   int rno, tmp1, tmp2;
  275.   
  276.   rno = (char1 - 161) * 157 + char2 - 63-(char2>126)?34:0;
  277.   rno += (rno>408)?93:0;
  278.   tmp1 = (rno % 188) + 137;
  279.   tmp2 = (rno - ((rno % 188) * 188))+63;
  280.   if( tmp2 > 126 )
  281.     tmp2++;
  282.   *outchar1 = tmp1;
  283.   *outchar1 = tmp2;
  284.   return;
  285. } /* find_ibm */
  286. /* 1 */
  287. void gb_2312_to_big_5( FILE *infilefp, FILE *outfilefp )
  288. {
  289.   int char1, char2;
  290.   int outchar1, outchar2;
  291.   
  292.   read_translation_table( translation_files[GB_2312_TO_BIG_5]);
  293.   
  294.   while ( (char1 = getc( infilefp )) != EOF )
  295.     {
  296.       if ( char1 >= 160 && char1 <= 255 )
  297. {
  298.   char2 = getc( infilefp );
  299.   find_gb_big_code( char1, char2, & outchar1, & outchar2 );
  300.   if ( outchar1 == (char) ' ' )
  301.     {
  302.       putc( default_missing_char_codes[BIG5_CODE][FIRST], outfilefp);
  303.       putc( default_missing_char_codes[BIG5_CODE][SECOND], outfilefp);
  304.     }
  305.   else
  306.     {
  307.       putc( (char) outchar1, outfilefp);
  308.       putc( (char) outchar2, outfilefp);
  309.     }
  310. }
  311.       else
  312. putc( (char) char1, outfilefp );
  313.     }
  314.   
  315.   return;
  316. }
  317. /* 2 */
  318. void gb_2312_to_ibm_555( FILE *infilefp, FILE *outfilefp )
  319.   int char1, char2;
  320.   int outchar1, outchar2;
  321.   
  322.   read_translation_table( translation_files[GB_2312_TO_IBM_555]);
  323.   
  324.   while ( (char1 = getc( infilefp )) != EOF )
  325.     {
  326.       if ( char1 >= 160 && char1 <= 255 )
  327. {
  328.   char2 = getc( infilefp );
  329.   find_gb_big_code( char1, char2, & outchar1, & outchar2 );
  330. /* convert to IBM */
  331.   if ( outchar1 < 161 )
  332.     outchar1 = (int) ' ';
  333.   else
  334.     find_ibm( outchar1, outchar2, &outchar1, &outchar2 );
  335.   if ( outchar1 == (int) ' ' )
  336.     {
  337.       putc( default_missing_char_codes[IBM555_CODE][FIRST], outfilefp);
  338.       putc( default_missing_char_codes[IBM555_CODE][SECOND], outfilefp);
  339.     }
  340.   else
  341.     {
  342.       putc( (char) outchar1, outfilefp);
  343.       putc( (char) outchar2, outfilefp);
  344.     }
  345. }
  346.       else
  347. putc( (char) char1, outfilefp );
  348.     }
  349.   return;
  350. }
  351. /* 3 */
  352. void gb_2312_to_jis_euc( FILE *infilefp, FILE *outfilefp )
  353. {
  354.   int char1, char2;
  355.   int outchar1, outchar2;
  356.   read_translation_table( translation_files[GB_2312_TO_JIS_EUC]);
  357.   while ( (char1 = getc( infilefp )) != EOF )
  358.     {
  359.       if ( char1 >= 160 && char1 <= 255 )
  360. {
  361.   char2 = getc( infilefp );
  362.   find_gb_big_code( char1, char2, & outchar1, & outchar2 );
  363.   if ( outchar1 == (char) ' ' )
  364.     {
  365.       putc( default_missing_char_codes[JIS_EUC_CODE][FIRST], outfilefp);
  366.       putc( default_missing_char_codes[JIS_EUC_CODE][SECOND], outfilefp);
  367.     }
  368.   else
  369.     {
  370.       putc( (char) outchar1, outfilefp);
  371.       putc( (char) outchar2, outfilefp);
  372.     }
  373. }
  374.       else
  375. putc( (char) char1, outfilefp );
  376.     }
  377.   return;
  378. }
  379. /* 4 */
  380. void big_5_to_gb_2312( FILE *infilefp, FILE *outfilefp )
  381. {
  382.   int char1, char2;
  383.   int outchar1, outchar2;
  384.   read_translation_table( translation_files[BIG_5_TO_GB_2312]);
  385.   while ( (char1 = getc( infilefp )) != EOF )
  386.     {
  387.       if ( char1 >= 160 && char1 <= 255 )
  388. {
  389.   char2 = getc( infilefp );
  390.   find_big_gb_code( char1, char2, & outchar1, &outchar2 );
  391.   if ( outchar1 == (char) ' ' )
  392.     {
  393.       putc( default_missing_char_codes[GB2312_CODE][FIRST], outfilefp);
  394.       putc( default_missing_char_codes[GB2312_CODE][SECOND], outfilefp);
  395.     }
  396.   else
  397.     {
  398.       putc( (char) outchar1, outfilefp);
  399.       putc( (char) outchar2, outfilefp);
  400.     }
  401. }
  402.       else
  403. putc( (char) char1, outfilefp );
  404.     }
  405.   
  406.   return;
  407. }
  408. /* 5 */
  409. void big_5_to_ibm_555( FILE *infilefp, FILE *outfilefp )
  410. {
  411.   int char1, char2;
  412.   int outchar1, outchar2;
  413.   read_translation_table( translation_files[BIG_5_TO_IBM_555]);
  414.   while ( (char1 = getc( infilefp )) != EOF )
  415.     {
  416.       if ( char1 >= 160 && char1 <= 255 )
  417. {
  418.   char2 = getc( infilefp );
  419.   find_ibm( char1, char2, & outchar1, & outchar2 );
  420.   if ( outchar1 == (char) ' ' )
  421.     {
  422.       putc( default_missing_char_codes[IBM555_CODE][FIRST], outfilefp);
  423.       putc( default_missing_char_codes[IBM555_CODE][SECOND], outfilefp);
  424.     }
  425.   else
  426.     {
  427.       putc( (char) outchar1, outfilefp);
  428.       putc( (char) outchar2, outfilefp);
  429.     }
  430. }
  431.       else
  432. putc( (char) char1, outfilefp );
  433.     }
  434.   return;
  435. }
  436. /* 6 */
  437. void big_5_to_jis_euc( FILE *infilefp, FILE *outfilefp )
  438. {
  439.   int char1, char2;
  440.   int outchar1, outchar2;
  441.   read_translation_table( translation_files[BIG_5_TO_JIS_EUC]);
  442.   while ( (char1 = getc( infilefp )) != EOF )
  443.     {
  444.       if ( char1 >= 160 && char1 <= 255 )
  445. {
  446.   char2 = getc( infilefp );
  447.   find_big_gb_code( char1, char2, & outchar1, & outchar2 );
  448.   if ( outchar1 == (int) ' ' )
  449.     {
  450.       putc( default_missing_char_codes[JIS_EUC_CODE][FIRST], outfilefp);
  451.       putc( default_missing_char_codes[JIS_EUC_CODE][SECOND], outfilefp);
  452.     }
  453.   else
  454.     {
  455.       putc( (char) outchar1, outfilefp);
  456.       putc( (char) outchar2, outfilefp);
  457.     }
  458. }
  459.       else
  460. putc( (char) char1, outfilefp );
  461.     }
  462.   return;
  463. }
  464. /* 7 */
  465. void jis_euc_to_gb_2312( FILE *infilefp, FILE *outfilefp )
  466. {
  467.   int char1, char2;
  468.   int outchar1, outchar2;
  469.   read_translation_table( translation_files[JIS_EUC_TO_GB_2312]);
  470.   while ( (char1 = getc( infilefp )) != EOF )
  471.     {
  472.       if ( char1 >= 160 && char1 <= 255 )
  473. {
  474.   char2 = getc( infilefp );
  475.   find_gb_big_code( char1, char2, & outchar1, & outchar2 );
  476.   if ( outchar1 == (char) ' ' )
  477.     {
  478.       putc( default_missing_char_codes[GB2312_CODE][FIRST], outfilefp);
  479.       putc( default_missing_char_codes[GB2312_CODE][SECOND], outfilefp);
  480.     }
  481.   else
  482.     {
  483.       putc( (char) outchar1, outfilefp);
  484.       putc( (char) outchar2, outfilefp);
  485.     }
  486. }
  487.       else
  488. putc( (char) char1, outfilefp );
  489.     }
  490.   return;
  491. }
  492. /* 8 */
  493. void jis_euc_to_big_5( FILE *infilefp, FILE *outfilefp )
  494. {
  495.   int char1, char2;
  496.   int outchar1, outchar2;
  497.   read_translation_table( translation_files[JIS_EUC_TO_BIG_5]);
  498.   while ( (char1 = getc( infilefp )) != EOF )
  499.     {
  500.       if ( char1 >= 160 && char1 <= 255 )
  501. {
  502.   char2 = getc( infilefp );
  503.   find_gb_big_code( char1, char2, & outchar1, & outchar2 );
  504.   if ( outchar1 == (char) ' ' )
  505.     {
  506.       putc( default_missing_char_codes[BIG5_CODE][FIRST], outfilefp);
  507.       putc( default_missing_char_codes[BIG5_CODE][SECOND], outfilefp);
  508.     }
  509.   else
  510.     {
  511.       putc( (char) outchar1, outfilefp);
  512.       putc( (char) outchar2, outfilefp);
  513.     }
  514. }
  515.       else
  516. putc( (char) char1, outfilefp );
  517.     }
  518.   return;
  519. }
  520. /* 9 */
  521. void ibm_555_to_big_5( FILE *infilefp, FILE *outfilefp )
  522. {
  523.   int char1, char2;
  524.   int outchar1, outchar2;
  525.   return;
  526. #ifdef IBM
  527.   read_translation_table( translation_files[ibm_555_to_big_5]);
  528.     while ( (char1 = getc( infilefp )) != EOF )
  529.     {
  530.       if ( char1 >= 134 && char <= 255 )
  531. {
  532.   char2 = getc( infilefp );
  533.   find_gb_big_code( char1, char2, & outchar1, & outchar2 );
  534.   if ( outchar1 == (char) ' ' )
  535.     {
  536.       putc( default_missing_char_codes[BIG5_CODE][FIRST], outfilefp);
  537.       putc( default_missing_char_codes[BIG5_CODE][SECOND], outfilefp);
  538.     }
  539.   else
  540.     {
  541.       putc( (char) * outchar1, outfilefp);
  542.       putc( (char) * outchar2, outfilefp);
  543.     }
  544. }
  545.       else
  546. putc( (char) char1, outfilefp );
  547.     }
  548.   return;
  549. #endif
  550. }
  551. /* 10 */
  552. void ibm_555_to_gb_2312( FILE *infilefp, FILE *outfilefp )
  553. {
  554.   int char1, char2;
  555.   int outchar1, outchar2;
  556.   read_translation_table( translation_files[IBM_555_TO_GB_2312]);
  557.   find_big( char1, char2, & outchar1, & outchar2 );
  558.   find_big_gb_code( outchar1, outchar2, &outchar1, &outchar2 );
  559.   if ( outchar1 == (char) ' ' )
  560.     {
  561.       putc( default_missing_char_codes[GB2312_CODE][FIRST], outfilefp);
  562.       putc( default_missing_char_codes[GB2312_CODE][SECOND], outfilefp);
  563.     }
  564.   else
  565.     {
  566.       putc( (char) outchar1, outfilefp);
  567.       putc( (char) outchar2, outfilefp);
  568.     }
  569.   return;
  570. }
  571. void main(argc, argv)
  572.   int argc;
  573.   char **argv;
  574. {
  575.   FILE *infilefp, *outfilefp;
  576.   
  577.   progname = argv[0];
  578. /* make sure we use the correct */
  579. /* missing chars */
  580.   setup_missing_chars_to_use();
  581.   
  582. /* this should aways be called with */
  583. /* either one of four arguments. */
  584.   if( argc == 2)
  585.     {
  586.       if( !strcmp(argv[HELPORVERSION], "-version"))
  587. {
  588.   fprintf( stdout, "%s: %sn", argv[PROGNAME], VERSIONSTRING );
  589.   exit( 0 );
  590. }
  591.       else
  592. if( ! strcmp(argv[HELPORVERSION], "-help"))
  593.   {
  594.     print_help();
  595.     exit( 0 );
  596.   }
  597.     }
  598.   else
  599.     if( argc == 5 )
  600.       {
  601. /* first check the two files. */
  602. if( ! strcmp( argv[INFILENAME], "-"))
  603.   infilefp = stdin;
  604. else
  605.   if( ! (infilefp = fopen( argv[INFILENAME], "r")))
  606.     {
  607.       fprintf(stderr, "%s: Couldn't open input file: "%s"n",
  608.       argv[PROGNAME], argv[INFILENAME]);
  609.       exit( 1 );
  610.     }
  611. if( ! strcmp( argv[OUTFILENAME], "-"))
  612.   outfilefp = stdout;
  613. else
  614. /* perhaps we should stat here to make */
  615. /* sure that we do not overwrite */
  616. /* something. perham: future */
  617.   if( ! (outfilefp = fopen( argv[OUTFILENAME], "w")))
  618.     {
  619.       fprintf(stderr, "%s: Couldn't open output file: "%s"n",
  620.       argv[PROGNAME], argv[INFILENAME]);
  621.       exit( 1 );
  622.     }
  623. /* then parse the switches and */
  624. /* directly jump to the conversion */
  625. /* GB-2312   -->  BIG-5  */
  626. if((0 == strcmp( argv[INFILECONV], "-gb")) &&
  627.    (0 == strcmp( argv[OUTFILECONV], "-big")))
  628.   {
  629.     gb_2312_to_big_5( infilefp, outfilefp );
  630.     goto out;
  631.   }
  632. /* GB-2312   -->  IBM-555  */
  633. if((0 == strcmp( argv[INFILECONV], "-gb")) &&
  634.    (0 == strcmp( argv[OUTFILECONV], "-ibm")))
  635.   {
  636.     ( infilefp, outfilefp );
  637.     goto out;
  638.   }
  639. /* GB-2312   -->  JIS (EUC)  */
  640. if((0 == strcmp( argv[INFILECONV], "-gb")) &&
  641.    (0 == strcmp( argv[OUTFILECONV], "-jis")))
  642.   {
  643.     gb_2312_to_jis_euc( infilefp, outfilefp );
  644.     goto out;
  645.   }
  646. /* BIG-5     -->  GB-2312  */
  647. if((0 == strcmp( argv[INFILECONV], "-big")) &&
  648.    (0 == strcmp( argv[OUTFILECONV], "-gb")))
  649.   {
  650.     big_5_to_gb_2312( infilefp, outfilefp );
  651.     goto out;
  652.   }
  653. /* BIG-5     -->  IBM-555  */
  654. if((0 == strcmp( argv[INFILECONV], "-big")) &&
  655.    (0 == strcmp( argv[OUTFILECONV], "-ibm")))
  656.   {
  657.     big_5_to_ibm_555( infilefp, outfilefp );
  658.     goto out;
  659.   }
  660. /* BIG-5     -->  JIS (EUC)  */
  661. if((0 == strcmp( argv[INFILECONV], "-big")) &&
  662.    (0 == strcmp( argv[OUTFILECONV], "-jis")))
  663.   {
  664.     big_5_to_jis_euc( infilefp, outfilefp );
  665.     goto out;
  666.   }
  667. /* JIS (EUC) -->  GB-2312  */
  668. if((0 == strcmp( argv[INFILECONV], "-jis")) &&
  669.    (0 == strcmp( argv[OUTFILECONV], "-gb")))
  670.   {
  671.     jis_euc_to_gb_2312( infilefp, outfilefp );
  672.     goto out;
  673.   }
  674. /* JIS (EUC) -->  BIG-5  */
  675. if((0 == strcmp( argv[INFILECONV], "-jis")) &&
  676.    (0 == strcmp( argv[OUTFILECONV], "-big")))
  677.   {
  678.     jis_euc_to_big_5( infilefp, outfilefp );
  679.     goto out;
  680.   }
  681. /* IBM-555   -->  BIG-5  */
  682. if((0 == strcmp( argv[INFILECONV], "-ibm")) &&
  683.    (0 == strcmp( argv[OUTFILECONV], "-big")))
  684.   {
  685.     ibm_555_to_big_5( infilefp, outfilefp );
  686.     goto out;
  687.   }
  688. /* IBM-555   -->  GB-2312  */
  689. if((0 == strcmp( argv[INFILECONV], "-ibm")) &&
  690.    (0 == strcmp( argv[OUTFILECONV], "-gb")))
  691.   {
  692.     ibm_555_to_gb_2312( infilefp, outfilefp );
  693.     goto out;
  694.   }
  695. /* If we arrive here, then we have not */
  696. /* found a coding scheme */
  697. fprintf(stderr, "%s: Unknown coding scheme(s)n",
  698. argv[PROGNAME]);
  699. /* we do use goto! :-) */
  700.       out:;
  701.       } /* four arguments */
  702.     else
  703.       {
  704. fprintf( stderr, "%s: %sn", argv[0], "Wrong number of arguments");
  705. exit( 1 );
  706.       }
  707. /* Just a plain exit. */
  708.   exit( 0 );
  709. } /* main */