mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 15:50:51 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			143 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Copyright (C) 2000 MySQL AB
 | |
| 
 | |
|    This program is free software; you can redistribute it and/or modify
 | |
|    it under the terms of the GNU General Public License as published by
 | |
|    the Free Software Foundation; either version 2 of the License, or
 | |
|    (at your option) any later version.
 | |
| 
 | |
|    This program is distributed in the hope that it will be useful,
 | |
|    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|    GNU General Public License for more details.
 | |
| 
 | |
|    You should have received a copy of the GNU General Public License
 | |
|    along with this program; if not, write to the Free Software
 | |
|    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
 | |
| 
 | |
| /* can't use -lmysys because this prog is used to create -lstrings */
 | |
| 
 | |
| #include <ctype.h>
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| #define CHARSETS_SUBDIR "sql/share/charsets"
 | |
| #define CTYPE_TABLE_SIZE      257
 | |
| #define TO_LOWER_TABLE_SIZE   256
 | |
| #define TO_UPPER_TABLE_SIZE   256
 | |
| #define SORT_ORDER_TABLE_SIZE 256
 | |
| #define ROW_LEN 16
 | |
| 
 | |
| void print_arrays_for(char *set);
 | |
| 
 | |
| char *prog;
 | |
| char buf[1024], *p, *endptr;
 | |
| 
 | |
| int
 | |
| main(int argc, char **argv)
 | |
| {
 | |
|   prog = *argv;
 | |
| 
 | |
|   if (argc < 2) {
 | |
|     fprintf(stderr, "usage: %s source-dir [charset [, charset]]\n", prog);
 | |
|     exit(EXIT_FAILURE);
 | |
|   }
 | |
| 
 | |
|   --argc; ++argv;       /* skip program name */
 | |
| 
 | |
|   if (chdir(*argv) != 0) {
 | |
|     fprintf(stderr, "%s: can't cd to %s\n", prog, *argv);
 | |
|     exit(EXIT_FAILURE);
 | |
|   }
 | |
|   --argc; ++argv;
 | |
| 
 | |
|   if (chdir(CHARSETS_SUBDIR) != 0) {
 | |
|     fprintf(stderr, "%s: can't cd to %s\n", prog, CHARSETS_SUBDIR);
 | |
|     exit(EXIT_FAILURE);
 | |
|   }
 | |
| 
 | |
|   while (argc--)
 | |
|     print_arrays_for(*argv++);
 | |
| 
 | |
|   exit(EXIT_SUCCESS);
 | |
| }
 | |
| 
 | |
| void
 | |
| print_array(FILE *f, const char *set, const char *name, int n)
 | |
| {
 | |
|   int i;
 | |
|   char val[100];
 | |
| 
 | |
|   printf("uchar %s_%s[] = {\n", name, set);
 | |
| 
 | |
|   p = buf;
 | |
|   *buf = '\0';
 | |
|   for (i = 0; i < n; ++i)
 | |
|   {
 | |
|     /* get a word from f */
 | |
|     endptr = p;
 | |
|     for (;;)
 | |
|     {
 | |
|       while (isspace(*endptr))
 | |
|         ++endptr;
 | |
|       if (*endptr && *endptr != '#')    /* not comment */
 | |
|         break;
 | |
|       if ((fgets(buf, sizeof(buf), f)) == NULL)
 | |
|         return;         /* XXX: break silently */
 | |
|       endptr = buf;
 | |
|     }
 | |
| 
 | |
|     p = val;
 | |
|     while (!isspace(*endptr))
 | |
|       *p++ = *endptr++;
 | |
|     *p = '\0';
 | |
|     p = endptr;
 | |
| 
 | |
|     /* write the value out */
 | |
| 
 | |
|     if (i == 0 || i % ROW_LEN == n % ROW_LEN)
 | |
|       printf("  ");
 | |
| 
 | |
|     printf("%3d", (unsigned char) strtol(val, (char **) NULL, 16));
 | |
| 
 | |
|     if (i < n - 1)
 | |
|       printf(",");
 | |
| 
 | |
|     if ((i+1) % ROW_LEN == n % ROW_LEN)
 | |
|       printf("\n");
 | |
|   }
 | |
| 
 | |
|   printf("};\n\n");
 | |
| }
 | |
| 
 | |
| void
 | |
| print_arrays_for(char *set)
 | |
| {
 | |
|   FILE *f;
 | |
| 
 | |
|   sprintf(buf, "%s.conf", set);
 | |
| 
 | |
|   if ((f = fopen(buf, "r")) == NULL) {
 | |
|     fprintf(stderr, "%s: can't read conf file for charset %s\n", prog, set);
 | |
|     exit(EXIT_FAILURE);
 | |
|   }
 | |
| 
 | |
|   printf("\
 | |
| /* The %s character set.  Generated automatically by configure and\n\
 | |
|  * the %s program\n\
 | |
|  */\n\n",
 | |
| 	 set, prog);
 | |
| 
 | |
|   /* it would be nice if this used the code in mysys/charset.c, but... */
 | |
|   print_array(f, set, "ctype",      CTYPE_TABLE_SIZE);
 | |
|   print_array(f, set, "to_lower",   TO_LOWER_TABLE_SIZE);
 | |
|   print_array(f, set, "to_upper",   TO_UPPER_TABLE_SIZE);
 | |
|   print_array(f, set, "sort_order", SORT_ORDER_TABLE_SIZE);
 | |
|   printf("\n");
 | |
| 
 | |
|   fclose(f);
 | |
| 
 | |
|   return;
 | |
| }
 | 
