|
Packit |
aea12f |
/* Categories of Unicode characters.
|
|
Packit Service |
991b93 |
Copyright (C) 2002, 2006-2007, 2011-2020 Free Software Foundation, Inc.
|
|
Packit |
aea12f |
Written by Bruno Haible <bruno@clisp.org>, 2002.
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
This program is free software: you can redistribute it and/or
|
|
Packit |
aea12f |
modify it under the terms of either:
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
* the GNU Lesser General Public License as published by the Free
|
|
Packit |
aea12f |
Software Foundation; either version 3 of the License, or (at your
|
|
Packit |
aea12f |
option) any later version.
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
or
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
* the GNU General Public License as published by the Free
|
|
Packit |
aea12f |
Software Foundation; either version 2 of the License, or (at your
|
|
Packit |
aea12f |
option) any later version.
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
or both in parallel, as here.
|
|
Packit |
aea12f |
This program is distributed in the hope that it will be useful,
|
|
Packit |
aea12f |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
aea12f |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
aea12f |
Lesser General Public License for more details.
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
You should have received a copy of the GNU Lesser General Public License
|
|
Packit |
aea12f |
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
#include <config.h>
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
/* Specification. */
|
|
Packit |
aea12f |
#include "unictype.h"
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
#include <stdlib.h>
|
|
Packit |
aea12f |
#include <string.h>
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
/* Indices stored in the 'struct named_category' elements of the perfect hash
|
|
Packit |
aea12f |
table. We don't use uc_general_category_t values or their addresses
|
|
Packit |
aea12f |
directly, because this would introduce load-time relocations. */
|
|
Packit |
aea12f |
enum
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_L,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_LC,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Lu,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Ll,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Lt,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Lm,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Lo,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_M,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Mn,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Mc,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Me,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_N,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Nd,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Nl,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_No,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_P,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Pc,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Pd,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Ps,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Pe,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Pi,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Pf,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Po,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_S,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Sm,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Sc,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Sk,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_So,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Z,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Zs,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Zl,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Zp,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_C,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Cc,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Cf,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Cs,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Co,
|
|
Packit |
aea12f |
UC_CATEGORY_INDEX_Cn
|
|
Packit |
aea12f |
};
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
#include "unictype/categ_byname.h"
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
uc_general_category_t
|
|
Packit |
aea12f |
uc_general_category_byname (const char *category_name)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
size_t len;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
len = strlen (category_name);
|
|
Packit |
aea12f |
if (len <= MAX_WORD_LENGTH)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
char buf[MAX_WORD_LENGTH + 1];
|
|
Packit |
aea12f |
const struct named_category *found;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
/* Copy category_name into buf, converting '_' and '-' to ' '. */
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
const char *p = category_name;
|
|
Packit |
aea12f |
char *q = buf;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
for (;; p++, q++)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
char c = *p;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
if (c == '_' || c == '-')
|
|
Packit |
aea12f |
c = ' ';
|
|
Packit |
aea12f |
*q = c;
|
|
Packit |
aea12f |
if (c == '\0')
|
|
Packit |
aea12f |
break;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
/* Here q == buf + len. */
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
/* Do a hash table lookup, with case-insensitive comparison. */
|
|
Packit |
aea12f |
found = uc_general_category_lookup (buf, len);
|
|
Packit |
aea12f |
if (found != NULL)
|
|
Packit |
aea12f |
/* Use a 'switch' statement here, because a table would introduce
|
|
Packit |
aea12f |
load-time relocations. */
|
|
Packit |
aea12f |
switch (found->category_index)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_L:
|
|
Packit |
aea12f |
return UC_CATEGORY_L;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_LC:
|
|
Packit |
aea12f |
return UC_CATEGORY_LC;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Lu:
|
|
Packit |
aea12f |
return UC_CATEGORY_Lu;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Ll:
|
|
Packit |
aea12f |
return UC_CATEGORY_Ll;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Lt:
|
|
Packit |
aea12f |
return UC_CATEGORY_Lt;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Lm:
|
|
Packit |
aea12f |
return UC_CATEGORY_Lm;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Lo:
|
|
Packit |
aea12f |
return UC_CATEGORY_Lo;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_M:
|
|
Packit |
aea12f |
return UC_CATEGORY_M;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Mn:
|
|
Packit |
aea12f |
return UC_CATEGORY_Mn;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Mc:
|
|
Packit |
aea12f |
return UC_CATEGORY_Mc;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Me:
|
|
Packit |
aea12f |
return UC_CATEGORY_Me;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_N:
|
|
Packit |
aea12f |
return UC_CATEGORY_N;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Nd:
|
|
Packit |
aea12f |
return UC_CATEGORY_Nd;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Nl:
|
|
Packit |
aea12f |
return UC_CATEGORY_Nl;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_No:
|
|
Packit |
aea12f |
return UC_CATEGORY_No;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_P:
|
|
Packit |
aea12f |
return UC_CATEGORY_P;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Pc:
|
|
Packit |
aea12f |
return UC_CATEGORY_Pc;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Pd:
|
|
Packit |
aea12f |
return UC_CATEGORY_Pd;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Ps:
|
|
Packit |
aea12f |
return UC_CATEGORY_Ps;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Pe:
|
|
Packit |
aea12f |
return UC_CATEGORY_Pe;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Pi:
|
|
Packit |
aea12f |
return UC_CATEGORY_Pi;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Pf:
|
|
Packit |
aea12f |
return UC_CATEGORY_Pf;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Po:
|
|
Packit |
aea12f |
return UC_CATEGORY_Po;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_S:
|
|
Packit |
aea12f |
return UC_CATEGORY_S;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Sm:
|
|
Packit |
aea12f |
return UC_CATEGORY_Sm;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Sc:
|
|
Packit |
aea12f |
return UC_CATEGORY_Sc;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Sk:
|
|
Packit |
aea12f |
return UC_CATEGORY_Sk;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_So:
|
|
Packit |
aea12f |
return UC_CATEGORY_So;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Z:
|
|
Packit |
aea12f |
return UC_CATEGORY_Z;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Zs:
|
|
Packit |
aea12f |
return UC_CATEGORY_Zs;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Zl:
|
|
Packit |
aea12f |
return UC_CATEGORY_Zl;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Zp:
|
|
Packit |
aea12f |
return UC_CATEGORY_Zp;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_C:
|
|
Packit |
aea12f |
return UC_CATEGORY_C;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Cc:
|
|
Packit |
aea12f |
return UC_CATEGORY_Cc;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Cf:
|
|
Packit |
aea12f |
return UC_CATEGORY_Cf;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Cs:
|
|
Packit |
aea12f |
return UC_CATEGORY_Cs;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Co:
|
|
Packit |
aea12f |
return UC_CATEGORY_Co;
|
|
Packit |
aea12f |
case UC_CATEGORY_INDEX_Cn:
|
|
Packit |
aea12f |
return UC_CATEGORY_Cn;
|
|
Packit |
aea12f |
default:
|
|
Packit |
aea12f |
abort ();
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
/* Invalid category name. */
|
|
Packit |
aea12f |
return _UC_CATEGORY_NONE;
|
|
Packit |
aea12f |
}
|