Back to index

glibc  2.9
Functions
tst-table-to.c File Reference
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iconv.h>
#include <errno.h>

Go to the source code of this file.

Functions

int main (int argc, char *argv[])

Function Documentation

int main ( int  argc,
char *  argv[] 
)

Definition at line 32 of file tst-table-to.c.

{
  const char *charset;
  iconv_t cd;
  int bmp_only;

  if (argc != 2)
    {
      fprintf (stderr, "Usage: tst-table-to charset\n");
      return 1;
    }
  charset = argv[1];

  cd = iconv_open (charset, "UTF-8");
  if (cd == (iconv_t)(-1))
    {
      perror ("iconv_open");
      return 1;
    }

  /* When testing UTF-8 or GB18030, stop at 0x10000, otherwise the output
     file gets too big.  */
  bmp_only = (strcmp (charset, "UTF-8") == 0
             || strcmp (charset, "GB18030") == 0);

  {
    unsigned int i;
    unsigned char buf[10];

    for (i = 0; i < (bmp_only ? 0x10000 : 0x30000); i++)
      {
       unsigned char in[6];
       unsigned int incount =
         (i < 0x80 ? (in[0] = i, 1)
          : i < 0x800 ? (in[0] = 0xc0 | (i >> 6),
                       in[1] = 0x80 | (i & 0x3f), 2)
          : i < 0x10000 ? (in[0] = 0xe0 | (i >> 12),
                         in[1] = 0x80 | ((i >> 6) & 0x3f),
                         in[2] = 0x80 | (i & 0x3f), 3)
          : /* i < 0x200000 */ (in[0] = 0xf0 | (i >> 18),
                             in[1] = 0x80 | ((i >> 12) & 0x3f),
                             in[2] = 0x80 | ((i >> 6) & 0x3f),
                             in[3] = 0x80 | (i & 0x3f), 4));
       const char *inbuf = (const char *) in;
       size_t inbytesleft = incount;
       char *outbuf = (char *) buf;
       size_t outbytesleft = sizeof (buf);
       size_t result;
       size_t result2 = 0;

       iconv (cd, NULL, NULL, NULL, NULL);
       result = iconv (cd,
                     (char **) &inbuf, &inbytesleft,
                     &outbuf, &outbytesleft);
       if (result != (size_t)(-1))
         result2 = iconv (cd, NULL, NULL, &outbuf, &outbytesleft);

       if (result == (size_t)(-1) || result2 == (size_t)(-1))
         {
           if (errno != EILSEQ)
             {
              int saved_errno = errno;
              fprintf (stderr, "0x%02X: iconv error: ", i);
              errno = saved_errno;
              perror ("");
              return 1;
             }
         }
       else if (result == 0) /* ignore conversions with transliteration */
         {
           unsigned int j, jmax;
           if (inbytesleft != 0 || outbytesleft == sizeof (buf))
             {
              fprintf (stderr, "0x%02X: inbytes = %ld, outbytes = %ld\n", i,
                      (long) (incount - inbytesleft),
                      (long) (sizeof (buf) - outbytesleft));
              return 1;
             }
           jmax = sizeof (buf) - outbytesleft;
           printf ("0x");
           for (j = 0; j < jmax; j++)
             printf ("%02X", buf[j]);
           printf ("\t0x%04X\n", i);
         }
      }
  }

  if (iconv_close (cd) < 0)
    {
      perror ("iconv_close");
      return 1;
    }

  if (ferror (stdin) || fflush (stdout) || ferror (stdout))
    {
      fprintf (stderr, "I/O error\n");
      return 1;
    }

  return 0;
}

Here is the call graph for this function: