diff options
Diffstat (limited to 'support/texlab/crates/bibutils_sys/src/unicode.c')
-rw-r--r-- | support/texlab/crates/bibutils_sys/src/unicode.c | 333 |
1 files changed, 333 insertions, 0 deletions
diff --git a/support/texlab/crates/bibutils_sys/src/unicode.c b/support/texlab/crates/bibutils_sys/src/unicode.c new file mode 100644 index 0000000000..ec9b2e1133 --- /dev/null +++ b/support/texlab/crates/bibutils_sys/src/unicode.c @@ -0,0 +1,333 @@ +/* + * unicode.c + * + * Helper unicode functions/values to determine the + * types of unicode characters. + */ +#include "utf8.h" +#include "unicode.h" + +typedef struct { + unsigned int value; + unsigned short info; +} unicodeinfo_t; + +static unicodeinfo_t unicodeinfo[] = { + { 48, UNICODE_NUMBER }, /* 0 */ + { 49, UNICODE_NUMBER }, /* 1 */ + { 50, UNICODE_NUMBER }, /* 2 */ + { 51, UNICODE_NUMBER }, /* 3 */ + { 52, UNICODE_NUMBER }, /* 4 */ + { 53, UNICODE_NUMBER }, /* 5 */ + { 54, UNICODE_NUMBER }, /* 6 */ + { 55, UNICODE_NUMBER }, /* 7 */ + { 56, UNICODE_NUMBER }, /* 8 */ + { 57, UNICODE_NUMBER }, /* 9 */ + { 65, UNICODE_UPPER }, /* Latin Capital A */ + { 66, UNICODE_UPPER }, /* Latin Capital B */ + { 67, UNICODE_UPPER }, /* Latin Capital C */ + { 68, UNICODE_UPPER }, /* Latin Capital D */ + { 69, UNICODE_UPPER }, /* Latin Capital E */ + { 70, UNICODE_UPPER }, /* Latin Capital F */ + { 71, UNICODE_UPPER }, /* Latin Capital G */ + { 72, UNICODE_UPPER }, /* Latin Capital H */ + { 73, UNICODE_UPPER }, /* Latin Capital I */ + { 74, UNICODE_UPPER }, /* Latin Capital J */ + { 75, UNICODE_UPPER }, /* Latin Capital K */ + { 76, UNICODE_UPPER }, /* Latin Capital L */ + { 77, UNICODE_UPPER }, /* Latin Capital M */ + { 78, UNICODE_UPPER }, /* Latin Capital N */ + { 79, UNICODE_UPPER }, /* Latin Capital O */ + { 80, UNICODE_UPPER }, /* Latin Capital P */ + { 81, UNICODE_UPPER }, /* Latin Capital Q */ + { 82, UNICODE_UPPER }, /* Latin Capital R */ + { 83, UNICODE_UPPER }, /* Latin Capital S */ + { 84, UNICODE_UPPER }, /* Latin Capital T */ + { 85, UNICODE_UPPER }, /* Latin Capital U */ + { 86, UNICODE_UPPER }, /* Latin Capital V */ + { 87, UNICODE_UPPER }, /* Latin Capital W */ + { 88, UNICODE_UPPER }, /* Latin Capital X */ + { 89, UNICODE_UPPER }, /* Latin Capital Y */ + { 90, UNICODE_UPPER }, /* Latin Capital Z */ + { 97, UNICODE_LOWER }, /* Latin Small a */ + { 98, UNICODE_LOWER }, /* Latin Small b */ + { 99, UNICODE_LOWER }, /* Latin Small c */ + { 100, UNICODE_LOWER }, /* Latin Small d */ + { 101, UNICODE_LOWER }, /* Latin Small e */ + { 102, UNICODE_LOWER }, /* Latin Small f */ + { 103, UNICODE_LOWER }, /* Latin Small g */ + { 104, UNICODE_LOWER }, /* Latin Small h */ + { 105, UNICODE_LOWER }, /* Latin Small i */ + { 106, UNICODE_LOWER }, /* Latin Small j */ + { 107, UNICODE_LOWER }, /* Latin Small k */ + { 108, UNICODE_LOWER }, /* Latin Small l */ + { 109, UNICODE_LOWER }, /* Latin Small m */ + { 110, UNICODE_LOWER }, /* Latin Small n */ + { 111, UNICODE_LOWER }, /* Latin Small o */ + { 112, UNICODE_LOWER }, /* Latin Small p */ + { 113, UNICODE_LOWER }, /* Latin Small q */ + { 114, UNICODE_LOWER }, /* Latin Small r */ + { 115, UNICODE_LOWER }, /* Latin Small s */ + { 116, UNICODE_LOWER }, /* Latin Small t */ + { 117, UNICODE_LOWER }, /* Latin Small u */ + { 118, UNICODE_LOWER }, /* Latin Small v */ + { 119, UNICODE_LOWER }, /* Latin Small w */ + { 120, UNICODE_LOWER }, /* Latin Small x */ + { 121, UNICODE_LOWER }, /* Latin Small y */ + { 122, UNICODE_LOWER }, /* Latin Small z */ + { 192, UNICODE_UPPER }, /* Latin Capital A with grave */ + { 193, UNICODE_UPPER }, /* Latin Capital A with acute */ + { 194, UNICODE_UPPER }, /* Latin Capital A with circumflex */ + { 195, UNICODE_UPPER }, /* Latin Capital A with tilde */ + { 196, UNICODE_UPPER }, /* Latin Capital A with diuresis */ + { 197, UNICODE_UPPER }, /* Latin Capital A with ring above */ + { 198, UNICODE_UPPER }, /* Latin Capital AE */ + { 199, UNICODE_UPPER }, /* Latin Capital C with cedilla */ + { 200, UNICODE_UPPER }, /* Latin Capital E with grave */ + { 201, UNICODE_UPPER }, /* Latin Capital E with acute */ + { 202, UNICODE_UPPER }, /* Latin Capital E with circumflex */ + { 203, UNICODE_UPPER }, /* Latin Capital E with diuresis */ + { 204, UNICODE_UPPER }, /* Latin Capital I with grave */ + { 205, UNICODE_UPPER }, /* Latin Capital I with acute */ + { 206, UNICODE_UPPER }, /* Latin Capital I with circumflex */ + { 207, UNICODE_UPPER }, /* Latin Capital I with diuresis */ + { 208, UNICODE_UPPER }, /* Latin Capital ETH */ + { 209, UNICODE_UPPER }, /* Latin Capital N with tilde */ + { 210, UNICODE_UPPER }, /* Latin Capital O with grave */ + { 211, UNICODE_UPPER }, /* Latin Capital O with acute */ + { 212, UNICODE_UPPER }, /* Latin Capital O with circumflex */ + { 213, UNICODE_UPPER }, /* Latin Capital O with tilde */ + { 214, UNICODE_UPPER }, /* Latin Captial O with diaeresis */ + { 216, UNICODE_UPPER }, /* Latin Capital O with stroke */ + { 217, UNICODE_UPPER }, /* Latin Capital U with grave */ + { 218, UNICODE_UPPER }, /* Latin Capital U with acute */ + { 219, UNICODE_UPPER }, /* Latin Capital U with circumflex */ + { 220, UNICODE_UPPER }, /* Latin Capital U with diaeresis */ + { 221, UNICODE_UPPER }, /* Latin Capital Y with acute */ + { 222, UNICODE_UPPER }, /* Latin Capital THORN */ + { 223, UNICODE_LOWER }, /* German sz ligature */ + { 224, UNICODE_LOWER }, /* Latin Small a with grave */ + { 225, UNICODE_LOWER }, /* Latin Small a with acute */ + { 226, UNICODE_LOWER }, /* Latin Small a with circumflex */ + { 227, UNICODE_LOWER }, /* Latin Small a with tilde */ + { 228, UNICODE_LOWER }, /* Latin Small a with diuresis */ + { 229, UNICODE_LOWER }, /* Latin Small a with ring above */ + { 230, UNICODE_LOWER }, /* Latin Small ae */ + { 231, UNICODE_LOWER }, /* Latin Small c with cedilla */ + { 232, UNICODE_LOWER }, /* Latin Small e with grave */ + { 233, UNICODE_LOWER }, /* Latin Small e with acute */ + { 234, UNICODE_LOWER }, /* Latin Small e with circumflex */ + { 235, UNICODE_LOWER }, /* Latin Small e with diuresis */ + { 236, UNICODE_LOWER }, /* Latin Small i with grave */ + { 237, UNICODE_LOWER }, /* Latin Small i with acute */ + { 238, UNICODE_LOWER }, /* Latin Small i with circumflex */ + { 239, UNICODE_LOWER }, /* Latin Small i with diuresis */ + { 240, UNICODE_LOWER }, /* Latin Small eth */ + { 241, UNICODE_LOWER }, /* Latin Small n with tilde */ + { 242, UNICODE_LOWER }, /* Latin Small o with grave */ + { 243, UNICODE_LOWER }, /* Latin Small o with acute */ + { 244, UNICODE_LOWER }, /* Latin Small o with circumflex */ + { 245, UNICODE_LOWER }, /* Latin Small o with tilde */ + { 246, UNICODE_LOWER }, /* Latin Small o with diaeresis */ + { 248, UNICODE_LOWER }, /* Latin Small o with stroke */ + { 249, UNICODE_LOWER }, /* Latin Small u with grave */ + { 250, UNICODE_LOWER }, /* Latin Small u with acute */ + { 251, UNICODE_LOWER }, /* Latin Small u with circumflex */ + { 252, UNICODE_LOWER }, /* Latin Small u with diaeresis */ + { 253, UNICODE_LOWER }, /* Latin Small y with acute */ + { 254, UNICODE_LOWER }, /* Latin Small thorn */ + { 255, UNICODE_LOWER }, /* Latin Small y with diaeresis */ + { 256, UNICODE_UPPER }, /* Latin Capital A with macron */ + { 257, UNICODE_LOWER }, /* Latin Small a with macron */ + { 258, UNICODE_UPPER }, /* Latin Capital A with breve */ + { 259, UNICODE_LOWER }, /* Latin Small a with breve */ + { 260, UNICODE_UPPER }, /* Latin Capital A with ogonek */ + { 261, UNICODE_LOWER }, /* Latin Small a with ogonek */ + { 262, UNICODE_UPPER }, /* Latin Capital C with acute */ + { 263, UNICODE_LOWER }, /* Latin Small c with acute */ + { 264, UNICODE_UPPER }, /* Latin Capital C with circumflex */ + { 265, UNICODE_LOWER }, /* Latin Small c with circumflex */ + { 266, UNICODE_UPPER }, /* Latin Capital C with dot above */ + { 267, UNICODE_LOWER }, /* Latin Small c with dot above */ + { 268, UNICODE_UPPER }, /* Latin Capital C with caron (hacek) */ + { 269, UNICODE_LOWER }, /* Latin Small c with caron (hacek) */ + { 270, UNICODE_UPPER }, /* Latin Capital D with caron (hacek) */ + { 271, UNICODE_LOWER }, /* Latin Small d with caron (hacek) */ + { 272, UNICODE_UPPER }, /* Latin Capital D with stroke */ + { 273, UNICODE_LOWER }, /* Latin Small d with stroke */ + { 274, UNICODE_UPPER }, /* Latin Capital E with macron */ + { 275, UNICODE_LOWER }, /* Latin Small e with macron */ + { 276, UNICODE_UPPER }, /* Latin Capital E with breve */ + { 277, UNICODE_LOWER }, /* Latin Small e with breve */ + { 278, UNICODE_UPPER }, /* Latin Capital E with dot above */ + { 279, UNICODE_LOWER }, /* Latin Small e with dot above */ + { 280, UNICODE_UPPER }, /* Latin Capital E with ogonek */ + { 281, UNICODE_LOWER }, /* Latin Small e with ogonek */ + { 282, UNICODE_UPPER }, /* Latin Capital E with caron (hacek) */ + { 283, UNICODE_LOWER }, /* Latin Small e with caron */ + { 284, UNICODE_UPPER }, /* Latin Capital G with circumflex */ + { 285, UNICODE_LOWER }, /* Latin Small g with circumflex */ + { 286, UNICODE_UPPER }, /* Latin Capital G with breve */ + { 287, UNICODE_LOWER }, /* Latin Small g with breve */ + { 288, UNICODE_UPPER }, /* Latin Capital G with dot above */ + { 289, UNICODE_LOWER }, /* Latin Small g with dot above */ + { 290, UNICODE_UPPER }, /* Latin Capital G with cedilla */ + { 291, UNICODE_LOWER }, /* Latin Small g with cedilla */ + { 292, UNICODE_UPPER }, /* Latin Capital H with circumflex */ + { 293, UNICODE_LOWER }, /* Latin Small h with circumflex */ + { 294, UNICODE_UPPER }, /* Latin Capital H with stroke */ + { 295, UNICODE_LOWER }, /* Latin Small h with stroke */ + { 296, UNICODE_UPPER }, /* Latin Capital I with tilde */ + { 297, UNICODE_LOWER }, /* Latin Small i with tilde */ + { 298, UNICODE_UPPER }, /* Latin Capital I with macron */ + { 299, UNICODE_LOWER }, /* Latin Small i with macron */ + { 300, UNICODE_UPPER }, /* Latin Capital I with breve */ + { 301, UNICODE_LOWER }, /* Latin Small i with breve */ + { 302, UNICODE_UPPER }, /* Latin Capital I with ogonek */ + { 303, UNICODE_LOWER }, /* Latin Small i with ogonek */ + { 304, UNICODE_UPPER }, /* Latin Capital I with dot above */ + { 305, UNICODE_LOWER }, /* Latin Small i without dot above */ + { 306, UNICODE_UPPER }, /* Latin Capital IJ */ + { 307, UNICODE_LOWER }, /* Latin Small IJ */ + { 308, UNICODE_UPPER }, /* Latin Capital J with circumflex */ + { 309, UNICODE_LOWER }, /* Latin Small j with circumflex */ + { 310, UNICODE_UPPER }, /* Latin Capital K with cedilla */ + { 311, UNICODE_LOWER }, /* Latin Small j with cedilla */ + { 312, UNICODE_LOWER }, /* Latin Small kra */ + { 313, UNICODE_UPPER }, /* Latin Capital L with acute */ + { 314, UNICODE_LOWER }, /* Latin Small l with acute */ + { 315, UNICODE_UPPER }, /* Latin Capital L with cedilla */ + { 316, UNICODE_LOWER }, /* Latin Small l with cedilla */ + { 317, UNICODE_UPPER }, /* Latin Capital L with caron */ + { 318, UNICODE_LOWER }, /* Latin Small l with caron */ + { 319, UNICODE_UPPER }, /* Latin Capital L with middle dot */ + { 320, UNICODE_LOWER }, /* Latin Small l with middle dot */ + { 321, UNICODE_UPPER }, /* Latin Capital L with stroke */ + { 322, UNICODE_LOWER }, /* Latin Small l with stroke */ + { 323, UNICODE_UPPER }, /* Latin Capital N with acute */ + { 324, UNICODE_LOWER }, /* Latin Small n with acute */ + { 325, UNICODE_UPPER }, /* Latin Capital N with cedilla */ + { 326, UNICODE_LOWER }, /* Latin Small n with cedilla */ + { 327, UNICODE_UPPER }, /* Latin Capital N with caron */ + { 328, UNICODE_LOWER }, /* Latin Small n with caron */ + { 329, UNICODE_LOWER }, /* Latin Small n preceeded by apostrophe */ + { 330, UNICODE_UPPER }, /* Latin Capital Eng */ + { 331, UNICODE_LOWER }, /* Latin Small eng */ + { 332, UNICODE_UPPER }, /* Latin Capital O with macron */ + { 333, UNICODE_LOWER }, /* Latin Small o with macron */ + { 334, UNICODE_UPPER }, /* Latin Capital O with breve */ + { 335, UNICODE_LOWER }, /* Latin Small o with breve */ + { 336, UNICODE_UPPER }, /* Latin Capital O with double acute */ + { 337, UNICODE_LOWER }, /* Latin Small o with double acute */ + { 338, UNICODE_UPPER }, /* Latin Capital OE */ + { 339, UNICODE_LOWER }, /* Latin Small oe */ + { 340, UNICODE_UPPER }, /* Latin Capital R with acute */ + { 341, UNICODE_LOWER }, /* Latin Small r with acute */ + { 342, UNICODE_UPPER }, /* Latin Capital R with cedilla */ + { 343, UNICODE_LOWER }, /* Latin Small r with cedilla */ + { 344, UNICODE_UPPER }, /* Latin Capital R with caron */ + { 345, UNICODE_LOWER }, /* Latin Small r with caron */ + { 346, UNICODE_UPPER }, /* Latin Capital S with acute */ + { 347, UNICODE_LOWER }, /* Latin Small s with acute */ + { 348, UNICODE_UPPER }, /* Latin Capital S with circumflex */ + { 349, UNICODE_LOWER }, /* Latin Small s with circumflex */ + { 350, UNICODE_UPPER }, /* Latin Capital S with cedilla */ + { 351, UNICODE_LOWER }, /* Latin Small s with cedilla */ + { 352, UNICODE_UPPER }, /* Latin Capital S with caron */ + { 353, UNICODE_LOWER }, /* Latin Small s with caron */ + { 354, UNICODE_UPPER }, /* Latin Capital T with cedilla */ + { 355, UNICODE_LOWER }, /* Latin Small t with cedilla */ + { 356, UNICODE_UPPER }, /* Latin Capital T with caron */ + { 357, UNICODE_LOWER }, /* Latin Small t with caron */ + { 358, UNICODE_UPPER }, /* Latin Capital T with stroke */ + { 359, UNICODE_LOWER }, /* Latin Small t with stroke */ + { 360, UNICODE_UPPER }, /* Latin Capital U with tilde */ + { 361, UNICODE_LOWER }, /* Latin Small u with tilde */ + { 362, UNICODE_UPPER }, /* Latin Capital U with macron */ + { 363, UNICODE_LOWER }, /* Latin Small u with macron */ + { 364, UNICODE_UPPER }, /* Latin Capital U with breve */ + { 365, UNICODE_LOWER }, /* Latin Small u with breve */ + { 366, UNICODE_UPPER }, /* Latin Capital U with ring above */ + { 367, UNICODE_LOWER }, /* Latin Small u with ring above */ + { 368, UNICODE_UPPER }, /* Latin Capital U with double acute */ + { 369, UNICODE_LOWER }, /* Latin Small u with double acute */ + { 370, UNICODE_UPPER }, /* Latin Capital U with ogonek */ + { 371, UNICODE_LOWER }, /* Latin Small u with ogonek */ + { 372, UNICODE_UPPER }, /* Latin Capital W with circumflex */ + { 373, UNICODE_LOWER }, /* Latin Small w with circumflex */ + { 374, UNICODE_UPPER }, /* Latin Capital Y with circumflex */ + { 375, UNICODE_LOWER }, /* Latin Small y with circumflex */ + { 376, UNICODE_UPPER }, /* Latin Capital Y with diaeresis */ + { 377, UNICODE_UPPER }, /* Latin Capital Z with acute */ + { 378, UNICODE_LOWER }, /* Latin Small z with acute */ + { 379, UNICODE_UPPER }, /* Latin Capital Z with dot above */ + { 380, UNICODE_LOWER }, /* Latin Small z with dot above */ + { 381, UNICODE_UPPER }, /* Latin Capital Z with caron */ + { 382, UNICODE_LOWER }, /* Latin Small z with caron */ + { 383, UNICODE_LOWER }, /* Latin Small long S */ + + { 461, UNICODE_UPPER }, /* Latin Capital A with caron (hacek) */ + { 462, UNICODE_LOWER }, /* Latin Small a with caron (hacek) */ + { 463, UNICODE_UPPER }, /* Latin Capital I with caron (hacek) */ + { 464, UNICODE_LOWER }, /* Latin Small i with caron (hacek) */ + { 465, UNICODE_UPPER }, /* Latin Capital O with caron (hacek) */ + { 466, UNICODE_LOWER }, /* Latin Small o with caron (hacek) */ + { 467, UNICODE_UPPER }, /* Latin Capital U with caron (hacek) */ + { 468, UNICODE_LOWER }, /* Latin Small u with caron (hacek) */ + + { 486, UNICODE_UPPER }, /* Latin Capital G with caron */ + { 487, UNICODE_LOWER }, /* Latin Small g with caron */ + { 488, UNICODE_UPPER }, /* Latin Capital J with caron */ + { 489, UNICODE_LOWER }, /* Latin Small j with caron */ + { 490, UNICODE_UPPER }, /* Latin Capital O with caron */ + { 491, UNICODE_LOWER }, /* Latin Small o with caron */ + + { 500, UNICODE_UPPER }, /* Latin Capital G with acute */ + { 501, UNICODE_LOWER }, /* Latin Small g with caron */ +}; + +static int nunicodeinfo = sizeof( unicodeinfo ) / sizeof( unicodeinfo[0] ); + +static int +unicode_find( unsigned int unicode_character ) +{ + int min = 0, max = nunicodeinfo, mid; + while ( min < max ) { + mid = ( min + max ) / 2; + if ( unicodeinfo[mid].value < unicode_character ) + min = mid + 1; + else + max = mid; + } + if ( ( max==min ) && ( unicodeinfo[min].value == unicode_character ) ) + return min; + else + return -1; +} + +unsigned short +unicode_utf8_classify( char *p ) +{ + unsigned int unicode_character, pos = 0; + int n; + unicode_character = utf8_decode( p, &pos ); + n = unicode_find( unicode_character ); + if ( n==-1 ) return UNICODE_SYMBOL; + else return unicodeinfo[n].info; +} + +unsigned short +unicode_utf8_classify_str( str *s ) +{ + unsigned int unicode_character, pos = 0; + unsigned short value = 0; + int n; + while ( pos < s->len ) { + unicode_character = utf8_decode( str_cstr( s ), &pos ); + n = unicode_find( unicode_character ); + if ( n==-1 ) value |= UNICODE_SYMBOL; + else value |= unicodeinfo[n].info; + } + return value; +} + |