mariadb/strings/conf_to_src.c
unknown 0cc0dbc1ed Charsets related things are prepared by configure in new way.
This is to simplify maintaining charsets, especially changing
CHARSET_INFO structure.


acconfig.h:
  New defines for charsets
configure.in:
  New way to build charsets
include/m_ctype.h:
  Prototypes, moved from ctype_autoconf.c
libmysql/Makefile.shared:
  Removed ctype_autoconf.c and ctype_extra_sources.c from target dependancies
strings/Makefile.am:
  The same with above
strings/conf_to_src.c:
  Remove unnecessary comment
strings/ctype-czech.c:
   Fix for possible bugs that prototypes was not included
strings/ctype-euc_kr.c:
   Fix for possible bugs that prototypes was not included
strings/ctype-gb2312.c:
   Fix for possible bugs that prototypes was not included
strings/ctype-ujis.c:
   Fix for possible bugs that prototypes was not included
strings/ctype.c:
  Move tables from ctype_extra_sources.c and hide them under #ifdefs
2002-03-06 17:44:43 +04:00

142 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((* (unsigned char*) 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((* (unsigned char*) 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\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;
}