diff options
author | Tomas Heinrich <heinrich.tomas@gmail.com> | 2010-03-18 18:35:37 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-03-18 18:35:37 +0100 |
commit | c5c006c10c060e7f1a97250d039051b93ed390b2 (patch) | |
tree | b281136c99e6a27a530282a0b1b7eaf938704bb2 /libbb/unicode.c | |
parent | 98f1dc12f1554aca6c3743bec1c3d8982a077f7c (diff) |
lineedit: first shot at optional unicode bidi input support
function old new delta
read_line_input 4886 5003 +117
in_uint16_table - 97 +97
in_interval_table - 78 +78
static.rtl_b - 68 +68
unicode_isrtl - 55 +55
isrtl_str - 51 +51
static.rtl_p - 42 +42
unicode_conv_to_printable2 633 477 -156
------------------------------------------------------------------------------
(add/remove: 6/0 grow/shrink: 1/1 up/down: 508/-156) Total: 352 bytes
Signed-off-by: Tomas Heinrich <heinrich.tomas@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libbb/unicode.c')
-rw-r--r-- | libbb/unicode.c | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/libbb/unicode.c b/libbb/unicode.c index 7c41ef30b..91667ea72 100644 --- a/libbb/unicode.c +++ b/libbb/unicode.c @@ -241,6 +241,138 @@ int FAST_FUNC iswpunct(wint_t wc) #include "unicode_wcwidth.c" +# if ENABLE_UNICODE_BIDI_SUPPORT +int FAST_FUNC unicode_isrtl(wint_t wc) +{ + /* ranges taken from + * http://www.unicode.org/Public/5.2.0/ucd/extracted/DerivedBidiClass.txt + * Bidi_Class=Left_To_Right | Bidi_Class=Arabic_Letter + */ + static const struct interval rtl_b[] = { +# define BIG_(a,b) { a, b }, +# define PAIR(a,b) + PAIR(0x0590, 0x0590) + PAIR(0x05BE, 0x05BE) + PAIR(0x05C0, 0x05C0) + PAIR(0x05C3, 0x05C3) + PAIR(0x05C6, 0x05C6) + BIG_(0x05C8, 0x05FF) + PAIR(0x0604, 0x0605) + PAIR(0x0608, 0x0608) + PAIR(0x060B, 0x060B) + PAIR(0x060D, 0x060D) + BIG_(0x061B, 0x064A) + PAIR(0x065F, 0x065F) + PAIR(0x066D, 0x066F) + BIG_(0x0671, 0x06D5) + PAIR(0x06E5, 0x06E6) + PAIR(0x06EE, 0x06EF) + BIG_(0x06FA, 0x070E) + PAIR(0x0710, 0x0710) + BIG_(0x0712, 0x072F) + BIG_(0x074B, 0x07A5) + BIG_(0x07B1, 0x07EA) + PAIR(0x07F4, 0x07F5) + BIG_(0x07FA, 0x0815) + PAIR(0x081A, 0x081A) + PAIR(0x0824, 0x0824) + PAIR(0x0828, 0x0828) + BIG_(0x082E, 0x08FF) + PAIR(0x200F, 0x200F) + PAIR(0x202B, 0x202B) + PAIR(0x202E, 0x202E) + BIG_(0xFB1D, 0xFB1D) + BIG_(0xFB1F, 0xFB28) + BIG_(0xFB2A, 0xFD3D) + BIG_(0xFD40, 0xFDCF) + BIG_(0xFDC8, 0xFDCF) + BIG_(0xFDF0, 0xFDFC) + BIG_(0xFDFE, 0xFDFF) + BIG_(0xFE70, 0xFEFE) + /* Probably not necessary + {0x10800, 0x1091E}, + {0x10920, 0x10A00}, + {0x10A04, 0x10A04}, + {0x10A07, 0x10A0B}, + {0x10A10, 0x10A37}, + {0x10A3B, 0x10A3E}, + {0x10A40, 0x10A7F}, + {0x10B36, 0x10B38}, + {0x10B40, 0x10E5F}, + {0x10E7F, 0x10FFF}, + {0x1E800, 0x1EFFF} + */ +# undef BIG_ +# undef PAIR + }; + + static const uint16_t rtl_p[] = { +# define BIG_(a,b) +# define PAIR(a,b) (a << 2) | (b-a), + /* Exact copy-n-paste of the above: */ + PAIR(0x0590, 0x0590) + PAIR(0x05BE, 0x05BE) + PAIR(0x05C0, 0x05C0) + PAIR(0x05C3, 0x05C3) + PAIR(0x05C6, 0x05C6) + BIG_(0x05C8, 0x05FF) + PAIR(0x0604, 0x0605) + PAIR(0x0608, 0x0608) + PAIR(0x060B, 0x060B) + PAIR(0x060D, 0x060D) + BIG_(0x061B, 0x064A) + PAIR(0x065F, 0x065F) + PAIR(0x066D, 0x066F) + BIG_(0x0671, 0x06D5) + PAIR(0x06E5, 0x06E6) + PAIR(0x06EE, 0x06EF) + BIG_(0x06FA, 0x070E) + PAIR(0x0710, 0x0710) + BIG_(0x0712, 0x072F) + BIG_(0x074B, 0x07A5) + BIG_(0x07B1, 0x07EA) + PAIR(0x07F4, 0x07F5) + BIG_(0x07FA, 0x0815) + PAIR(0x081A, 0x081A) + PAIR(0x0824, 0x0824) + PAIR(0x0828, 0x0828) + BIG_(0x082E, 0x08FF) + PAIR(0x200F, 0x200F) + PAIR(0x202B, 0x202B) + PAIR(0x202E, 0x202E) + BIG_(0xFB1D, 0xFB1D) + BIG_(0xFB1F, 0xFB28) + BIG_(0xFB2A, 0xFD3D) + BIG_(0xFD40, 0xFDCF) + BIG_(0xFDC8, 0xFDCF) + BIG_(0xFDF0, 0xFDFC) + BIG_(0xFDFE, 0xFDFF) + BIG_(0xFE70, 0xFEFE) + /* Probably not necessary + {0x10800, 0x1091E}, + {0x10920, 0x10A00}, + {0x10A04, 0x10A04}, + {0x10A07, 0x10A0B}, + {0x10A10, 0x10A37}, + {0x10A3B, 0x10A3E}, + {0x10A40, 0x10A7F}, + {0x10B36, 0x10B38}, + {0x10B40, 0x10E5F}, + {0x10E7F, 0x10FFF}, + {0x1E800, 0x1EFFF} + */ +# undef BIG_ +# undef PAIR + }; + + if (in_interval_table(wc, rtl_b, ARRAY_SIZE(rtl_b) - 1)) + return 1; + if (in_uint16_table(wc, rtl_p, ARRAY_SIZE(rtl_p) - 1)) + return 1; + return 0; +} +# endif /* UNICODE_BIDI_SUPPORT */ + #endif /* Homegrown Unicode support */ |