table-from.c

Upload User: yingmei828
Upload Date: 2007-01-01
Package Size: 1646k
Code Size: 4k
Development Platform: Unix_Linux
  1. /* Copyright (C) 2000 Free Software Foundation, Inc.
  2.    This file is part of the GNU ICONV Library.
  3.    The GNU ICONV Library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public License as
  5.    published by the Free Software Foundation; either version 2 of the
  6.    License, or (at your option) any later version.
  7.    The GNU ICONV Library is distributed in the hope that it will be useful,
  8.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  10.    Library General Public License for more details.
  11.    You should have received a copy of the GNU Library General Public
  12.    License along with the GNU ICONV Library; see the file COPYING.LIB.  If not,
  13.    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  14.    Boston, MA 02111-1307, USA.  */
  15. /* Create a table from CHARSET to Unicode. */
  16. #include <stddef.h>
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <iconv.h>
  20. #include <errno.h>
  21. static const char* hexbuf (unsigned char buf[], unsigned int buflen)
  22. {
  23.   static char msg[50];
  24.   switch (buflen) {
  25.     case 1: sprintf(msg,"0x%02X",buf[0]); break;
  26.     case 2: sprintf(msg,"0x%02X%02X",buf[0],buf[1]); break;
  27.     case 3: sprintf(msg,"0x%02X%02X%02X",buf[0],buf[1],buf[2]); break;
  28.     case 4: sprintf(msg,"0x%02X%02X%02X%02X",buf[0],buf[1],buf[2],buf[3]); break;
  29.     default: abort();
  30.   }
  31.   return msg;
  32. }
  33. static int try (iconv_t cd, unsigned char buf[], unsigned int buflen, unsigned short *out)
  34. {
  35.   const char* inbuf = (const char*) buf;
  36.   size_t inbytesleft = buflen;
  37.   char* outbuf = (char*) out;
  38.   size_t outbytesleft = sizeof(unsigned short);
  39.   size_t result = iconv(cd,&inbuf,&inbytesleft,&outbuf,&outbytesleft);
  40.   if (result == (size_t)(-1)) {
  41.     if (errno == EILSEQ) {
  42.       return -1;
  43.     } else if (errno == EINVAL) {
  44.       return 0;
  45.     } else {
  46.       int saved_errno = errno;
  47.       fprintf(stderr,"%s: iconv error: ",hexbuf(buf,buflen));
  48.       errno = saved_errno;
  49.       perror("");
  50.       exit(1);
  51.     }
  52.   } else if (result > 0) /* ignore conversions with transliteration */ {
  53.     return -1;
  54.   } else {
  55.     if (inbytesleft != 0 || outbytesleft != 0) {
  56.       fprintf(stderr,"%s: inbytes = %ld, outbytes = %ldn",hexbuf(buf,buflen),(long)(buflen-inbytesleft),(long)(sizeof(unsigned short)-outbytesleft));
  57.       exit(1);
  58.     }
  59.     return 1;
  60.   }
  61. }
  62. int main (int argc, char* argv[])
  63. {
  64.   const char* charset;
  65.   iconv_t cd;
  66.   if (argc != 2) {
  67.     fprintf(stderr,"Usage: table-to charsetn");
  68.     exit(1);
  69.   }
  70.   charset = argv[1];
  71.   cd = iconv_open("UCS-2-INTERNAL",charset);
  72.   if (cd == (iconv_t)(-1)) {
  73.     perror("iconv_open");
  74.     exit(1);
  75.   }
  76.   {
  77.     unsigned short out;
  78.     unsigned char buf[4];
  79.     unsigned int i0, i1, i2, i3;
  80.     int result;
  81.     for (i0 = 0; i0 < 0x100; i0++) {
  82.       buf[0] = i0;
  83.       result = try(cd,buf,1,&out);
  84.       if (result < 0) {
  85.       } else if (result > 0) {
  86.         printf("0x%02Xt0x%04Xn",i0,out);
  87.       } else {
  88.         for (i1 = 0; i1 < 0x100; i1++) {
  89.           buf[1] = i1;
  90.           result = try(cd,buf,2,&out);
  91.           if (result < 0) {
  92.           } else if (result > 0) {
  93.             printf("0x%02X%02Xt0x%04Xn",i0,i1,out);
  94.           } else {
  95.             for (i2 = 0; i2 < 0x100; i2++) {
  96.               buf[2] = i2;
  97.               result = try(cd,buf,3,&out);
  98.               if (result < 0) {
  99.               } else if (result > 0) {
  100.                 printf("0x%02X%02X%02Xt0x%04Xn",i0,i1,i2,out);
  101.               } else if (strcmp(charset,"UTF-8")) {
  102.                 for (i3 = 0; i3 < 0x100; i3++) {
  103.                   buf[3] = i3;
  104.                   result = try(cd,buf,4,&out);
  105.                   if (result < 0) {
  106.                   } else if (result > 0) {
  107.                     printf("0x%02X%02X%02X%02Xt0x%04Xn",i0,i1,i2,i3,out);
  108.                   } else {
  109.                     fprintf(stderr,"%s: incomplete byte sequencen",hexbuf(buf,4));
  110.                     exit(1);
  111.                   }
  112.                 }
  113.               }
  114.             }
  115.           }
  116.         }
  117.       }
  118.     }
  119.   }
  120.   if (iconv_close(cd) < 0) {
  121.     perror("iconv_close");
  122.     exit(1);
  123.   }
  124.   if (ferror(stdin) || ferror(stdout)) {
  125.     fprintf(stderr,"I/O errorn");
  126.     exit(1);
  127.   }
  128.   exit(0);
  129. }