mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
8b0f766c6c
Replace calls to `sprintf` and `strcpy` by the safer options `snprintf` and `safe_strcpy` in the following directories: - libmysqld - mysys - sql-common - strings All new code of the whole pull request, including one or several files that are either new files or modified ones, are contributed under the BSD-new license. I am contributing on behalf of my employer Amazon Web Services, Inc.
235 lines
6.1 KiB
C
235 lines
6.1 KiB
C
/* Copyright (c) 2006 MySQL AB
|
|
Use is subject to license terms.
|
|
|
|
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; version 2 of the License.
|
|
|
|
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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
|
|
|
|
#include "strings_def.h"
|
|
#include <m_ctype.h>
|
|
|
|
|
|
typedef struct my_ctype_name_st
|
|
{
|
|
const char *name;
|
|
int val;
|
|
} MY_CTYPE_NAME_ST;
|
|
|
|
|
|
static MY_CTYPE_NAME_ST my_ctype_name[]=
|
|
{
|
|
{"Lu", _MY_U}, /* Letter, Uppercase */
|
|
{"Ll", _MY_L}, /* Letter, Lowercase */
|
|
{"Lt", _MY_U}, /* Letter, Titlecase */
|
|
{"Lm", _MY_L}, /* Letter, Modifier */
|
|
{"Lo", _MY_L}, /* Letter, other */
|
|
|
|
{"Nd", _MY_NMR}, /* Number, Decimal Digit */
|
|
{"Nl", _MY_NMR|_MY_U|_MY_L}, /* Number, Letter */
|
|
{"No", _MY_NMR|_MY_PNT}, /* Number, Other */
|
|
|
|
{"Mn", _MY_L|_MY_PNT}, /* Mark, Nonspacing */
|
|
{"Mc", _MY_L|_MY_PNT}, /* Mark, Spacing Combining */
|
|
{"Me", _MY_L|_MY_PNT}, /* Mark, Enclosing */
|
|
|
|
{"Pc", _MY_PNT}, /* Punctuation, Connector */
|
|
{"Pd", _MY_PNT}, /* Punctuation, Dash */
|
|
{"Ps", _MY_PNT}, /* Punctuation, Open */
|
|
{"Pe", _MY_PNT}, /* Punctuation, Close */
|
|
{"Pi", _MY_PNT}, /* Punctuation, Initial quote */
|
|
{"Pf", _MY_PNT}, /* Punctuation, Final quote */
|
|
{"Po", _MY_PNT}, /* Punctuation, Other */
|
|
|
|
{"Sm", _MY_PNT}, /* Symbol, Math */
|
|
{"Sc", _MY_PNT}, /* Symbol, Currency */
|
|
{"Sk", _MY_PNT}, /* Symbol, Modifier */
|
|
{"So", _MY_PNT}, /* Symbol, Other */
|
|
|
|
{"Zs", _MY_SPC}, /* Separator, Space */
|
|
{"Zl", _MY_SPC}, /* Separator, Line */
|
|
{"Zp", _MY_SPC}, /* Separator, Paragraph */
|
|
|
|
{"Cc", _MY_CTR}, /* Other, Control */
|
|
{"Cf", _MY_CTR}, /* Other, Format */
|
|
{"Cs", _MY_CTR}, /* Other, Surrogate */
|
|
{"Co", _MY_CTR}, /* Other, Private Use */
|
|
{"Cn", _MY_CTR}, /* Other, Not Assigned */
|
|
{NULL, 0}
|
|
};
|
|
|
|
|
|
static int
|
|
ctypestr2num(const char *tok)
|
|
{
|
|
MY_CTYPE_NAME_ST *p;
|
|
for (p= my_ctype_name; p->name; p++)
|
|
{
|
|
if (!strncasecmp(p->name, tok, 2))
|
|
return p->val;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
int main(int ac, char ** av)
|
|
{
|
|
char str[1024];
|
|
unsigned char ctypea[64*1024];
|
|
size_t i;
|
|
size_t plane;
|
|
MY_UNI_CTYPE uctype[256];
|
|
FILE *f= stdin;
|
|
|
|
if (ac > 1 && av[1] && !(f= fopen(av[1],"r")))
|
|
{
|
|
fprintf(stderr, "Can't open file %s\n", av[1]);
|
|
exit(1);
|
|
}
|
|
bzero(&ctypea,sizeof(ctypea));
|
|
bzero(&uctype, sizeof(uctype));
|
|
|
|
printf("/*\n");
|
|
printf(" Unicode ctype data\n");
|
|
printf(" Generated from %s\n", av[1] ? av[1] : "stdin");
|
|
printf("*/\n");
|
|
|
|
while(fgets(str, sizeof(str), f))
|
|
{
|
|
size_t n= 0, code= 0;
|
|
char *s,*e;
|
|
int ctype= 0;
|
|
|
|
for(s= str; s; )
|
|
{
|
|
char *end;
|
|
char tok[1024]="";
|
|
e=strchr(s,';');
|
|
if(e)
|
|
{
|
|
strncpy(tok,s,(unsigned int)(e-s));
|
|
tok[e-s]=0;
|
|
}
|
|
else
|
|
{
|
|
safe_strcpy(tok, sizeof(tok), s);
|
|
}
|
|
|
|
end=tok+strlen(tok);
|
|
|
|
switch(n)
|
|
{
|
|
case 0: code= strtol(tok,&end,16);break;
|
|
case 2: ctype= ctypestr2num(tok);break;
|
|
}
|
|
|
|
n++;
|
|
if(e) s=e+1;
|
|
else s=e;
|
|
}
|
|
if(code<=0xFFFF)
|
|
{
|
|
ctypea[code]= ctype;
|
|
}
|
|
}
|
|
|
|
/* Fill digits */
|
|
for (i= '0'; i <= '9'; i++)
|
|
ctypea[i]= _MY_NMR;
|
|
|
|
for (i= 'a'; i <= 'z'; i++)
|
|
ctypea[i]|= _MY_X;
|
|
for (i= 'A'; i <= 'Z'; i++)
|
|
ctypea[i]|= _MY_X;
|
|
|
|
|
|
/* Fill ideographs */
|
|
|
|
/* CJK Ideographs Extension A (U+3400 - U+4DB5) */
|
|
for(i=0x3400;i<=0x4DB5;i++)
|
|
{
|
|
ctypea[i]= _MY_L | _MY_U;
|
|
}
|
|
|
|
/* CJK Ideographs (U+4E00 - U+9FA5) */
|
|
for(i=0x4E00;i<=0x9FA5;i++){
|
|
ctypea[i]= _MY_L | _MY_U;
|
|
}
|
|
|
|
/* Hangul Syllables (U+AC00 - U+D7A3) */
|
|
for(i=0xAC00;i<=0xD7A3;i++)
|
|
{
|
|
ctypea[i]= _MY_L | _MY_U;
|
|
}
|
|
|
|
|
|
/* Calc plane parameters */
|
|
for(plane=0;plane<256;plane++)
|
|
{
|
|
size_t character;
|
|
uctype[plane].ctype= ctypea+plane*256;
|
|
|
|
uctype[plane].pctype= uctype[plane].ctype[0];
|
|
for(character=1;character<256;character++)
|
|
{
|
|
if (uctype[plane].ctype[character] != uctype[plane].pctype)
|
|
{
|
|
uctype[plane].pctype= 0; /* Mixed plane */
|
|
break;
|
|
}
|
|
}
|
|
if (character==256) /* All the same, no needs to dump whole plane */
|
|
uctype[plane].ctype= NULL;
|
|
}
|
|
|
|
/* Dump mixed planes */
|
|
for(plane=0;plane<256;plane++)
|
|
{
|
|
if(uctype[plane].ctype)
|
|
{
|
|
int charnum=0;
|
|
int num=0;
|
|
|
|
printf("static unsigned char uctype_page%02X[256]=\n{\n", (uint) plane);
|
|
|
|
for(charnum=0;charnum<256;charnum++)
|
|
{
|
|
int cod;
|
|
|
|
cod=(plane<<8)+charnum;
|
|
printf(" %2d%s",uctype[plane].ctype[charnum],charnum<255?",":"");
|
|
|
|
num++;
|
|
if(num==16)
|
|
{
|
|
printf("\n");
|
|
num=0;
|
|
}
|
|
}
|
|
printf("};\n\n");
|
|
}
|
|
}
|
|
|
|
|
|
/* Dump plane index */
|
|
printf("MY_UNI_CTYPE my_uni_ctype[256]={\n");
|
|
for(plane=0;plane<256;plane++)
|
|
{
|
|
char plane_name[128]="NULL";
|
|
if(uctype[plane].ctype){
|
|
snprintf(plane_name,sizeof(plane_name),"uctype_page%02X",(uint) plane);
|
|
}
|
|
printf("\t{%d,%s}%s\n",uctype[plane].pctype,plane_name,plane<255?",":"");
|
|
}
|
|
printf("};\n");
|
|
|
|
return 0;
|
|
}
|