#include "lt_types.h" typedef struct wchar_range { wchar first, last; } wchar_range; static wchar_range wide_chars[] = { #include "../wide.uni" }; static wchar_range compose_table[] = { #include "../compose.uni" }; static wchar_range fmt_table[] = { #include "../fmt.uni" }; static wchar_range comb_table[] = { {0x0644,0x0622}, {0x0644,0x0623}, {0x0644,0x0625}, {0x0644,0x0627}, }; static int is_in_table(wchar ch, wchar_range table[], int count) { if (ch < table[0].first) return 0; int lo = 0; int hi = count - 1; while (lo <= hi) { int mid = (lo + hi) / 2; if (ch > table[mid].last) lo = mid + 1; else if (ch < table[mid].first) hi = mid - 1; else return 1; } return 0; } int is_wide_char(wchar ch) { return is_in_table(ch, wide_chars, countof(wide_chars)); } int is_composing_char(wchar ch) { return is_in_table(ch, compose_table, countof(compose_table)) || is_in_table(ch, fmt_table, countof(fmt_table)); } int is_combining_char(wchar ch1, wchar ch2) { int i; for (i = 0; i < countof(comb_table); i++) { if (ch1 == comb_table[i].first && ch2 == comb_table[i].last) return 1; } return 0; }