From a9a31b1de5776a3b08a82101a4fa711294f0dd1d Mon Sep 17 00:00:00 2001 From: "Manuel A. Fernandez Montecelo" Date: Fri, 27 May 2016 14:28:30 +0100 Subject: Imported Upstream version 0.9.6+really0.9.3 --- lib/unictype/bidi_byname.c | 186 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 144 insertions(+), 42 deletions(-) (limited to 'lib/unictype/bidi_byname.c') diff --git a/lib/unictype/bidi_byname.c b/lib/unictype/bidi_byname.c index 85227a87..868f05dc 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 , 2002. This program is free software: you can redistribute it and/or modify it @@ -20,50 +20,152 @@ /* Specification. */ #include "unictype.h" -#include - -#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); -} -- cgit v1.2.3