conf_to_src.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17. /* can't use -lmysys because this prog is used to create -lstrings */
  18. #include <ctype.h>
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <unistd.h>
  23. #define CHARSETS_SUBDIR "sql/share/charsets"
  24. #define CTYPE_TABLE_SIZE      257
  25. #define TO_LOWER_TABLE_SIZE   256
  26. #define TO_UPPER_TABLE_SIZE   256
  27. #define SORT_ORDER_TABLE_SIZE 256
  28. #define ROW_LEN 16
  29. void print_arrays_for(char *set);
  30. char *prog;
  31. char buf[1024], *p, *endptr;
  32. int
  33. main(int argc, char **argv)
  34. {
  35.   prog = *argv;
  36.   if (argc < 2) {
  37.     fprintf(stderr, "usage: %s source-dir [charset [, charset]]n", prog);
  38.     exit(EXIT_FAILURE);
  39.   }
  40.   --argc; ++argv;       /* skip program name */
  41.   if (chdir(*argv) != 0) {
  42.     fprintf(stderr, "%s: can't cd to %sn", prog, *argv);
  43.     exit(EXIT_FAILURE);
  44.   }
  45.   --argc; ++argv;
  46.   if (chdir(CHARSETS_SUBDIR) != 0) {
  47.     fprintf(stderr, "%s: can't cd to %sn", prog, CHARSETS_SUBDIR);
  48.     exit(EXIT_FAILURE);
  49.   }
  50.   while (argc--)
  51.     print_arrays_for(*argv++);
  52.   exit(EXIT_SUCCESS);
  53. }
  54. void
  55. print_array(FILE *f, char *set, char *name, int n)
  56. {
  57.   int i;
  58.   char val[100];
  59.   printf("uchar %s_%s[] = {n", name, set);
  60.   p = buf;
  61.   *buf = '';
  62.   for (i = 0; i < n; ++i)
  63.   {
  64.     /* get a word from f */
  65.     endptr = p;
  66.     for (;;)
  67.     {
  68.       while (isspace(*endptr))
  69.         ++endptr;
  70.       if (*endptr && *endptr != '#')    /* not comment */
  71.         break;
  72.       if ((fgets(buf, sizeof(buf), f)) == NULL)
  73.         return;         /* XXX: break silently */
  74.       endptr = buf;
  75.     }
  76.     p = val;
  77.     while (!isspace(*endptr))
  78.       *p++ = *endptr++;
  79.     *p = '';
  80.     p = endptr;
  81.     /* write the value out */
  82.     if (i == 0 || i % ROW_LEN == n % ROW_LEN)
  83.       printf("  ");
  84.     printf("%3d", (unsigned char) strtol(val, (char **) NULL, 16));
  85.     if (i < n - 1)
  86.       printf(",");
  87.     if ((i+1) % ROW_LEN == n % ROW_LEN)
  88.       printf("n");
  89.   }
  90.   printf("};nn");
  91. }
  92. void
  93. print_arrays_for(char *set)
  94. {
  95.   FILE *f;
  96.   sprintf(buf, "%s.conf", set);
  97.   if ((f = fopen(buf, "r")) == NULL) {
  98.     fprintf(stderr, "%s: can't read conf file for charset %sn", prog, set);
  99.     exit(EXIT_FAILURE);
  100.   }
  101.   printf("
  102. /* The %s character set.  Generated automatically by configure andn
  103.  * the %s programn
  104.  */nn",
  105.  set, prog);
  106.   /* it would be nice if this used the code in mysys/charset.c, but... */
  107.   print_array(f, set, "ctype",      CTYPE_TABLE_SIZE);
  108.   print_array(f, set, "to_lower",   TO_LOWER_TABLE_SIZE);
  109.   print_array(f, set, "to_upper",   TO_UPPER_TABLE_SIZE);
  110.   print_array(f, set, "sort_order", SORT_ORDER_TABLE_SIZE);
  111.   printf("n");
  112.   fclose(f);
  113.   return;
  114. }