summaryrefslogtreecommitdiff
path: root/lib/unictype/bidi_byname.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/unictype/bidi_byname.c')
-rw-r--r--lib/unictype/bidi_byname.c186
1 files changed, 144 insertions, 42 deletions
diff --git a/lib/unictype/bidi_byname.c b/lib/unictype/bidi_byname.c
index 85227a8..868f05d 100644
--- a/lib/unictype/bidi_byname.c
+++ b/lib/unictype/bidi_byname.c
@@ -1,5 +1,5 @@
-/* Bidi classes of Unicode characters.
- Copyright (C) 2002, 2006, 2011-2015 Free Software Foundation, Inc.
+/* Bidi categories of Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2010 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
@@ -20,50 +20,152 @@
/* Specification. */
#include "unictype.h"
-#include <string.h>
-
-#include "unictype/bidi_byname.h"
-
int
-uc_bidi_class_byname (const char *bidi_class_name)
+uc_bidi_category_byname (const char *category_name)
{
- size_t len;
-
- len = strlen (bidi_class_name);
- if (len <= MAX_WORD_LENGTH)
+ switch (category_name[0])
{
- 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')
+ 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;
- }
- }
- /* 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;
+ 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;
}
- /* Invalid bidi class name. */
+ /* Invalid category name. */
return -1;
}
-
-int
-uc_bidi_category_byname (const char *category_name)
-{
- return uc_bidi_class_byname (category_name);
-}