md5, sha1, sha256, sha512: add gl_SET_CRYPTO_CHECK_DEFAULT
[gnulib.git] / lib / unictype / bidi_byname.c
index 8a6cb71..adc50d4 100644 (file)
@@ -1,5 +1,5 @@
-/* Bidi categories of Unicode characters.
-   Copyright (C) 2002, 2006 Free Software Foundation, Inc.
+/* Bidi classes of Unicode characters.
+   Copyright (C) 2002, 2006, 2011-2013 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;
-             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;
+      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;
+          }
+      }
+      /* 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);
+}