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

MySQL数据库

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef unsigned char uchar;
  5. typedef unsigned short uint16;
  6. struct uca_item_st
  7. {
  8.   uchar  num;
  9.   uint16 weight[4][9];
  10. };
  11. #if 0
  12. #define MY_UCA_NPAGES 1024
  13. #define MY_UCA_NCHARS 64
  14. #define MY_UCA_CMASK 63
  15. #define MY_UCA_PSHIFT 6
  16. #else
  17. #define MY_UCA_NPAGES 256
  18. #define MY_UCA_NCHARS 256
  19. #define MY_UCA_CMASK 255
  20. #define MY_UCA_PSHIFT 8
  21. #endif
  22. static char *pname[]= {"", "2", "3"};
  23. int main(int ac, char **av)
  24. {
  25.   char str[256];
  26.   char *weights[64];
  27.   struct uca_item_st uca[64*1024];
  28.   size_t code, w;
  29.   int pageloaded[MY_UCA_NPAGES];
  30.   
  31.   bzero(uca, sizeof(uca));
  32.   bzero(pageloaded, sizeof(pageloaded));
  33.   
  34.   while (fgets(str,sizeof(str),stdin))
  35.   {
  36.     char *comment;
  37.     char *weight;
  38.     char *s;
  39.     size_t codenum;
  40.     
  41.     code= strtol(str,NULL,16);
  42.     
  43.     if (str[0]=='#' || (code > 0xFFFF))
  44.       continue;
  45.     if ((comment=strchr(str,'#')))
  46.     {
  47.       *comment++= '';
  48.       for ( ; *comment==' ' ; comment++);
  49.     }else
  50.       continue;
  51.     
  52.     if ((weight=strchr(str,';')))
  53.     {
  54.       *weight++= '';
  55.       for ( ; *weight==' ' ; weight++);
  56.     }
  57.     else
  58.       continue;
  59.     
  60.     codenum= 0;
  61.     s= strtok(str, " t");
  62.     while (s)
  63.     {
  64.       s= strtok(NULL, " t");
  65.       codenum++;
  66.     }
  67.     
  68.     if (codenum>1)
  69.     {
  70.       /* Multi-character weight, 
  71.          i.e. contraction. 
  72.          Not supported yet.
  73.       */
  74.       continue;
  75.     }
  76.     
  77.     uca[code].num= 0;
  78.     s= strtok(weight, " []");
  79.     while (s)
  80.     {
  81.       weights[uca[code].num]= s;
  82.       s= strtok(NULL, " []");
  83.       uca[code].num++;
  84.     }
  85.     
  86.     for (w=0; w < uca[code].num; w++)
  87.     {
  88.       size_t partnum;
  89.       
  90.       partnum= 0;
  91.       s= weights[w];
  92.       while (*s)
  93.       {
  94.         char *endptr;
  95.         size_t part;
  96.         part= strtol(s+1,&endptr,16);
  97.         uca[code].weight[partnum][w]= part;
  98.         s= endptr;
  99.         partnum++;
  100.       }
  101.     }
  102.     /* Mark that a character from this page was loaded */
  103.     pageloaded[code >> MY_UCA_PSHIFT]++;
  104.   }
  105.   
  106.   
  107.   
  108.   /* Now set implicit weights */
  109.   for (code=0; code <= 0xFFFF; code++)
  110.   {
  111.     size_t base, aaaa, bbbb;
  112.     
  113.     if (uca[code].num)
  114.       continue;
  115.     
  116.     /*
  117.     3400;<CJK Ideograph Extension A, First>
  118.     4DB5;<CJK Ideograph Extension A, Last>
  119.     4E00;<CJK Ideograph, First>
  120.     9FA5;<CJK Ideograph, Last>
  121.     */
  122.     
  123.     if (code >= 0x3400 && code <= 0x4DB5)
  124.       base= 0xFB80;
  125.     else if (code >= 0x4E00 && code <= 0x9FA5)
  126.       base= 0xFB40;
  127.     else
  128.       base= 0xFBC0;
  129.     
  130.     aaaa= base +  (code >> 15);
  131.     bbbb= (code & 0x7FFF) | 0x8000;
  132.     uca[code].weight[0][0]= aaaa;
  133.     uca[code].weight[0][1]= bbbb;
  134.     
  135.     uca[code].weight[1][0]= 0x0020;
  136.     uca[code].weight[1][1]= 0x0000;
  137.     
  138.     uca[code].weight[2][0]= 0x0002;
  139.     uca[code].weight[2][1]= 0x0000;
  140.     
  141.     uca[code].weight[3][0]= 0x0001;
  142.     uca[code].weight[3][2]= 0x0000;
  143.     
  144.     uca[code].num= 2;
  145.   }
  146.   
  147.   printf("#include "my_uca.h"n");
  148.   
  149.   printf("#define MY_UCA_NPAGES %dn",MY_UCA_NPAGES);
  150.   printf("#define MY_UCA_NCHARS %dn",MY_UCA_NCHARS);
  151.   printf("#define MY_UCA_CMASK  %dn",MY_UCA_CMASK);
  152.   printf("#define MY_UCA_PSHIFT %dn",MY_UCA_PSHIFT);
  153.   
  154.   for (w=0; w<3; w++)
  155.   {
  156.     size_t page;
  157.     int pagemaxlen[MY_UCA_NPAGES];
  158.     for (page=0; page < MY_UCA_NPAGES; page++)
  159.     {
  160.       size_t offs;
  161.       size_t maxnum= 0;
  162.       size_t nchars= 0;
  163.       size_t mchars;
  164.       size_t ndefs= 0;
  165.       
  166.       pagemaxlen[page]= 0;
  167.       
  168.       /*
  169.         Skip this page if no weights were loaded
  170.       */
  171.       
  172.       if (!pageloaded[page])
  173.         continue;
  174.       
  175.       /* 
  176.         Calculate maximum weight
  177.         length for this page
  178.       */
  179.       
  180.       for (offs=0; offs < MY_UCA_NCHARS; offs++)
  181.       {
  182.         size_t i, num;
  183.         
  184.         code= page*MY_UCA_NCHARS+offs;
  185.         
  186.         /* Calculate only non-zero weights */
  187.         for (num=0, i=0; i < uca[code].num; i++)
  188.           if (uca[code].weight[w][i])
  189.             num++;
  190.         
  191.         maxnum= maxnum < num ? num : maxnum;
  192.         
  193.         /* Check if default weight */
  194.         if (w == 1 && num == 1)
  195.         {
  196.           /* 0020 0000 ... */
  197.           if (uca[code].weight[w][0] == 0x0020)
  198.             ndefs++;
  199.         }
  200.         else if (w == 2 && num == 1)
  201.         {
  202.           /* 0002 0000 ... */
  203.           if (uca[code].weight[w][0] == 0x0002)
  204.             ndefs++;
  205.         }
  206.       } 
  207.       maxnum++;
  208.       
  209.       /*
  210.         If the page have only default weights
  211.         then no needs to dump it, skip.
  212.       */
  213.       if (ndefs == MY_UCA_NCHARS)
  214.       {
  215.         continue;
  216.       }
  217.       switch (maxnum)
  218.       {
  219.         case 0: mchars= 8; break;
  220.         case 1: mchars= 8; break;
  221.         case 2: mchars= 8; break;
  222.         case 3: mchars= 9; break;
  223.         case 4: mchars= 8; break;
  224.         default: mchars= uca[code].num;
  225.       }
  226.       
  227.       pagemaxlen[page]= maxnum;
  228.       /*
  229.         Now print this page
  230.       */
  231.       
  232.       
  233.       printf("uint16 page%03Xdata%s[]= { /* %04X (%d weights per char) */n",
  234.               page, pname[w], page*MY_UCA_NCHARS, maxnum);
  235.       
  236.       for (offs=0; offs < MY_UCA_NCHARS; offs++)
  237.       {
  238.         uint16 weight[8];
  239.         size_t num, i;
  240.         
  241.         code= page*MY_UCA_NCHARS+offs;
  242.         
  243.         bzero(weight,sizeof(weight));
  244.         
  245.         /* Copy non-zero weights */
  246.         for (num=0, i=0; i < uca[code].num; i++)
  247.         {
  248.           if (uca[code].weight[w][i])
  249.           {
  250.             weight[num]= uca[code].weight[w][i];
  251.             num++;
  252.           }
  253.         }
  254.         
  255.         for (i=0; i < maxnum; i++)
  256.         {
  257.           /* 
  258.             Invert weights for secondary level to
  259.             sort upper case letters before their
  260.             lower case counter part.
  261.           */
  262.           int tmp= weight[i];
  263.           if (w == 2 && tmp)
  264.             tmp= (int)(0x20 - weight[i]);
  265.           
  266.           
  267.           printf("0x%04X", tmp);
  268.           if ((offs+1 != MY_UCA_NCHARS) || (i+1!=maxnum))
  269.             printf(",");
  270.           nchars++;
  271.         }
  272.         if (nchars >=mchars)
  273.         {
  274.           printf("n");
  275.           nchars=0;
  276.         }
  277.         else
  278.         {
  279.           printf(" ");
  280.         }
  281.       }
  282.       printf("};nn");
  283.     }
  284.     printf("uchar uca_length%s[%d]={n", pname[w], MY_UCA_NPAGES);
  285.     for (page=0; page < MY_UCA_NPAGES; page++)
  286.     {
  287.       printf("%d%s%s",pagemaxlen[page],page<MY_UCA_NPAGES-1?",":"",(page+1) % 16 ? "":"n");
  288.     }
  289.     printf("};n");
  290.     printf("uint16 *uca_weight%s[%d]={n", pname[w], MY_UCA_NPAGES);
  291.     for (page=0; page < MY_UCA_NPAGES; page++)
  292.     {
  293.       const char *comma= page < MY_UCA_NPAGES-1 ? "," : "";
  294.       const char *nline= (page+1) % 4 ? "" : "n";
  295.       if (!pagemaxlen[page])
  296.         printf("NULL       %s%s%s", w ? " ": "",  comma , nline);
  297.       else
  298.         printf("page%03Xdata%s%s%s", page, pname[w], comma, nline);
  299.     }
  300.     printf("};n");
  301.   }
  302.   
  303.   printf("int main(void){ return 0;};n");
  304.   return 0;
  305. }