From dd7595a3475407a7fa96a97393bae8c5220e8762 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Wed, 4 Jan 2012 18:41:13 +1000 Subject: Add the base Enlightenment Foundation Libraries - eina, eet, evas, ecore, embryo, and edje. Note that embryo wont be used, but I'm not sure yet if you can build edje without it. --- .../engines/common/language/evas_language_utils.c | 146 +++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 libraries/evas/src/lib/engines/common/language/evas_language_utils.c (limited to 'libraries/evas/src/lib/engines/common/language/evas_language_utils.c') diff --git a/libraries/evas/src/lib/engines/common/language/evas_language_utils.c b/libraries/evas/src/lib/engines/common/language/evas_language_utils.c new file mode 100644 index 0000000..9c9b3e3 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/language/evas_language_utils.c @@ -0,0 +1,146 @@ +/** + * @internal + * @addtogroup Evas_Utils + * + * @{ + */ +/** + * @internal + * @defgroup Evas_Script Evas Script (language) utility functions + * + * This set of functions and types helps evas handle scripts correctly. + * @todo Document types, structures and macros. + * + * @{ + */ +#include + +#include "evas_language_utils.h" +#include "evas_bidi_utils.h" /* Used for splitting according to bidi */ +#include "../evas_font_ot.h" /* Used for harfbuzz info */ + +#ifdef USE_HARFBUZZ +# include +#endif + +#include "evas_script_table.h" + +static Evas_Script_Type +_evas_common_language_char_script_search(Eina_Unicode unicode) +{ + int min = 0; + int max = (sizeof(_evas_script_slow_table) / + sizeof(_evas_script_slow_table[0])) - 1; + int mid; + + do + { + mid = (min + max) / 2; + + if (unicode < _evas_script_slow_table[mid].start) + max = mid - 1; + else if (unicode >= _evas_script_slow_table[mid].start + + _evas_script_slow_table[mid].len) + min = mid + 1; + else + return _evas_script_slow_table[mid].script; + } + while (min <= max); + + return EVAS_SCRIPT_UNKNOWN; +} + +Evas_Script_Type +evas_common_language_char_script_get(Eina_Unicode unicode) +{ + if ((unicode >= 0) && (unicode < EVAS_SCRIPT_DIRECT_TABLE_LIMIT)) + return _evas_script_fast_table[unicode]; + else + return _evas_common_language_char_script_search(unicode); +} + +int +evas_common_language_script_end_of_run_get(const Eina_Unicode *str, + const Evas_BiDi_Paragraph_Props *bidi_props, size_t start, int len) +{ + /* FIXME: Use the standard segmentation instead */ + Evas_Script_Type first = EVAS_SCRIPT_UNKNOWN; + int i; + for (i = 0 ; i < len ; i++, str++) + { + Evas_Script_Type tmp; + tmp = evas_common_language_char_script_get(*str); + /* Arabic is the first script in the array that's not + * common/inherited. */ + if ((first == EVAS_SCRIPT_UNKNOWN) && (tmp >= EVAS_SCRIPT_ARABIC)) + { + first = tmp; + continue; + } + if ((first != tmp) && (tmp >= EVAS_SCRIPT_ARABIC)) + { + break; + } + } +#ifdef BIDI_SUPPORT + { + int bidi_end; + bidi_end = evas_bidi_end_of_run_get(bidi_props, start, len); + if (bidi_end > 0) + { + i = (i < bidi_end) ? i : bidi_end; + } + } +#else + (void) bidi_props; + (void) start; +#endif + return (i < len) ? i : 0; +} + +Evas_Script_Type +evas_common_language_script_type_get(const Eina_Unicode *str, size_t len) +{ + Evas_Script_Type script = EVAS_SCRIPT_COMMON; + const Eina_Unicode *end = str + len; + /* Arabic is the first script in the array that's not a common/inherited */ + for ( ; str < end && ((script = evas_common_language_char_script_get(*str)) < EVAS_SCRIPT_ARABIC) ; str++) + ; + return script; +} + +const char * +evas_common_language_from_locale_get(void) +{ + static char lang[6]; /* FIXME: Maximum length I know about */ + if (*lang) return lang; + + const char *locale; + locale = getenv("LANG"); + if (locale && *locale) + { + char *itr; + strncpy(lang, locale, 5); + lang[5] = '\0'; + itr = lang; + while (*itr) + { + if (*itr == '_') + { + *itr = '\0'; + } + itr++; + } + return lang; + } + + return ""; +} + +/* + * @} + */ +/* + * @} + */ + -- cgit v1.1