Blame lib/unistring/unictype/categ_longname.c

Packit Service 4684c1
/* Categories of Unicode characters.
Packit Service 4684c1
   Copyright (C) 2002, 2006-2007, 2011-2020 Free Software Foundation, Inc.
Packit Service 4684c1
   Written by Bruno Haible <bruno@clisp.org>, 2011.
Packit Service 4684c1
Packit Service 4684c1
   This program is free software: you can redistribute it and/or
Packit Service 4684c1
   modify it under the terms of either:
Packit Service 4684c1
Packit Service 4684c1
     * the GNU Lesser General Public License as published by the Free
Packit Service 4684c1
       Software Foundation; either version 3 of the License, or (at your
Packit Service 4684c1
       option) any later version.
Packit Service 4684c1
Packit Service 4684c1
   or
Packit Service 4684c1
Packit Service 4684c1
     * the GNU General Public License as published by the Free
Packit Service 4684c1
       Software Foundation; either version 2 of the License, or (at your
Packit Service 4684c1
       option) any later version.
Packit Service 4684c1
Packit Service 4684c1
   or both in parallel, as here.
Packit Service 4684c1
   This program is distributed in the hope that it will be useful,
Packit Service 4684c1
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 4684c1
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 4684c1
   Lesser General Public License for more details.
Packit Service 4684c1
Packit Service 4684c1
   You should have received a copy of the GNU Lesser General Public License
Packit Service 4684c1
   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
Packit Service 4684c1
Packit Service 4684c1
#include <config.h>
Packit Service 4684c1
Packit Service 4684c1
/* Specification.  */
Packit Service 4684c1
#include "unictype.h"
Packit Service 4684c1
Packit Service 4684c1
static const char u_category_long_name[30][22] =
Packit Service 4684c1
{
Packit Service 4684c1
  "Uppercase Letter",
Packit Service 4684c1
  "Lowercase Letter",
Packit Service 4684c1
  "Titlecase Letter",
Packit Service 4684c1
  "Modifier Letter",
Packit Service 4684c1
  "Other Letter",
Packit Service 4684c1
  "Nonspacing Mark",
Packit Service 4684c1
  "Spacing Mark",
Packit Service 4684c1
  "Enclosing Mark",
Packit Service 4684c1
  "Decimal Number",
Packit Service 4684c1
  "Letter Number",
Packit Service 4684c1
  "Other Number",
Packit Service 4684c1
  "Connector Punctuation",
Packit Service 4684c1
  "Dash Punctuation",
Packit Service 4684c1
  "Open Punctuation",
Packit Service 4684c1
  "Close Punctuation",
Packit Service 4684c1
  "Initial Punctuation",
Packit Service 4684c1
  "Final Punctuation",
Packit Service 4684c1
  "Other Punctuation",
Packit Service 4684c1
  "Math Symbol",
Packit Service 4684c1
  "Currency Symbol",
Packit Service 4684c1
  "Modifier Symbol",
Packit Service 4684c1
  "Other Symbol",
Packit Service 4684c1
  "Space Separator",
Packit Service 4684c1
  "Line Separator",
Packit Service 4684c1
  "Paragraph Separator",
Packit Service 4684c1
  "Control",
Packit Service 4684c1
  "Format",
Packit Service 4684c1
  "Surrogate",
Packit Service 4684c1
  "Private Use",
Packit Service 4684c1
  "Unassigned"
Packit Service 4684c1
};
Packit Service 4684c1
Packit Service 4684c1
const char *
Packit Service 4684c1
uc_general_category_long_name (uc_general_category_t category)
Packit Service 4684c1
{
Packit Service 4684c1
  uint32_t bitmask = category.bitmask;
Packit Service 4684c1
  /* bitmask should consist of a single bit.  */
Packit Service 4684c1
  if (bitmask != 0)
Packit Service 4684c1
    {
Packit Service 4684c1
      if ((bitmask & (bitmask - 1)) == 0)
Packit Service 4684c1
        {
Packit Service 4684c1
          int bit;
Packit Service 4684c1
          /* Take log2 using a variant of Robert Harley's method.
Packit Service 4684c1
             Found by Bruno Haible 1996.  */
Packit Service 4684c1
          uint32_t n = bitmask;
Packit Service 4684c1
          static const char ord2_tab[64] =
Packit Service 4684c1
            {
Packit Service 4684c1
              -1,  0,  1, 12,  2,  6, -1, 13,  3, -1,  7, -1, -1, -1, -1, 14,
Packit Service 4684c1
              10,  4, -1, -1,  8, -1, -1, 25, -1, -1, -1, -1, -1, 21, 27, 15,
Packit Service 4684c1
              31, 11,  5, -1, -1, -1, -1, -1,  9, -1, -1, 24, -1, -1, 20, 26,
Packit Service 4684c1
              30, -1, -1, -1, -1, 23, -1, 19, 29, -1, 22, 18, 28, 17, 16, -1
Packit Service 4684c1
            };
Packit Service 4684c1
          n += n << 4;
Packit Service 4684c1
          n += n << 6;
Packit Service 4684c1
          n = (n << 16) - n;
Packit Service 4684c1
          bit = ord2_tab[n >> 26];
Packit Service 4684c1
Packit Service 4684c1
          if (bit < sizeof (u_category_long_name) / sizeof (u_category_long_name[0]))
Packit Service 4684c1
            return u_category_long_name[bit];
Packit Service 4684c1
        }
Packit Service 4684c1
      else
Packit Service 4684c1
        {
Packit Service 4684c1
          if (bitmask == UC_CATEGORY_MASK_L)
Packit Service 4684c1
            return "Letter";
Packit Service 4684c1
          if (bitmask == UC_CATEGORY_MASK_LC)
Packit Service 4684c1
            return "Cased Letter";
Packit Service 4684c1
          if (bitmask == UC_CATEGORY_MASK_M)
Packit Service 4684c1
            return "Mark";
Packit Service 4684c1
          if (bitmask == UC_CATEGORY_MASK_N)
Packit Service 4684c1
            return "Number";
Packit Service 4684c1
          if (bitmask == UC_CATEGORY_MASK_P)
Packit Service 4684c1
            return "Punctuation";
Packit Service 4684c1
          if (bitmask == UC_CATEGORY_MASK_S)
Packit Service 4684c1
            return "Symbol";
Packit Service 4684c1
          if (bitmask == UC_CATEGORY_MASK_Z)
Packit Service 4684c1
            return "Separator";
Packit Service 4684c1
          if (bitmask == UC_CATEGORY_MASK_C)
Packit Service 4684c1
            return "Other";
Packit Service 4684c1
        }
Packit Service 4684c1
    }
Packit Service 4684c1
  return NULL;
Packit Service 4684c1
}