From 5f2b09982312c98863eb9a8dfe2c608b81f58259 Mon Sep 17 00:00:00 2001 From: "Manuel A. Fernandez Montecelo" Date: Thu, 26 May 2016 16:48:15 +0100 Subject: Imported Upstream version 0.9.6 --- lib/unictype/bidi_byname.c | 186 ++++++++++----------------------------------- 1 file changed, 42 insertions(+), 144 deletions(-) (limited to 'lib/unictype/bidi_byname.c') diff --git a/lib/unictype/bidi_byname.c b/lib/unictype/bidi_byname.c index 868f05dc..85227a87 100644 --- a/lib/unictype/bidi_byname.c +++ b/lib/unictype/bidi_byname.c @@ -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-2015 Free Software Foundation, Inc. Written by Bruno Haible , 2002. This program is free software: you can redistribute it and/or modify it @@ -20,152 +20,50 @@ /* Specification. */ #include "unictype.h" +#include + +#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); +} -- cgit v1.2.3