/* Canonical combining classes of Unicode characters.
   Copyright (C) 2002, 2006-2007, 2011-2020 Free Software Foundation, Inc.
   Written by Bruno Haible <bruno@clisp.org>, 2011.

   This program is free software: you can redistribute it and/or modify it
   under the terms of the GNU Lesser General Public License as published
   by the Free Software Foundation; either version 3 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
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public License
   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */

#include <config.h>

/* Specification.  */
#include "unictype.h"

#include <stdlib.h>

static const signed char u_combining_class_index_part1[10] =
{
   0, /* Not Reordered */
   1, /* Overlay */
  -1,
  -1,
  -1,
  -1,
  -1,
   2, /* Nukta */
   3, /* Kana Voicing */
   4  /* Virama */
};
static const signed char u_combining_class_index_part2[241 - 200] =
{
   5, /* Attached Below Left */
  -1,
   6, /* Attached Below */
  -1,
  -1,
  -1,
  -1,
  -1,
  -1,
  -1,
  -1,
  -1,
  -1,
  -1,
   7, /* Attached Above */
  -1,
   8, /* Attached Above Right */
  -1,
   9, /* Below Left */
  -1,
  10, /* Below */
  -1,
  11, /* Below Right */
  -1,
  12, /* Left */
  -1,
  13, /* Right */
  -1,
  14, /* Above Left */
  -1,
  15, /* Above */
  -1,
  16, /* Above Right */
  17, /* Double Below */
  18, /* Double Above */
  -1,
  -1,
  -1,
  -1,
  -1,
  19  /* Iota Subscript */
};

static const char u_combining_class_name[20][5] =
{
  "NR",   /* Not Reordered */
  "OV",   /* Overlay */
  "NK",   /* Nukta */
  "KV",   /* Kana Voicing */
  "VR",   /* Virama */
  "ATBL", /* Attached Below Left */
  "ATB",  /* Attached Below */
  "ATA",  /* Attached Above */
  "ATAR", /* Attached Above Right */
  "BL",   /* Below Left */
  "B",    /* Below */
  "BR",   /* Below Right */
  "L",    /* Left */
  "R",    /* Right */
  "AL",   /* Above Left */
  "A",    /* Above */
  "AR",   /* Above Right */
  "DB",   /* Double Below */
  "DA",   /* Double Above */
  "IS"    /* Iota Subscript */
};

const char *
uc_combining_class_name (int ccc)
{
  if (ccc >= 0)
    {
      int index;

      if (ccc < 10)
        index = u_combining_class_index_part1[ccc];
      else if (ccc >= 200 && ccc < 241)
        index = u_combining_class_index_part2[ccc - 200];
      else
        return NULL;

      if (index >= 0)
        {
          if (index < sizeof (u_combining_class_name) / sizeof (u_combining_class_name[0]))
            return u_combining_class_name[index];
          else
            abort ();
        }
    }
  return NULL;
}
