maint: update copyright
[gnulib.git] / lib / unictype / bidi_byname.c
index 868f05d..cd37899 100644 (file)
@@ -1,5 +1,5 @@
-/* Bidi categories of Unicode characters.
-   Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+/* Bidi classes of Unicode characters.
+   Copyright (C) 2002, 2006, 2011-2014 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2002.
 
    This program is free software: you can redistribute it and/or modify it
 /* Specification.  */
 #include "unictype.h"
 
+#include <string.h>
+
+#include "unictype/bidi_byname.h"
+
 int
-uc_bidi_category_byname (const char *category_name)
+uc_bidi_class_byname (const char *bidi_class_name)
 {
-  switch (category_name[0])
+  size_t len;
+
+  len = strlen (bidi_class_name);
+  if (len <= MAX_WORD_LENGTH)
     {
-    case 'A':
-      switch (category_name[1])
-        {
-        case 'L':
-          if (category_name[2] == '\0')
-            return UC_BIDI_AL;
-          break;
-        case 'N':
-          if (category_name[2] == '\0')
-            return UC_BIDI_AN;
-          break;
-        }
-      break;
-    case 'B':
-      switch (category_name[1])
-        {
-        case '\0':
-          return UC_BIDI_B;
-        case 'N':
-          if (category_name[2] == '\0')
-            return UC_BIDI_BN;
-          break;
-        }
-      break;
-    case 'C':
-      switch (category_name[1])
-        {
-        case 'S':
-          if (category_name[2] == '\0')
-            return UC_BIDI_CS;
-          break;
-        }
-      break;
-    case 'E':
-      switch (category_name[1])
-        {
-        case 'N':
-          if (category_name[2] == '\0')
-            return UC_BIDI_EN;
-          break;
-        case 'S':
-          if (category_name[2] == '\0')
-            return UC_BIDI_ES;
-          break;
-        case 'T':
-          if (category_name[2] == '\0')
-            return UC_BIDI_ET;
-          break;
-        }
-      break;
-    case 'L':
-      switch (category_name[1])
-        {
-        case '\0':
-          return UC_BIDI_L;
-        case 'R':
-          switch (category_name[2])
-            {
-            case 'E':
-              if (category_name[3] == '\0')
-                return UC_BIDI_LRE;
-              break;
-            case 'O':
-              if (category_name[3] == '\0')
-                return UC_BIDI_LRO;
-              break;
-            }
-          break;
-        }
-      break;
-    case 'N':
-      switch (category_name[1])
-        {
-        case 'S':
-          switch (category_name[2])
-            {
-            case 'M':
-              if (category_name[3] == '\0')
-                return UC_BIDI_NSM;
-              break;
-            }
-          break;
-        }
-      break;
-    case 'O':
-      switch (category_name[1])
-        {
-        case 'N':
-          if (category_name[2] == '\0')
-            return UC_BIDI_ON;
-          break;
-        }
-      break;
-    case 'P':
-      switch (category_name[1])
-        {
-        case 'D':
-          switch (category_name[2])
-            {
-            case 'F':
-              if (category_name[3] == '\0')
-                return UC_BIDI_PDF;
-              break;
-            }
-          break;
-        }
-      break;
-    case 'R':
-      switch (category_name[1])
-        {
-        case '\0':
-          return UC_BIDI_R;
-        case 'L':
-          switch (category_name[2])
-            {
-            case 'E':
-              if (category_name[3] == '\0')
-                return UC_BIDI_RLE;
-              break;
-            case 'O':
-              if (category_name[3] == '\0')
-                return UC_BIDI_RLO;
+      char buf[MAX_WORD_LENGTH + 1];
+      const struct named_bidi_class *found;
+
+      /* Copy bidi_class_name into buf, converting '_' and '-' to ' '.  */
+      {
+        const char *p = bidi_class_name;
+        char *q = buf;
+
+        for (;; p++, q++)
+          {
+            char c = *p;
+
+            if (c == '_' || c == '-')
+              c = ' ';
+            *q = c;
+            if (c == '\0')
               break;
-            }
-          break;
-        }
-      break;
-    case 'S':
-      if (category_name[1] == '\0')
-        return UC_BIDI_S;
-      break;
-    case 'W':
-      switch (category_name[1])
-        {
-        case 'S':
-          if (category_name[2] == '\0')
-            return UC_BIDI_WS;
-          break;
-        }
-      break;
+          }
+      }
+      /* Here q == buf + len.  */
+
+      /* Do a hash table lookup, with case-insensitive comparison.  */
+      found = uc_bidi_class_lookup (buf, len);
+      if (found != NULL)
+        return found->bidi_class;
     }
-  /* Invalid category name.  */
+  /* Invalid bidi class name.  */
   return -1;
 }
+
+int
+uc_bidi_category_byname (const char *category_name)
+{
+  return uc_bidi_class_byname (category_name);
+}