Blame lib/unistring/unictype/categ_byname.c

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
}