utr11-dump.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. /*
  5.   Dump an EastAsianWidth.txt file.
  6.   See http://www.unicode.org/reports/tr11/ for details.
  7.   Character types:
  8.   F  - Full width  = 1
  9.   H  - Half width  = 0
  10.   W  - Wide        = 1
  11.   Na - Narrow      = 0
  12.   A  - Ambiguous   = 0
  13.   N  - Neutral     = 0
  14. */
  15. int main(int ac, char **av)
  16. {
  17.   char str[128];
  18.   int errors= 0;
  19.   int plane[0x10000];
  20.   int page[256];
  21.   int i; 
  22.   
  23.   memset(plane, 0, sizeof(plane));
  24.   memset(page, 0, sizeof(page));
  25.   
  26.   while (fgets(str, sizeof(str), stdin))
  27.   {
  28.     int code1, code2, width;
  29.     char *end;
  30.     
  31.     if (str[0] == '#')
  32.       continue;
  33.     code1= strtol(str, &end, 16);
  34.     if (code1 < 0 || code1 > 0xFFFF)
  35.       continue;
  36.     if (end[0] == ';') /* One character */
  37.     {
  38.       code2= code1;
  39.     }
  40.     else if (end[0] == '.' && end[1] == '.') /* Range */
  41.     {
  42.       end+= 2;
  43.       code2= strtol(end, &end, 16);
  44.       if (code2 < 0 || code2 > 0xFFFF)
  45.         continue;
  46.       if (end[0] != ';')
  47.       {
  48.         errors++;
  49.         fprintf(stderr, "error: %s", str);
  50.         continue;
  51.       }
  52.     }
  53.     else
  54.     { 
  55.       errors++;
  56.       fprintf(stderr, "error: %s", str);
  57.       continue;
  58.     }
  59.     
  60.     end++;
  61.     width= (end[0] == 'F' || end[0] == 'W') ? 1 : 0;
  62.     
  63.     for ( ; code1 <= code2; code1++)
  64.     {
  65.       plane[code1]= width;
  66.     }
  67.   }
  68.   
  69.   if (errors)
  70.     return 1;
  71.   
  72.   for (i=0; i < 256; i++)
  73.   {
  74.     int j;
  75.     int *p= plane + 256 * i;
  76.     page[i]= 0;
  77.     for (j=0; j < 256; j++)
  78.     {
  79.       page[i]+= p[j];
  80.     }
  81.     if (page[i] != 0 && page[i] != 256)
  82.     {
  83.       printf("static char pg%02X[256]=n{n", i);
  84.       for (j=0; j < 256; j++)
  85.       {
  86.         printf("%d%s%s", p[j], j < 255 ? "," : "", (j + 1) % 32 ? "" : "n");
  87.       }
  88.       printf("};nn");
  89.     }
  90.   }
  91.   
  92.   printf("static struct {int page; char *p;} utr11_data[256]=n{n");
  93.   for (i=0; i < 256; i++)
  94.   {
  95.     if (page[i] == 0 || page[i] == 256)
  96.     {
  97.       int width= (page[i] == 256) ? 1 : 0;
  98.       printf("{%d,NULL}", width);
  99.     }
  100.     else
  101.     {
  102.       printf("{0,pg%02X}", i);
  103.     }
  104.     printf("%s%s", i < 255 ? "," : "", (i+1) % 8 ? "" : "n");
  105.   }
  106.   printf("};n");
  107.   return 0;
  108. }