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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <my_global.h>
  14. #include <m_string.h>
  15. #include <m_ctype.h>
  16. #include <fcntl.h>
  17. #include <my_xml.h>
  18. #define ROW_LEN 16
  19. #define ROW16_LEN 8
  20. #define MAX_BUF 16*1024
  21. static CHARSET_INFO all_charsets[256];
  22. void
  23. print_array(FILE *f, const char *set, const char *name, uchar *a, int n)
  24. {
  25.   int i;
  26.   fprintf(f,"uchar %s_%s[] = {n", name, set);
  27.   
  28.   for (i=0 ;i<n ; i++)
  29.   {
  30.     fprintf(f,"0x%02X",a[i]);
  31.     fprintf(f, (i+1<n) ? "," :"" );
  32.     fprintf(f, ((i+1) % ROW_LEN == n % ROW_LEN) ? "n" : "" );
  33.   }
  34.   fprintf(f,"};nn");
  35. }
  36. void
  37. print_array16(FILE *f, const char *set, const char *name, uint16 *a, int n)
  38. {
  39.   int i;
  40.   fprintf(f,"uint16 %s_%s[] = {n", name, set);
  41.   
  42.   for (i=0 ;i<n ; i++)
  43.   {
  44.     fprintf(f,"0x%04X",a[i]);
  45.     fprintf(f, (i+1<n) ? "," :"" );
  46.     fprintf(f, ((i+1) % ROW16_LEN == n % ROW16_LEN) ? "n" : "" );
  47.   }
  48.   fprintf(f,"};nn");
  49. }
  50. static int get_charset_number(const char *charset_name)
  51. {
  52.   CHARSET_INFO *cs;
  53.   for (cs= all_charsets; cs < all_charsets+255; ++cs)
  54.   {
  55.     if ( cs->name && !strcmp(cs->name, charset_name))
  56.       return cs->number;
  57.   }  
  58.   return 0;
  59. }
  60. char *mdup(const char *src, uint len)
  61. {
  62.   char *dst=(char*)malloc(len);
  63.   memcpy(dst,src,len);
  64.   return dst;
  65. }
  66. static void simple_cs_copy_data(CHARSET_INFO *to, CHARSET_INFO *from)
  67. {
  68.   to->number= from->number ? from->number : to->number;
  69.   to->state|= from->state;
  70.   if (from->csname)
  71.     to->csname= strdup(from->csname);
  72.   
  73.   if (from->name)
  74.     to->name= strdup(from->name);
  75.   
  76.   if (from->ctype)
  77.     to->ctype= (uchar*) mdup((char*) from->ctype, MY_CS_CTYPE_TABLE_SIZE);
  78.   if (from->to_lower)
  79.     to->to_lower= (uchar*) mdup((char*) from->to_lower, MY_CS_TO_LOWER_TABLE_SIZE);
  80.   if (from->to_upper)
  81.     to->to_upper= (uchar*) mdup((char*) from->to_upper, MY_CS_TO_UPPER_TABLE_SIZE);
  82.   if (from->sort_order)
  83.   {
  84.     to->sort_order= (uchar*) mdup((char*) from->sort_order, MY_CS_SORT_ORDER_TABLE_SIZE);
  85.     /*
  86.       set_max_sort_char(to);
  87.     */
  88.   }
  89.   if (from->tab_to_uni)
  90.   {
  91.     uint sz= MY_CS_TO_UNI_TABLE_SIZE*sizeof(uint16);
  92.     to->tab_to_uni= (uint16*)  mdup((char*)from->tab_to_uni, sz);
  93.     /*
  94.     create_fromuni(to);
  95.     */
  96.   }
  97. }
  98. static my_bool simple_cs_is_full(CHARSET_INFO *cs)
  99. {
  100.   return ((cs->csname && cs->tab_to_uni && cs->ctype && cs->to_upper &&
  101.    cs->to_lower) &&
  102.   (cs->number && cs->name && 
  103.   (cs->sort_order || (cs->state & MY_CS_BINSORT))));
  104. }
  105. static int add_collation(CHARSET_INFO *cs)
  106. {
  107.   if (cs->name && (cs->number || (cs->number=get_charset_number(cs->name))))
  108.   {
  109.     if (!(all_charsets[cs->number].state & MY_CS_COMPILED))
  110.     {
  111.       simple_cs_copy_data(&all_charsets[cs->number],cs);
  112.       
  113.     }
  114.     
  115.     cs->number= 0;
  116.     cs->name= NULL;
  117.     cs->state= 0;
  118.     cs->sort_order= NULL;
  119.     cs->state= 0;
  120.   }
  121.   return MY_XML_OK;
  122. }
  123. static int my_read_charset_file(const char *filename)
  124. {
  125.   char buf[MAX_BUF];
  126.   int  fd;
  127.   uint len;
  128.   
  129.   if ((fd=open(filename,O_RDONLY)) < 0)
  130.   {
  131.     fprintf(stderr,"Can't open '%s'n",filename);
  132.     return 1;
  133.   }
  134.   
  135.   len=read(fd,buf,MAX_BUF);
  136.   close(fd);
  137.   
  138.   if (my_parse_charset_xml(buf,len,add_collation))
  139.   {
  140. #if 0
  141.     printf("ERROR at line %d pos %d '%s'n",
  142.    my_xml_error_lineno(&p)+1,
  143.    my_xml_error_pos(&p),
  144.    my_xml_error_string(&p));
  145. #endif
  146.   }
  147.   
  148.   return FALSE;
  149. }
  150. static int
  151. is_case_sensitive(CHARSET_INFO *cs)
  152. {
  153.  return (cs->sort_order &&
  154.          cs->sort_order['A'] < cs->sort_order['a'] &&
  155.          cs->sort_order['a'] < cs->sort_order['B']) ? 1 : 0;
  156. }
  157. void dispcset(FILE *f,CHARSET_INFO *cs)
  158. {
  159.   fprintf(f,"{n");
  160.   fprintf(f,"  %d,%d,%d,n",cs->number,0,0);
  161.   fprintf(f,"  MY_CS_COMPILED%s%s%s,n",
  162.           cs->state & MY_CS_BINSORT ? "|MY_CS_BINSORT" : "",
  163.           cs->state & MY_CS_PRIMARY ? "|MY_CS_PRIMARY" : "",
  164.           is_case_sensitive(cs)     ? "|MY_CS_CSSORT"  : "");
  165.   
  166.   if (cs->name)
  167.   {
  168.     fprintf(f,"  "%s",                     /* cset name     */n",cs->csname);
  169.     fprintf(f,"  "%s",                     /* coll name     */n",cs->name);
  170.     fprintf(f,"  "",                       /* comment       */n");
  171.     fprintf(f,"  NULL,                       /* tailoring     */n");
  172.     fprintf(f,"  ctype_%s,                   /* ctype         */n",cs->name);
  173.     fprintf(f,"  to_lower_%s,                /* lower         */n",cs->name);
  174.     fprintf(f,"  to_upper_%s,                /* upper         */n",cs->name);
  175.     if (cs->sort_order)
  176.       fprintf(f,"  sort_order_%s,            /* sort_order    */n",cs->name);
  177.     else
  178.       fprintf(f,"  NULL,                     /* sort_order    */n");
  179.     fprintf(f,"  NULL,                       /* contractions  */n");
  180.     fprintf(f,"  NULL,                       /* sort_order_big*/n");
  181.     fprintf(f,"  to_uni_%s,                  /* to_uni        */n",cs->name);
  182.   }
  183.   else
  184.   {
  185.     fprintf(f,"  NULL,                       /* cset name     */n");
  186.     fprintf(f,"  NULL,                       /* coll name     */n");
  187.     fprintf(f,"  NULL,                       /* comment       */n");
  188.     fprintf(f,"  NULL,                       /* tailoging     */n");
  189.     fprintf(f,"  NULL,                       /* ctype         */n");
  190.     fprintf(f,"  NULL,                       /* lower         */n");
  191.     fprintf(f,"  NULL,                       /* upper         */n");
  192.     fprintf(f,"  NULL,                       /* sort order    */n");
  193.     fprintf(f,"  NULL,                       /* contractions  */n");
  194.     fprintf(f,"  NULL,                       /* sort_order_big*/n");
  195.     fprintf(f,"  NULL,                       /* to_uni        */n");
  196.   }
  197.   fprintf(f,"  NULL,                       /* from_uni      */n");
  198.   fprintf(f,"  NULL,                       /* state map     */n");
  199.   fprintf(f,"  NULL,                       /* ident map     */n");
  200.   fprintf(f,"  1,                          /* strxfrm_multiply*/n");
  201.   fprintf(f,"  1,                          /* mbminlen      */n");
  202.   fprintf(f,"  1,                          /* mbmaxlen      */n");
  203.   fprintf(f,"  0,                          /* min_sort_char */n");
  204.   fprintf(f,"  255,                        /* max_sort_char */n");
  205.   fprintf(f,"  0,                          /* escape_with_backslash_is_dangerous */n");
  206.             
  207.   fprintf(f,"  &my_charset_8bit_handler,n");
  208.   if (cs->state & MY_CS_BINSORT)
  209.     fprintf(f,"  &my_collation_8bit_bin_handler,n");
  210.   else
  211.     fprintf(f,"  &my_collation_8bit_simple_ci_handler,n");
  212.   fprintf(f,"}n");
  213. }
  214. int
  215. main(int argc, char **argv  __attribute__((unused)))
  216. {
  217.   CHARSET_INFO  ncs;
  218.   CHARSET_INFO  *cs;
  219.   char filename[256];
  220.   FILE *f= stdout;
  221.   
  222.   if (argc < 2)
  223.   {
  224.     fprintf(stderr, "usage: %s source-dirn", argv[0]);
  225.     exit(EXIT_FAILURE);
  226.   }
  227.   
  228.   bzero((void*)&ncs,sizeof(ncs));
  229.   bzero((void*)&all_charsets,sizeof(all_charsets));
  230.   
  231.   sprintf(filename,"%s/%s",argv[1],"Index.xml");
  232.   my_read_charset_file(filename);
  233.   
  234.   for (cs=all_charsets; cs < all_charsets+256; cs++)
  235.   {
  236.     if (cs->number && !(cs->state & MY_CS_COMPILED))
  237.     {
  238.       if ( (!simple_cs_is_full(cs)) && (cs->csname))
  239.       {
  240.         sprintf(filename,"%s/%s.xml",argv[1],cs->csname);
  241.         my_read_charset_file(filename);
  242.       }
  243.     }
  244.   }
  245.   
  246.   
  247.   fprintf(f,"#include <my_global.h>n");
  248.   fprintf(f,"#include <m_ctype.h>nn");
  249.   
  250.   
  251.   for (cs=all_charsets; cs < all_charsets+256; cs++)
  252.   {
  253.     if (simple_cs_is_full(cs))
  254.     {
  255.       fprintf(f,"#ifdef HAVE_CHARSET_%sn",cs->csname);
  256.       print_array(f, cs->name, "ctype",      cs->ctype,      MY_CS_CTYPE_TABLE_SIZE);
  257.       print_array(f, cs->name, "to_lower",   cs->to_lower,   MY_CS_TO_LOWER_TABLE_SIZE);
  258.       print_array(f, cs->name, "to_upper",   cs->to_upper,   MY_CS_TO_UPPER_TABLE_SIZE);
  259.       if (cs->sort_order)
  260.         print_array(f, cs->name, "sort_order", cs->sort_order, MY_CS_SORT_ORDER_TABLE_SIZE);
  261.       print_array16(f, cs->name, "to_uni",     cs->tab_to_uni, MY_CS_TO_UNI_TABLE_SIZE);
  262.       fprintf(f,"#endifn");
  263.       fprintf(f,"n");
  264.     }
  265.   }
  266.   
  267.   fprintf(f,"CHARSET_INFO compiled_charsets[] = {n");
  268.   for (cs=all_charsets; cs < all_charsets+256; cs++)
  269.   {
  270.     if (simple_cs_is_full(cs))
  271.     {
  272.       fprintf(f,"#ifdef HAVE_CHARSET_%sn",cs->csname);
  273.       dispcset(f,cs);
  274.       fprintf(f,",n");
  275.       fprintf(f,"#endifn");
  276.     }
  277.   }
  278.   
  279.   dispcset(f,&ncs);
  280.   fprintf(f,"};n");
  281.   
  282.   return 0;
  283. }