1 /* 2 * Copyright (C) Fredrik Fornwall 2016. 3 * Distributed under the MIT License. 4 * 5 * Implementation of wcwidth(3) as a C port of: 6 * https://github.com/jquast/wcwidth 7 * 8 * Report issues at: 9 * https://github.com/termux/wcwidth 10 * 11 * IMPORTANT: 12 * Must be kept in sync with the following: 13 * https://github.com/termux/termux-app/blob/master/terminal-emulator/src/main/java/com/termux/terminal/WcWidth.java 14 * https://github.com/termux/libandroid-support 15 * https://github.com/termux/termux-packages/tree/master/libandroid-support 16 */ 17 module wcwidth_compat.wcwidth; 18 19 20 private struct width_interval 21 { 22 uint start; 23 uint end; 24 } 25 26 /* 27 * From https://github.com/jquast/wcwidth/blob/master/wcwidth/table_zero.py 28 * at commit b29897e5a1b403a0e36f7fc991614981cbc42475 (2020-07-14): 29 */ 30 private static immutable .width_interval[] ZERO_WIDTH = 31 [ 32 // Combining Grave Accent ..Combining Latin Small Le 33 {0x000300, 0x00036F}, 34 35 // Combining Cyrillic Titlo..Combining Cyrillic Milli 36 {0x000483, 0x000489}, 37 38 // Hebrew Accent Etnahta ..Hebrew Point Meteg 39 {0x000591, 0x0005BD}, 40 41 // Hebrew Point Rafe ..Hebrew Point Rafe 42 {0x0005BF, 0x0005BF}, 43 44 // Hebrew Point Shin Dot ..Hebrew Point Sin Dot 45 {0x0005C1, 0x0005C2}, 46 47 // Hebrew Mark Upper Dot ..Hebrew Mark Lower Dot 48 {0x0005C4, 0x0005C5}, 49 50 // Hebrew Point Qamats Qata..Hebrew Point Qamats Qata 51 {0x0005C7, 0x0005C7}, 52 53 // Arabic Sign Sallallahou ..Arabic Small Kasra 54 {0x000610, 0x00061A}, 55 56 // Arabic Fathatan ..Arabic Wavy Hamza Below 57 {0x00064B, 0x00065F}, 58 59 // Arabic Letter Superscrip..Arabic Letter Superscrip 60 {0x000670, 0x000670}, 61 62 // Arabic Small High Ligatu..Arabic Small High Seen 63 {0x0006D6, 0x0006DC}, 64 65 // Arabic Small High Rounde..Arabic Small High Madda 66 {0x0006DF, 0x0006E4}, 67 68 // Arabic Small High Yeh ..Arabic Small High Noon 69 {0x0006E7, 0x0006E8}, 70 71 // Arabic Empty Centre Low ..Arabic Small Low Meem 72 {0x0006EA, 0x0006ED}, 73 74 // Syriac Letter Superscrip..Syriac Letter Superscrip 75 {0x000711, 0x000711}, 76 77 // Syriac Pthaha Above ..Syriac Barrekh 78 {0x000730, 0x00074A}, 79 80 // Thaana Abafili ..Thaana Sukun 81 {0x0007A6, 0x0007B0}, 82 83 // Nko Combining Short High..Nko Combining Double Dot 84 {0x0007EB, 0x0007F3}, 85 86 // Nko Dantayalan ..Nko Dantayalan 87 {0x0007FD, 0x0007FD}, 88 89 // Samaritan Mark In ..Samaritan Mark Dagesh 90 {0x000816, 0x000819}, 91 92 // Samaritan Mark Epentheti..Samaritan Vowel Sign A 93 {0x00081B, 0x000823}, 94 95 // Samaritan Vowel Sign Sho..Samaritan Vowel Sign U 96 {0x000825, 0x000827}, 97 98 // Samaritan Vowel Sign Lon..Samaritan Mark Nequdaa 99 {0x000829, 0x00082D}, 100 101 // Mandaic Affrication Mark..Mandaic Gemination Mark 102 {0x000859, 0x00085B}, 103 104 // Arabic Small Low Waw ..Arabic Small High Sign S 105 {0x0008D3, 0x0008E1}, 106 107 // Arabic Turned Damma Belo..Devanagari Sign Anusvara 108 {0x0008E3, 0x000902}, 109 110 // Devanagari Vowel Sign Oe..Devanagari Vowel Sign Oe 111 {0x00093A, 0x00093A}, 112 113 // Devanagari Sign Nukta ..Devanagari Sign Nukta 114 {0x00093C, 0x00093C}, 115 116 // Devanagari Vowel Sign U ..Devanagari Vowel Sign Ai 117 {0x000941, 0x000948}, 118 119 // Devanagari Sign Virama ..Devanagari Sign Virama 120 {0x00094D, 0x00094D}, 121 122 // Devanagari Stress Sign U..Devanagari Vowel Sign Uu 123 {0x000951, 0x000957}, 124 125 // Devanagari Vowel Sign Vo..Devanagari Vowel Sign Vo 126 {0x000962, 0x000963}, 127 128 // Bengali Sign Candrabindu..Bengali Sign Candrabindu 129 {0x000981, 0x000981}, 130 131 // Bengali Sign Nukta ..Bengali Sign Nukta 132 {0x0009BC, 0x0009BC}, 133 134 // Bengali Vowel Sign U ..Bengali Vowel Sign Vocal 135 {0x0009C1, 0x0009C4}, 136 137 // Bengali Sign Virama ..Bengali Sign Virama 138 {0x0009CD, 0x0009CD}, 139 140 // Bengali Vowel Sign Vocal..Bengali Vowel Sign Vocal 141 {0x0009E2, 0x0009E3}, 142 143 // Bengali Sandhi Mark ..Bengali Sandhi Mark 144 {0x0009FE, 0x0009FE}, 145 146 // Gurmukhi Sign Adak Bindi..Gurmukhi Sign Bindi 147 {0x000A01, 0x000A02}, 148 149 // Gurmukhi Sign Nukta ..Gurmukhi Sign Nukta 150 {0x000A3C, 0x000A3C}, 151 152 // Gurmukhi Vowel Sign U ..Gurmukhi Vowel Sign Uu 153 {0x000A41, 0x000A42}, 154 155 // Gurmukhi Vowel Sign Ee ..Gurmukhi Vowel Sign Ai 156 {0x000A47, 0x000A48}, 157 158 // Gurmukhi Vowel Sign Oo ..Gurmukhi Sign Virama 159 {0x000A4B, 0x000A4D}, 160 161 // Gurmukhi Sign Udaat ..Gurmukhi Sign Udaat 162 {0x000A51, 0x000A51}, 163 164 // Gurmukhi Tippi ..Gurmukhi Addak 165 {0x000A70, 0x000A71}, 166 167 // Gurmukhi Sign Yakash ..Gurmukhi Sign Yakash 168 {0x000A75, 0x000A75}, 169 170 // Gujarati Sign Candrabind..Gujarati Sign Anusvara 171 {0x000A81, 0x000A82}, 172 173 // Gujarati Sign Nukta ..Gujarati Sign Nukta 174 {0x000ABC, 0x000ABC}, 175 176 // Gujarati Vowel Sign U ..Gujarati Vowel Sign Cand 177 {0x000AC1, 0x000AC5}, 178 179 // Gujarati Vowel Sign E ..Gujarati Vowel Sign Ai 180 {0x000AC7, 0x000AC8}, 181 182 // Gujarati Sign Virama ..Gujarati Sign Virama 183 {0x000ACD, 0x000ACD}, 184 185 // Gujarati Vowel Sign Voca..Gujarati Vowel Sign Voca 186 {0x000AE2, 0x000AE3}, 187 188 // Gujarati Sign Sukun ..Gujarati Sign Two-circle 189 {0x000AFA, 0x000AFF}, 190 191 // Oriya Sign Candrabindu ..Oriya Sign Candrabindu 192 {0x000B01, 0x000B01}, 193 194 // Oriya Sign Nukta ..Oriya Sign Nukta 195 {0x000B3C, 0x000B3C}, 196 197 // Oriya Vowel Sign I ..Oriya Vowel Sign I 198 {0x000B3F, 0x000B3F}, 199 200 // Oriya Vowel Sign U ..Oriya Vowel Sign Vocalic 201 {0x000B41, 0x000B44}, 202 203 // Oriya Sign Virama ..Oriya Sign Virama 204 {0x000B4D, 0x000B4D}, 205 206 // (nil) ..Oriya Ai Length Mark 207 {0x000B55, 0x000B56}, 208 209 // Oriya Vowel Sign Vocalic..Oriya Vowel Sign Vocalic 210 {0x000B62, 0x000B63}, 211 212 // Tamil Sign Anusvara ..Tamil Sign Anusvara 213 {0x000B82, 0x000B82}, 214 215 // Tamil Vowel Sign Ii ..Tamil Vowel Sign Ii 216 {0x000BC0, 0x000BC0}, 217 218 // Tamil Sign Virama ..Tamil Sign Virama 219 {0x000BCD, 0x000BCD}, 220 221 // Telugu Sign Combining Ca..Telugu Sign Combining Ca 222 {0x000C00, 0x000C00}, 223 224 // Telugu Sign Combining An..Telugu Sign Combining An 225 {0x000C04, 0x000C04}, 226 227 // Telugu Vowel Sign Aa ..Telugu Vowel Sign Ii 228 {0x000C3E, 0x000C40}, 229 230 // Telugu Vowel Sign E ..Telugu Vowel Sign Ai 231 {0x000C46, 0x000C48}, 232 233 // Telugu Vowel Sign O ..Telugu Sign Virama 234 {0x000C4A, 0x000C4D}, 235 236 // Telugu Length Mark ..Telugu Ai Length Mark 237 {0x000C55, 0x000C56}, 238 239 // Telugu Vowel Sign Vocali..Telugu Vowel Sign Vocali 240 {0x000C62, 0x000C63}, 241 242 // Kannada Sign Candrabindu..Kannada Sign Candrabindu 243 {0x000C81, 0x000C81}, 244 245 // Kannada Sign Nukta ..Kannada Sign Nukta 246 {0x000CBC, 0x000CBC}, 247 248 // Kannada Vowel Sign I ..Kannada Vowel Sign I 249 {0x000CBF, 0x000CBF}, 250 251 // Kannada Vowel Sign E ..Kannada Vowel Sign E 252 {0x000CC6, 0x000CC6}, 253 254 // Kannada Vowel Sign Au ..Kannada Sign Virama 255 {0x000CCC, 0x000CCD}, 256 257 // Kannada Vowel Sign Vocal..Kannada Vowel Sign Vocal 258 {0x000CE2, 0x000CE3}, 259 260 // Malayalam Sign Combining..Malayalam Sign Candrabin 261 {0x000D00, 0x000D01}, 262 263 // Malayalam Sign Vertical ..Malayalam Sign Circular 264 {0x000D3B, 0x000D3C}, 265 266 // Malayalam Vowel Sign U ..Malayalam Vowel Sign Voc 267 {0x000D41, 0x000D44}, 268 269 // Malayalam Sign Virama ..Malayalam Sign Virama 270 {0x000D4D, 0x000D4D}, 271 272 // Malayalam Vowel Sign Voc..Malayalam Vowel Sign Voc 273 {0x000D62, 0x000D63}, 274 275 // (nil) ..(nil) 276 {0x000D81, 0x000D81}, 277 278 // Sinhala Sign Al-lakuna ..Sinhala Sign Al-lakuna 279 {0x000DCA, 0x000DCA}, 280 281 // Sinhala Vowel Sign Ketti..Sinhala Vowel Sign Ketti 282 {0x000DD2, 0x000DD4}, 283 284 // Sinhala Vowel Sign Diga ..Sinhala Vowel Sign Diga 285 {0x000DD6, 0x000DD6}, 286 287 // Thai Character Mai Han-a..Thai Character Mai Han-a 288 {0x000E31, 0x000E31}, 289 290 // Thai Character Sara I ..Thai Character Phinthu 291 {0x000E34, 0x000E3A}, 292 293 // Thai Character Maitaikhu..Thai Character Yamakkan 294 {0x000E47, 0x000E4E}, 295 296 // Lao Vowel Sign Mai Kan ..Lao Vowel Sign Mai Kan 297 {0x000EB1, 0x000EB1}, 298 299 // Lao Vowel Sign I ..Lao Semivowel Sign Lo 300 {0x000EB4, 0x000EBC}, 301 302 // Lao Tone Mai Ek ..Lao Niggahita 303 {0x000EC8, 0x000ECD}, 304 305 // Tibetan Astrological Sig..Tibetan Astrological Sig 306 {0x000F18, 0x000F19}, 307 308 // Tibetan Mark Ngas Bzung ..Tibetan Mark Ngas Bzung 309 {0x000F35, 0x000F35}, 310 311 // Tibetan Mark Ngas Bzung ..Tibetan Mark Ngas Bzung 312 {0x000F37, 0x000F37}, 313 314 // Tibetan Mark Tsa -phru ..Tibetan Mark Tsa -phru 315 {0x000F39, 0x000F39}, 316 317 // Tibetan Vowel Sign Aa ..Tibetan Sign Rjes Su Nga 318 {0x000F71, 0x000F7E}, 319 320 // Tibetan Vowel Sign Rever..Tibetan Mark Halanta 321 {0x000F80, 0x000F84}, 322 323 // Tibetan Sign Lci Rtags ..Tibetan Sign Yang Rtags 324 {0x000F86, 0x000F87}, 325 326 // Tibetan Subjoined Sign L..Tibetan Subjoined Letter 327 {0x000F8D, 0x000F97}, 328 329 // Tibetan Subjoined Letter..Tibetan Subjoined Letter 330 {0x000F99, 0x000FBC}, 331 332 // Tibetan Symbol Padma Gda..Tibetan Symbol Padma Gda 333 {0x000FC6, 0x000FC6}, 334 335 // Myanmar Vowel Sign I ..Myanmar Vowel Sign Uu 336 {0x00102D, 0x001030}, 337 338 // Myanmar Vowel Sign Ai ..Myanmar Sign Dot Below 339 {0x001032, 0x001037}, 340 341 // Myanmar Sign Virama ..Myanmar Sign Asat 342 {0x001039, 0x00103A}, 343 344 // Myanmar Consonant Sign M..Myanmar Consonant Sign M 345 {0x00103D, 0x00103E}, 346 347 // Myanmar Vowel Sign Vocal..Myanmar Vowel Sign Vocal 348 {0x001058, 0x001059}, 349 350 // Myanmar Consonant Sign M..Myanmar Consonant Sign M 351 {0x00105E, 0x001060}, 352 353 // Myanmar Vowel Sign Geba ..Myanmar Vowel Sign Kayah 354 {0x001071, 0x001074}, 355 356 // Myanmar Consonant Sign S..Myanmar Consonant Sign S 357 {0x001082, 0x001082}, 358 359 // Myanmar Vowel Sign Shan ..Myanmar Vowel Sign Shan 360 {0x001085, 0x001086}, 361 362 // Myanmar Sign Shan Counci..Myanmar Sign Shan Counci 363 {0x00108D, 0x00108D}, 364 365 // Myanmar Vowel Sign Aiton..Myanmar Vowel Sign Aiton 366 {0x00109D, 0x00109D}, 367 368 // Ethiopic Combining Gemin..Ethiopic Combining Gemin 369 {0x00135D, 0x00135F}, 370 371 // Tagalog Vowel Sign I ..Tagalog Sign Virama 372 {0x001712, 0x001714}, 373 374 // Hanunoo Vowel Sign I ..Hanunoo Sign Pamudpod 375 {0x001732, 0x001734}, 376 377 // Buhid Vowel Sign I ..Buhid Vowel Sign U 378 {0x001752, 0x001753}, 379 380 // Tagbanwa Vowel Sign I ..Tagbanwa Vowel Sign U 381 {0x001772, 0x001773}, 382 383 // Khmer Vowel Inherent Aq ..Khmer Vowel Inherent Aa 384 {0x0017B4, 0x0017B5}, 385 386 // Khmer Vowel Sign I ..Khmer Vowel Sign Ua 387 {0x0017B7, 0x0017BD}, 388 389 // Khmer Sign Nikahit ..Khmer Sign Nikahit 390 {0x0017C6, 0x0017C6}, 391 392 // Khmer Sign Muusikatoan ..Khmer Sign Bathamasat 393 {0x0017C9, 0x0017D3}, 394 395 // Khmer Sign Atthacan ..Khmer Sign Atthacan 396 {0x0017DD, 0x0017DD}, 397 398 // Mongolian Free Variation..Mongolian Free Variation 399 {0x00180B, 0x00180D}, 400 401 // Mongolian Letter Ali Gal..Mongolian Letter Ali Gal 402 {0x001885, 0x001886}, 403 404 // Mongolian Letter Ali Gal..Mongolian Letter Ali Gal 405 {0x0018A9, 0x0018A9}, 406 407 // Limbu Vowel Sign A ..Limbu Vowel Sign U 408 {0x001920, 0x001922}, 409 410 // Limbu Vowel Sign E ..Limbu Vowel Sign O 411 {0x001927, 0x001928}, 412 413 // Limbu Small Letter Anusv..Limbu Small Letter Anusv 414 {0x001932, 0x001932}, 415 416 // Limbu Sign Mukphreng ..Limbu Sign Sa-i 417 {0x001939, 0x00193B}, 418 419 // Buginese Vowel Sign I ..Buginese Vowel Sign U 420 {0x001A17, 0x001A18}, 421 422 // Buginese Vowel Sign Ae ..Buginese Vowel Sign Ae 423 {0x001A1B, 0x001A1B}, 424 425 // Tai Tham Consonant Sign ..Tai Tham Consonant Sign 426 {0x001A56, 0x001A56}, 427 428 // Tai Tham Sign Mai Kang L..Tai Tham Consonant Sign 429 {0x001A58, 0x001A5E}, 430 431 // Tai Tham Sign Sakot ..Tai Tham Sign Sakot 432 {0x001A60, 0x001A60}, 433 434 // Tai Tham Vowel Sign Mai ..Tai Tham Vowel Sign Mai 435 {0x001A62, 0x001A62}, 436 437 // Tai Tham Vowel Sign I ..Tai Tham Vowel Sign Oa B 438 {0x001A65, 0x001A6C}, 439 440 // Tai Tham Vowel Sign Oa A..Tai Tham Sign Khuen-lue 441 {0x001A73, 0x001A7C}, 442 443 // Tai Tham Combining Crypt..Tai Tham Combining Crypt 444 {0x001A7F, 0x001A7F}, 445 446 // Combining Doubled Circum..(nil) 447 {0x001AB0, 0x001AC0}, 448 449 // Balinese Sign Ulu Ricem ..Balinese Sign Surang 450 {0x001B00, 0x001B03}, 451 452 // Balinese Sign Rerekan ..Balinese Sign Rerekan 453 {0x001B34, 0x001B34}, 454 455 // Balinese Vowel Sign Ulu ..Balinese Vowel Sign Ra R 456 {0x001B36, 0x001B3A}, 457 458 // Balinese Vowel Sign La L..Balinese Vowel Sign La L 459 {0x001B3C, 0x001B3C}, 460 461 // Balinese Vowel Sign Pepe..Balinese Vowel Sign Pepe 462 {0x001B42, 0x001B42}, 463 464 // Balinese Musical Symbol ..Balinese Musical Symbol 465 {0x001B6B, 0x001B73}, 466 467 // Sundanese Sign Panyecek ..Sundanese Sign Panglayar 468 {0x001B80, 0x001B81}, 469 470 // Sundanese Consonant Sign..Sundanese Vowel Sign Pan 471 {0x001BA2, 0x001BA5}, 472 473 // Sundanese Vowel Sign Pam..Sundanese Vowel Sign Pan 474 {0x001BA8, 0x001BA9}, 475 476 // Sundanese Sign Virama ..Sundanese Consonant Sign 477 {0x001BAB, 0x001BAD}, 478 479 // Batak Sign Tompi ..Batak Sign Tompi 480 {0x001BE6, 0x001BE6}, 481 482 // Batak Vowel Sign Pakpak ..Batak Vowel Sign Ee 483 {0x001BE8, 0x001BE9}, 484 485 // Batak Vowel Sign Karo O ..Batak Vowel Sign Karo O 486 {0x001BED, 0x001BED}, 487 488 // Batak Vowel Sign U For S..Batak Consonant Sign H 489 {0x001BEF, 0x001BF1}, 490 491 // Lepcha Vowel Sign E ..Lepcha Consonant Sign T 492 {0x001C2C, 0x001C33}, 493 494 // Lepcha Sign Ran ..Lepcha Sign Nukta 495 {0x001C36, 0x001C37}, 496 497 // Vedic Tone Karshana ..Vedic Tone Prenkha 498 {0x001CD0, 0x001CD2}, 499 500 // Vedic Sign Yajurvedic Mi..Vedic Tone Rigvedic Kash 501 {0x001CD4, 0x001CE0}, 502 503 // Vedic Sign Visarga Svari..Vedic Sign Visarga Anuda 504 {0x001CE2, 0x001CE8}, 505 506 // Vedic Sign Tiryak ..Vedic Sign Tiryak 507 {0x001CED, 0x001CED}, 508 509 // Vedic Tone Candra Above ..Vedic Tone Candra Above 510 {0x001CF4, 0x001CF4}, 511 512 // Vedic Tone Ring Above ..Vedic Tone Double Ring A 513 {0x001CF8, 0x001CF9}, 514 515 // Combining Dotted Grave A..Combining Wide Inverted 516 {0x001DC0, 0x001DF9}, 517 518 // Combining Deletion Mark ..Combining Right Arrowhea 519 {0x001DFB, 0x001DFF}, 520 521 // Combining Left Harpoon A..Combining Asterisk Above 522 {0x0020D0, 0x0020F0}, 523 524 // Coptic Combining Ni Abov..Coptic Combining Spiritu 525 {0x002CEF, 0x002CF1}, 526 527 // Tifinagh Consonant Joine..Tifinagh Consonant Joine 528 {0x002D7F, 0x002D7F}, 529 530 // Combining Cyrillic Lette..Combining Cyrillic Lette 531 {0x002DE0, 0x002DFF}, 532 533 // Ideographic Level Tone M..Ideographic Entering Ton 534 {0x00302A, 0x00302D}, 535 536 // Combining Katakana-hirag..Combining Katakana-hirag 537 {0x003099, 0x00309A}, 538 539 // Combining Cyrillic Vzmet..Combining Cyrillic Thous 540 {0x00A66F, 0x00A672}, 541 542 // Combining Cyrillic Lette..Combining Cyrillic Payer 543 {0x00A674, 0x00A67D}, 544 545 // Combining Cyrillic Lette..Combining Cyrillic Lette 546 {0x00A69E, 0x00A69F}, 547 548 // Bamum Combining Mark Koq..Bamum Combining Mark Tuk 549 {0x00A6F0, 0x00A6F1}, 550 551 // Syloti Nagri Sign Dvisva..Syloti Nagri Sign Dvisva 552 {0x00A802, 0x00A802}, 553 554 // Syloti Nagri Sign Hasant..Syloti Nagri Sign Hasant 555 {0x00A806, 0x00A806}, 556 557 // Syloti Nagri Sign Anusva..Syloti Nagri Sign Anusva 558 {0x00A80B, 0x00A80B}, 559 560 // Syloti Nagri Vowel Sign ..Syloti Nagri Vowel Sign 561 {0x00A825, 0x00A826}, 562 563 // (nil) ..(nil) 564 {0x00A82C, 0x00A82C}, 565 566 // Saurashtra Sign Virama ..Saurashtra Sign Candrabi 567 {0x00A8C4, 0x00A8C5}, 568 569 // Combining Devanagari Dig..Combining Devanagari Sig 570 {0x00A8E0, 0x00A8F1}, 571 572 // Devanagari Vowel Sign Ay..Devanagari Vowel Sign Ay 573 {0x00A8FF, 0x00A8FF}, 574 575 // Kayah Li Vowel Ue ..Kayah Li Tone Calya Plop 576 {0x00A926, 0x00A92D}, 577 578 // Rejang Vowel Sign I ..Rejang Consonant Sign R 579 {0x00A947, 0x00A951}, 580 581 // Javanese Sign Panyangga ..Javanese Sign Layar 582 {0x00A980, 0x00A982}, 583 584 // Javanese Sign Cecak Telu..Javanese Sign Cecak Telu 585 {0x00A9B3, 0x00A9B3}, 586 587 // Javanese Vowel Sign Wulu..Javanese Vowel Sign Suku 588 {0x00A9B6, 0x00A9B9}, 589 590 // Javanese Vowel Sign Pepe..Javanese Consonant Sign 591 {0x00A9BC, 0x00A9BD}, 592 593 // Myanmar Sign Shan Saw ..Myanmar Sign Shan Saw 594 {0x00A9E5, 0x00A9E5}, 595 596 // Cham Vowel Sign Aa ..Cham Vowel Sign Oe 597 {0x00AA29, 0x00AA2E}, 598 599 // Cham Vowel Sign Au ..Cham Vowel Sign Ue 600 {0x00AA31, 0x00AA32}, 601 602 // Cham Consonant Sign La ..Cham Consonant Sign Wa 603 {0x00AA35, 0x00AA36}, 604 605 // Cham Consonant Sign Fina..Cham Consonant Sign Fina 606 {0x00AA43, 0x00AA43}, 607 608 // Cham Consonant Sign Fina..Cham Consonant Sign Fina 609 {0x00AA4C, 0x00AA4C}, 610 611 // Myanmar Sign Tai Laing T..Myanmar Sign Tai Laing T 612 {0x00AA7C, 0x00AA7C}, 613 614 // Tai Viet Mai Kang ..Tai Viet Mai Kang 615 {0x00AAB0, 0x00AAB0}, 616 617 // Tai Viet Vowel I ..Tai Viet Vowel U 618 {0x00AAB2, 0x00AAB4}, 619 620 // Tai Viet Mai Khit ..Tai Viet Vowel Ia 621 {0x00AAB7, 0x00AAB8}, 622 623 // Tai Viet Vowel Am ..Tai Viet Tone Mai Ek 624 {0x00AABE, 0x00AABF}, 625 626 // Tai Viet Tone Mai Tho ..Tai Viet Tone Mai Tho 627 {0x00AAC1, 0x00AAC1}, 628 629 // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign 630 {0x00AAEC, 0x00AAED}, 631 632 // Meetei Mayek Virama ..Meetei Mayek Virama 633 {0x00AAF6, 0x00AAF6}, 634 635 // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign 636 {0x00ABE5, 0x00ABE5}, 637 638 // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign 639 {0x00ABE8, 0x00ABE8}, 640 641 // Meetei Mayek Apun Iyek ..Meetei Mayek Apun Iyek 642 {0x00ABED, 0x00ABED}, 643 644 // Hebrew Point Judeo-spani..Hebrew Point Judeo-spani 645 {0x00FB1E, 0x00FB1E}, 646 647 // Variation Selector-1 ..Variation Selector-16 648 {0x00FE00, 0x00FE0F}, 649 650 // Combining Ligature Left ..Combining Cyrillic Titlo 651 {0x00FE20, 0x00FE2F}, 652 653 // Phaistos Disc Sign Combi..Phaistos Disc Sign Combi 654 {0x0101FD, 0x0101FD}, 655 656 // Coptic Epact Thousands M..Coptic Epact Thousands M 657 {0x0102E0, 0x0102E0}, 658 659 // Combining Old Permic Let..Combining Old Permic Let 660 {0x010376, 0x01037A}, 661 662 // Kharoshthi Vowel Sign I ..Kharoshthi Vowel Sign Vo 663 {0x010A01, 0x010A03}, 664 665 // Kharoshthi Vowel Sign E ..Kharoshthi Vowel Sign O 666 {0x010A05, 0x010A06}, 667 668 // Kharoshthi Vowel Length ..Kharoshthi Sign Visarga 669 {0x010A0C, 0x010A0F}, 670 671 // Kharoshthi Sign Bar Abov..Kharoshthi Sign Dot Belo 672 {0x010A38, 0x010A3A}, 673 674 // Kharoshthi Virama ..Kharoshthi Virama 675 {0x010A3F, 0x010A3F}, 676 677 // Manichaean Abbreviation ..Manichaean Abbreviation 678 {0x010AE5, 0x010AE6}, 679 680 // Hanifi Rohingya Sign Har..Hanifi Rohingya Sign Tas 681 {0x010D24, 0x010D27}, 682 683 // (nil) ..(nil) 684 {0x010EAB, 0x010EAC}, 685 686 // Sogdian Combining Dot Be..Sogdian Combining Stroke 687 {0x010F46, 0x010F50}, 688 689 // Brahmi Sign Anusvara ..Brahmi Sign Anusvara 690 {0x011001, 0x011001}, 691 692 // Brahmi Vowel Sign Aa ..Brahmi Virama 693 {0x011038, 0x011046}, 694 695 // Brahmi Number Joiner ..Kaithi Sign Anusvara 696 {0x01107F, 0x011081}, 697 698 // Kaithi Vowel Sign U ..Kaithi Vowel Sign Ai 699 {0x0110B3, 0x0110B6}, 700 701 // Kaithi Sign Virama ..Kaithi Sign Nukta 702 {0x0110B9, 0x0110BA}, 703 704 // Chakma Sign Candrabindu ..Chakma Sign Visarga 705 {0x011100, 0x011102}, 706 707 // Chakma Vowel Sign A ..Chakma Vowel Sign Uu 708 {0x011127, 0x01112B}, 709 710 // Chakma Vowel Sign Ai ..Chakma Maayyaa 711 {0x01112D, 0x011134}, 712 713 // Mahajani Sign Nukta ..Mahajani Sign Nukta 714 {0x011173, 0x011173}, 715 716 // Sharada Sign Candrabindu..Sharada Sign Anusvara 717 {0x011180, 0x011181}, 718 719 // Sharada Vowel Sign U ..Sharada Vowel Sign O 720 {0x0111B6, 0x0111BE}, 721 722 // Sharada Sandhi Mark ..Sharada Extra Short Vowe 723 {0x0111C9, 0x0111CC}, 724 725 // (nil) ..(nil) 726 {0x0111CF, 0x0111CF}, 727 728 // Khojki Vowel Sign U ..Khojki Vowel Sign Ai 729 {0x01122F, 0x011231}, 730 731 // Khojki Sign Anusvara ..Khojki Sign Anusvara 732 {0x011234, 0x011234}, 733 734 // Khojki Sign Nukta ..Khojki Sign Shadda 735 {0x011236, 0x011237}, 736 737 // Khojki Sign Sukun ..Khojki Sign Sukun 738 {0x01123E, 0x01123E}, 739 740 // Khudawadi Sign Anusvara ..Khudawadi Sign Anusvara 741 {0x0112DF, 0x0112DF}, 742 743 // Khudawadi Vowel Sign U ..Khudawadi Sign Virama 744 {0x0112E3, 0x0112EA}, 745 746 // Grantha Sign Combining A..Grantha Sign Candrabindu 747 {0x011300, 0x011301}, 748 749 // Combining Bindu Below ..Grantha Sign Nukta 750 {0x01133B, 0x01133C}, 751 752 // Grantha Vowel Sign Ii ..Grantha Vowel Sign Ii 753 {0x011340, 0x011340}, 754 755 // Combining Grantha Digit ..Combining Grantha Digit 756 {0x011366, 0x01136C}, 757 758 // Combining Grantha Letter..Combining Grantha Letter 759 {0x011370, 0x011374}, 760 761 // Newa Vowel Sign U ..Newa Vowel Sign Ai 762 {0x011438, 0x01143F}, 763 764 // Newa Sign Virama ..Newa Sign Anusvara 765 {0x011442, 0x011444}, 766 767 // Newa Sign Nukta ..Newa Sign Nukta 768 {0x011446, 0x011446}, 769 770 // Newa Sandhi Mark ..Newa Sandhi Mark 771 {0x01145E, 0x01145E}, 772 773 // Tirhuta Vowel Sign U ..Tirhuta Vowel Sign Vocal 774 {0x0114B3, 0x0114B8}, 775 776 // Tirhuta Vowel Sign Short..Tirhuta Vowel Sign Short 777 {0x0114BA, 0x0114BA}, 778 779 // Tirhuta Sign Candrabindu..Tirhuta Sign Anusvara 780 {0x0114BF, 0x0114C0}, 781 782 // Tirhuta Sign Virama ..Tirhuta Sign Nukta 783 {0x0114C2, 0x0114C3}, 784 785 // Siddham Vowel Sign U ..Siddham Vowel Sign Vocal 786 {0x0115B2, 0x0115B5}, 787 788 // Siddham Sign Candrabindu..Siddham Sign Anusvara 789 {0x0115BC, 0x0115BD}, 790 791 // Siddham Sign Virama ..Siddham Sign Nukta 792 {0x0115BF, 0x0115C0}, 793 794 // Siddham Vowel Sign Alter..Siddham Vowel Sign Alter 795 {0x0115DC, 0x0115DD}, 796 797 // Modi Vowel Sign U ..Modi Vowel Sign Ai 798 {0x011633, 0x01163A}, 799 800 // Modi Sign Anusvara ..Modi Sign Anusvara 801 {0x01163D, 0x01163D}, 802 803 // Modi Sign Virama ..Modi Sign Ardhacandra 804 {0x01163F, 0x011640}, 805 806 // Takri Sign Anusvara ..Takri Sign Anusvara 807 {0x0116AB, 0x0116AB}, 808 809 // Takri Vowel Sign Aa ..Takri Vowel Sign Aa 810 {0x0116AD, 0x0116AD}, 811 812 // Takri Vowel Sign U ..Takri Vowel Sign Au 813 {0x0116B0, 0x0116B5}, 814 815 // Takri Sign Nukta ..Takri Sign Nukta 816 {0x0116B7, 0x0116B7}, 817 818 // Ahom Consonant Sign Medi..Ahom Consonant Sign Medi 819 {0x01171D, 0x01171F}, 820 821 // Ahom Vowel Sign I ..Ahom Vowel Sign Uu 822 {0x011722, 0x011725}, 823 824 // Ahom Vowel Sign Aw ..Ahom Sign Killer 825 {0x011727, 0x01172B}, 826 827 // Dogra Vowel Sign U ..Dogra Sign Anusvara 828 {0x01182F, 0x011837}, 829 830 // Dogra Sign Virama ..Dogra Sign Nukta 831 {0x011839, 0x01183A}, 832 833 // (nil) ..(nil) 834 {0x01193B, 0x01193C}, 835 836 // (nil) ..(nil) 837 {0x01193E, 0x01193E}, 838 839 // (nil) ..(nil) 840 {0x011943, 0x011943}, 841 842 // Nandinagari Vowel Sign U..Nandinagari Vowel Sign V 843 {0x0119D4, 0x0119D7}, 844 845 // Nandinagari Vowel Sign E..Nandinagari Vowel Sign A 846 {0x0119DA, 0x0119DB}, 847 848 // Nandinagari Sign Virama ..Nandinagari Sign Virama 849 {0x0119E0, 0x0119E0}, 850 851 // Zanabazar Square Vowel S..Zanabazar Square Vowel L 852 {0x011A01, 0x011A0A}, 853 854 // Zanabazar Square Final C..Zanabazar Square Sign An 855 {0x011A33, 0x011A38}, 856 857 // Zanabazar Square Cluster..Zanabazar Square Cluster 858 {0x011A3B, 0x011A3E}, 859 860 // Zanabazar Square Subjoin..Zanabazar Square Subjoin 861 {0x011A47, 0x011A47}, 862 863 // Soyombo Vowel Sign I ..Soyombo Vowel Sign Oe 864 {0x011A51, 0x011A56}, 865 866 // Soyombo Vowel Sign Vocal..Soyombo Vowel Length Mar 867 {0x011A59, 0x011A5B}, 868 869 // Soyombo Final Consonant ..Soyombo Sign Anusvara 870 {0x011A8A, 0x011A96}, 871 872 // Soyombo Gemination Mark ..Soyombo Subjoiner 873 {0x011A98, 0x011A99}, 874 875 // Bhaiksuki Vowel Sign I ..Bhaiksuki Vowel Sign Voc 876 {0x011C30, 0x011C36}, 877 878 // Bhaiksuki Vowel Sign E ..Bhaiksuki Sign Anusvara 879 {0x011C38, 0x011C3D}, 880 881 // Bhaiksuki Sign Virama ..Bhaiksuki Sign Virama 882 {0x011C3F, 0x011C3F}, 883 884 // Marchen Subjoined Letter..Marchen Subjoined Letter 885 {0x011C92, 0x011CA7}, 886 887 // Marchen Subjoined Letter..Marchen Vowel Sign Aa 888 {0x011CAA, 0x011CB0}, 889 890 // Marchen Vowel Sign U ..Marchen Vowel Sign E 891 {0x011CB2, 0x011CB3}, 892 893 // Marchen Sign Anusvara ..Marchen Sign Candrabindu 894 {0x011CB5, 0x011CB6}, 895 896 // Masaram Gondi Vowel Sign..Masaram Gondi Vowel Sign 897 {0x011D31, 0x011D36}, 898 899 // Masaram Gondi Vowel Sign..Masaram Gondi Vowel Sign 900 {0x011D3A, 0x011D3A}, 901 902 // Masaram Gondi Vowel Sign..Masaram Gondi Vowel Sign 903 {0x011D3C, 0x011D3D}, 904 905 // Masaram Gondi Vowel Sign..Masaram Gondi Virama 906 {0x011D3F, 0x011D45}, 907 908 // Masaram Gondi Ra-kara ..Masaram Gondi Ra-kara 909 {0x011D47, 0x011D47}, 910 911 // Gunjala Gondi Vowel Sign..Gunjala Gondi Vowel Sign 912 {0x011D90, 0x011D91}, 913 914 // Gunjala Gondi Sign Anusv..Gunjala Gondi Sign Anusv 915 {0x011D95, 0x011D95}, 916 917 // Gunjala Gondi Virama ..Gunjala Gondi Virama 918 {0x011D97, 0x011D97}, 919 920 // Makasar Vowel Sign I ..Makasar Vowel Sign U 921 {0x011EF3, 0x011EF4}, 922 923 // Bassa Vah Combining High..Bassa Vah Combining High 924 {0x016AF0, 0x016AF4}, 925 926 // Pahawh Hmong Mark Cim Tu..Pahawh Hmong Mark Cim Ta 927 {0x016B30, 0x016B36}, 928 929 // Miao Sign Consonant Modi..Miao Sign Consonant Modi 930 {0x016F4F, 0x016F4F}, 931 932 // Miao Tone Right ..Miao Tone Below 933 {0x016F8F, 0x016F92}, 934 935 // (nil) ..(nil) 936 {0x016FE4, 0x016FE4}, 937 938 // Duployan Thick Letter Se..Duployan Double Mark 939 {0x01BC9D, 0x01BC9E}, 940 941 // Musical Symbol Combining..Musical Symbol Combining 942 {0x01D167, 0x01D169}, 943 944 // Musical Symbol Combining..Musical Symbol Combining 945 {0x01D17B, 0x01D182}, 946 947 // Musical Symbol Combining..Musical Symbol Combining 948 {0x01D185, 0x01D18B}, 949 950 // Musical Symbol Combining..Musical Symbol Combining 951 {0x01D1AA, 0x01D1AD}, 952 953 // Combining Greek Musical ..Combining Greek Musical 954 {0x01D242, 0x01D244}, 955 956 // Signwriting Head Rim ..Signwriting Air Sucking 957 {0x01DA00, 0x01DA36}, 958 959 // Signwriting Mouth Closed..Signwriting Excitement 960 {0x01DA3B, 0x01DA6C}, 961 962 // Signwriting Upper Body T..Signwriting Upper Body T 963 {0x01DA75, 0x01DA75}, 964 965 // Signwriting Location Hea..Signwriting Location Hea 966 {0x01DA84, 0x01DA84}, 967 968 // Signwriting Fill Modifie..Signwriting Fill Modifie 969 {0x01DA9B, 0x01DA9F}, 970 971 // Signwriting Rotation Mod..Signwriting Rotation Mod 972 {0x01DAA1, 0x01DAAF}, 973 974 // Combining Glagolitic Let..Combining Glagolitic Let 975 {0x01E000, 0x01E006}, 976 977 // Combining Glagolitic Let..Combining Glagolitic Let 978 {0x01E008, 0x01E018}, 979 980 // Combining Glagolitic Let..Combining Glagolitic Let 981 {0x01E01B, 0x01E021}, 982 983 // Combining Glagolitic Let..Combining Glagolitic Let 984 {0x01E023, 0x01E024}, 985 986 // Combining Glagolitic Let..Combining Glagolitic Let 987 {0x01E026, 0x01E02A}, 988 989 // Nyiakeng Puachue Hmong T..Nyiakeng Puachue Hmong T 990 {0x01E130, 0x01E136}, 991 992 // Wancho Tone Tup ..Wancho Tone Koini 993 {0x01E2EC, 0x01E2EF}, 994 995 // Mende Kikakui Combining ..Mende Kikakui Combining 996 {0x01E8D0, 0x01E8D6}, 997 998 // Adlam Alif Lengthener ..Adlam Nukta 999 {0x01E944, 0x01E94A}, 1000 1001 // Variation Selector-17 ..Variation Selector-256 1002 {0x0E0100, 0x0E01EF}, 1003 ]; 1004 1005 /* 1006 * https://github.com/jquast/wcwidth/blob/master/wcwidth/table_wide.py 1007 * at commit b29897e5a1b403a0e36f7fc991614981cbc42475 (2020-07-14): 1008 */ 1009 private static immutable .width_interval[] WIDE_EASTASIAN = 1010 [ 1011 // Hangul Choseong Kiyeok ..Hangul Choseong Filler 1012 {0x001100, 0x00115F}, 1013 1014 // Watch ..Hourglass 1015 {0x00231A, 0x00231B}, 1016 1017 // Left-pointing Angle Brac..Right-pointing Angle Bra 1018 {0x002329, 0x00232A}, 1019 1020 // Black Right-pointing Dou..Black Down-pointing Doub 1021 {0x0023E9, 0x0023EC}, 1022 1023 // Alarm Clock ..Alarm Clock 1024 {0x0023F0, 0x0023F0}, 1025 1026 // Hourglass With Flowing S..Hourglass With Flowing S 1027 {0x0023F3, 0x0023F3}, 1028 1029 // White Medium Small Squar..Black Medium Small Squar 1030 {0x0025FD, 0x0025FE}, 1031 1032 // Umbrella With Rain Drops..Hot Beverage 1033 {0x002614, 0x002615}, 1034 1035 // Aries ..Pisces 1036 {0x002648, 0x002653}, 1037 1038 // Wheelchair Symbol ..Wheelchair Symbol 1039 {0x00267F, 0x00267F}, 1040 1041 // Anchor ..Anchor 1042 {0x002693, 0x002693}, 1043 1044 // High Voltage Sign ..High Voltage Sign 1045 {0x0026A1, 0x0026A1}, 1046 1047 // Medium White Circle ..Medium Black Circle 1048 {0x0026AA, 0x0026AB}, 1049 1050 // Soccer Ball ..Baseball 1051 {0x0026BD, 0x0026BE}, 1052 1053 // Snowman Without Snow ..Sun Behind Cloud 1054 {0x0026C4, 0x0026C5}, 1055 1056 // Ophiuchus ..Ophiuchus 1057 {0x0026CE, 0x0026CE}, 1058 1059 // No Entry ..No Entry 1060 {0x0026D4, 0x0026D4}, 1061 1062 // Church ..Church 1063 {0x0026EA, 0x0026EA}, 1064 1065 // Fountain ..Flag In Hole 1066 {0x0026F2, 0x0026F3}, 1067 1068 // Sailboat ..Sailboat 1069 {0x0026F5, 0x0026F5}, 1070 1071 // Tent ..Tent 1072 {0x0026FA, 0x0026FA}, 1073 1074 // Fuel Pump ..Fuel Pump 1075 {0x0026FD, 0x0026FD}, 1076 1077 // White Heavy Check Mark ..White Heavy Check Mark 1078 {0x002705, 0x002705}, 1079 1080 // Raised Fist ..Raised Hand 1081 {0x00270A, 0x00270B}, 1082 1083 // Sparkles ..Sparkles 1084 {0x002728, 0x002728}, 1085 1086 // Cross Mark ..Cross Mark 1087 {0x00274C, 0x00274C}, 1088 1089 // Negative Squared Cross M..Negative Squared Cross M 1090 {0x00274E, 0x00274E}, 1091 1092 // Black Question Mark Orna..White Exclamation Mark O 1093 {0x002753, 0x002755}, 1094 1095 // Heavy Exclamation Mark S..Heavy Exclamation Mark S 1096 {0x002757, 0x002757}, 1097 1098 // Heavy Plus Sign ..Heavy Division Sign 1099 {0x002795, 0x002797}, 1100 1101 // Curly Loop ..Curly Loop 1102 {0x0027B0, 0x0027B0}, 1103 1104 // Double Curly Loop ..Double Curly Loop 1105 {0x0027BF, 0x0027BF}, 1106 1107 // Black Large Square ..White Large Square 1108 {0x002B1B, 0x002B1C}, 1109 1110 // White Medium Star ..White Medium Star 1111 {0x002B50, 0x002B50}, 1112 1113 // Heavy Large Circle ..Heavy Large Circle 1114 {0x002B55, 0x002B55}, 1115 1116 // Cjk Radical Repeat ..Cjk Radical Rap 1117 {0x002E80, 0x002E99}, 1118 1119 // Cjk Radical Choke ..Cjk Radical C-simplified 1120 {0x002E9B, 0x002EF3}, 1121 1122 // Kangxi Radical One ..Kangxi Radical Flute 1123 {0x002F00, 0x002FD5}, 1124 1125 // Ideographic Description ..Ideographic Description 1126 {0x002FF0, 0x002FFB}, 1127 1128 // Ideographic Space ..Ideographic Variation In 1129 {0x003000, 0x00303E}, 1130 1131 // Hiragana Letter Small A ..Hiragana Letter Small Ke 1132 {0x003041, 0x003096}, 1133 1134 // Combining Katakana-hirag..Katakana Digraph Koto 1135 {0x003099, 0x0030FF}, 1136 1137 // Bopomofo Letter B ..Bopomofo Letter Nn 1138 {0x003105, 0x00312F}, 1139 1140 // Hangul Letter Kiyeok ..Hangul Letter Araeae 1141 {0x003131, 0x00318E}, 1142 1143 // Ideographic Annotation L..Cjk Stroke Q 1144 {0x003190, 0x0031E3}, 1145 1146 // Katakana Letter Small Ku..Parenthesized Korean Cha 1147 {0x0031F0, 0x00321E}, 1148 1149 // Parenthesized Ideograph ..Circled Ideograph Koto 1150 {0x003220, 0x003247}, 1151 1152 // Partnership Sign ..(nil) 1153 {0x003250, 0x004DBF}, 1154 1155 // Cjk Unified Ideograph-4e..Yi Syllable Yyr 1156 {0x004E00, 0x00A48C}, 1157 1158 // Yi Radical Qot ..Yi Radical Ke 1159 {0x00A490, 0x00A4C6}, 1160 1161 // Hangul Choseong Tikeut-m..Hangul Choseong Ssangyeo 1162 {0x00A960, 0x00A97C}, 1163 1164 // Hangul Syllable Ga ..Hangul Syllable Hih 1165 {0x00AC00, 0x00D7A3}, 1166 1167 // Cjk Compatibility Ideogr..(nil) 1168 {0x00F900, 0x00FAFF}, 1169 1170 // Presentation Form For Ve..Presentation Form For Ve 1171 {0x00FE10, 0x00FE19}, 1172 1173 // Presentation Form For Ve..Small Full Stop 1174 {0x00FE30, 0x00FE52}, 1175 1176 // Small Semicolon ..Small Equals Sign 1177 {0x00FE54, 0x00FE66}, 1178 1179 // Small Reverse Solidus ..Small Commercial At 1180 {0x00FE68, 0x00FE6B}, 1181 1182 // Fullwidth Exclamation Ma..Fullwidth Right White Pa 1183 {0x00FF01, 0x00FF60}, 1184 1185 // Fullwidth Cent Sign ..Fullwidth Won Sign 1186 {0x00FFE0, 0x00FFE6}, 1187 1188 // Tangut Iteration Mark ..(nil) 1189 {0x016FE0, 0x016FE4}, 1190 1191 // (nil) ..(nil) 1192 {0x016FF0, 0x016FF1}, 1193 1194 // (nil) ..(nil) 1195 {0x017000, 0x0187F7}, 1196 1197 // Tangut Component-001 ..(nil) 1198 {0x018800, 0x018CD5}, 1199 1200 // (nil) ..(nil) 1201 {0x018D00, 0x018D08}, 1202 1203 // Katakana Letter Archaic ..Hentaigana Letter N-mu-m 1204 {0x01B000, 0x01B11E}, 1205 1206 // Hiragana Letter Small Wi..Hiragana Letter Small Wo 1207 {0x01B150, 0x01B152}, 1208 1209 // Katakana Letter Small Wi..Katakana Letter Small N 1210 {0x01B164, 0x01B167}, 1211 1212 // Nushu Character-1b170 ..Nushu Character-1b2fb 1213 {0x01B170, 0x01B2FB}, 1214 1215 // Mahjong Tile Red Dragon ..Mahjong Tile Red Dragon 1216 {0x01F004, 0x01F004}, 1217 1218 // Playing Card Black Joker..Playing Card Black Joker 1219 {0x01F0CF, 0x01F0CF}, 1220 1221 // Negative Squared Ab ..Negative Squared Ab 1222 {0x01F18E, 0x01F18E}, 1223 1224 // Squared Cl ..Squared Vs 1225 {0x01F191, 0x01F19A}, 1226 1227 // Square Hiragana Hoka ..Squared Katakana Sa 1228 {0x01F200, 0x01F202}, 1229 1230 // Squared Cjk Unified Ideo..Squared Cjk Unified Ideo 1231 {0x01F210, 0x01F23B}, 1232 1233 // Tortoise Shell Bracketed..Tortoise Shell Bracketed 1234 {0x01F240, 0x01F248}, 1235 1236 // Circled Ideograph Advant..Circled Ideograph Accept 1237 {0x01F250, 0x01F251}, 1238 1239 // Rounded Symbol For Fu ..Rounded Symbol For Cai 1240 {0x01F260, 0x01F265}, 1241 1242 // Cyclone ..Shooting Star 1243 {0x01F300, 0x01F320}, 1244 1245 // Hot Dog ..Cactus 1246 {0x01F32D, 0x01F335}, 1247 1248 // Tulip ..Baby Bottle 1249 {0x01F337, 0x01F37C}, 1250 1251 // Bottle With Popping Cork..Graduation Cap 1252 {0x01F37E, 0x01F393}, 1253 1254 // Carousel Horse ..Swimmer 1255 {0x01F3A0, 0x01F3CA}, 1256 1257 // Cricket Bat And Ball ..Table Tennis Paddle And 1258 {0x01F3CF, 0x01F3D3}, 1259 1260 // House Building ..European Castle 1261 {0x01F3E0, 0x01F3F0}, 1262 1263 // Waving Black Flag ..Waving Black Flag 1264 {0x01F3F4, 0x01F3F4}, 1265 1266 // Badminton Racquet And Sh..Paw Prints 1267 {0x01F3F8, 0x01F43E}, 1268 1269 // Eyes ..Eyes 1270 {0x01F440, 0x01F440}, 1271 1272 // Ear ..Videocassette 1273 {0x01F442, 0x01F4FC}, 1274 1275 // Prayer Beads ..Down-pointing Small Red 1276 {0x01F4FF, 0x01F53D}, 1277 1278 // Kaaba ..Menorah With Nine Branch 1279 {0x01F54B, 0x01F54E}, 1280 1281 // Clock Face One Oclock ..Clock Face Twelve-thirty 1282 {0x01F550, 0x01F567}, 1283 1284 // Man Dancing ..Man Dancing 1285 {0x01F57A, 0x01F57A}, 1286 1287 // Reversed Hand With Middl..Raised Hand With Part Be 1288 {0x01F595, 0x01F596}, 1289 1290 // Black Heart ..Black Heart 1291 {0x01F5A4, 0x01F5A4}, 1292 1293 // Mount Fuji ..Person With Folded Hands 1294 {0x01F5FB, 0x01F64F}, 1295 1296 // Rocket ..Left Luggage 1297 {0x01F680, 0x01F6C5}, 1298 1299 // Sleeping Accommodation ..Sleeping Accommodation 1300 {0x01F6CC, 0x01F6CC}, 1301 1302 // Place Of Worship ..Shopping Trolley 1303 {0x01F6D0, 0x01F6D2}, 1304 1305 // Hindu Temple ..(nil) 1306 {0x01F6D5, 0x01F6D7}, 1307 1308 // Airplane Departure ..Airplane Arriving 1309 {0x01F6EB, 0x01F6EC}, 1310 1311 // Scooter ..(nil) 1312 {0x01F6F4, 0x01F6FC}, 1313 1314 // Large Orange Circle ..Large Brown Square 1315 {0x01F7E0, 0x01F7EB}, 1316 1317 // (nil) ..Fencer 1318 {0x01F90C, 0x01F93A}, 1319 1320 // Wrestlers ..Goal Net 1321 {0x01F93C, 0x01F945}, 1322 1323 // First Place Medal ..(nil) 1324 {0x01F947, 0x01F978}, 1325 1326 // Face With Pleading Eyes ..(nil) 1327 {0x01F97A, 0x01F9CB}, 1328 1329 // Standing Person ..Nazar Amulet 1330 {0x01F9CD, 0x01F9FF}, 1331 1332 // Ballet Shoes ..(nil) 1333 {0x01FA70, 0x01FA74}, 1334 1335 // Drop Of Blood ..Stethoscope 1336 {0x01FA78, 0x01FA7A}, 1337 1338 // Yo-yo ..(nil) 1339 {0x01FA80, 0x01FA86}, 1340 1341 // Ringed Planet ..(nil) 1342 {0x01FA90, 0x01FAA8}, 1343 1344 // (nil) ..(nil) 1345 {0x01FAB0, 0x01FAB6}, 1346 1347 // (nil) ..(nil) 1348 {0x01FAC0, 0x01FAC2}, 1349 1350 // (nil) ..(nil) 1351 {0x01FAD0, 0x01FAD6}, 1352 1353 // Cjk Unified Ideograph-20..(nil) 1354 {0x020000, 0x02FFFD}, 1355 1356 // (nil) ..(nil) 1357 {0x030000, 0x03FFFD}, 1358 ]; 1359 1360 pure nothrow @safe @nogc @live 1361 private bool intable(immutable ref .width_interval[] table, size_t table_length, uint c) 1362 1363 do 1364 { 1365 // First quick check for Latin1 etc. characters. 1366 if (c < table[0].start) { 1367 return false; 1368 } 1369 1370 // Binary search in table. 1371 size_t bot = 0; 1372 size_t top = table_length - 1; 1373 1374 while (top >= bot) { 1375 size_t mid = (bot + top) / 2; 1376 1377 if (table[mid].end < c) { 1378 bot = mid + 1; 1379 } else if (table[mid].start > c) { 1380 top = mid - 1; 1381 } else { 1382 return true; 1383 } 1384 } 1385 1386 return false; 1387 } 1388 1389 /// 1390 extern (C) 1391 pure nothrow @safe @nogc @live 1392 public int wcwidth(uint ucs) 1393 1394 out(result) 1395 { 1396 assert(result >= -1); 1397 assert(result <= 2); 1398 } 1399 1400 do 1401 { 1402 /* 1403 * NOTE: created by hand, there isn't anything identifiable other than 1404 * general Cf category code to identify these, and some characters in Cf 1405 * category code are of non-zero width. 1406 */ 1407 if ((ucs == 0) || (ucs == 0x034F) || ((0x200B <= ucs) && (ucs <= 0x200F)) || (ucs == 0x2028) || (ucs == 0x2029) || ((0x202A <= ucs) && (ucs <= 0x202E)) || ((0x2060 <= ucs) && (ucs <= 0x2063))) { 1408 return 0; 1409 } 1410 1411 // C0/C1 control characters. 1412 if ((ucs < 32) || ((0x007F <= ucs) && (ucs < 0x00A0))) { 1413 return -1; 1414 } 1415 1416 // Combining characters with zero width. 1417 if (.intable(.ZERO_WIDTH, .ZERO_WIDTH.length, ucs)) { 1418 return 0; 1419 } 1420 1421 return (.intable(.WIDE_EASTASIAN, .WIDE_EASTASIAN.length, ucs)) ? (2) : (1); 1422 } 1423 1424 unittest 1425 { 1426 assert(.wcwidth(cast(uint)('a')) == 1); 1427 assert(.wcwidth(cast(uint)('ö')) == 1); 1428 1429 // Some wide: 1430 assert(.wcwidth(cast(uint)('A')) == 2); 1431 assert(.wcwidth(cast(uint)('B')) == 2); 1432 assert(.wcwidth(cast(uint)('C')) == 2); 1433 assert(.wcwidth(cast(uint)('中')) == 2); 1434 assert(.wcwidth(cast(uint)('文')) == 2); 1435 assert(.wcwidth(cast(uint)(0x679C)) == 2); 1436 assert(.wcwidth(cast(uint)(0x679D)) == 2); 1437 assert(.wcwidth(cast(uint)(0x02070E)) == 2); 1438 assert(.wcwidth(cast(uint)(0x020731)) == 2); 1439 1440 assert(.wcwidth(cast(uint)(0x11A3)) == 1); 1441 1442 // Koala emoji. 1443 assert(.wcwidth(cast(uint)(0x01F428)) == 2); 1444 1445 // Watch emoji. 1446 assert(.wcwidth(cast(uint)(0x231A)) == 2); 1447 }