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 }