--- /386/include/u.h Fri Apr 13 02:41:24 2007 +++ /386/include/u.h Tue Apr 30 22:01:39 2013 @@ -8,7 +8,7 @@ typedef unsigned long long uvlong; typedef unsigned long uintptr; typedef unsigned long usize; -typedef ushort Rune; +typedef uint Rune; typedef union FPdbleword FPdbleword; typedef long jmp_buf[2]; #define JMPBUFSP 0 --- /amd64/include/u.h Mon Sep 17 20:52:58 2012 +++ /amd64/include/u.h Tue Apr 30 22:01:39 2013 @@ -8,7 +8,7 @@ typedef unsigned long long uvlong; typedef unsigned long long uintptr; typedef unsigned long usize; -typedef ushort Rune; +typedef uint Rune; typedef union FPdbleword FPdbleword; typedef uintptr jmp_buf[2]; #define JMPBUFSP 0 --- /arm/include/u.h Tue Mar 27 19:48:58 2012 +++ /arm/include/u.h Tue Apr 30 22:01:39 2013 @@ -9,7 +9,7 @@ typedef unsigned long long uvlong; typedef unsigned long uintptr; typedef unsigned long usize; -typedef ushort Rune; +typedef uint Rune; typedef union FPdbleword FPdbleword; typedef long jmp_buf[2]; #define JMPBUFSP 0 --- /lib/unicode.notice Tue May 16 21:13:06 2000 +++ /lib/unicode.notice Fri Apr 26 00:53:05 2013 @@ -1,5 +1,4 @@ -The version of /lib/unicode is from Unicode 2.0. Unicode 3.0 -is now available, but has not been integrated into Plan 9. +The version of /lib/unicode is from Unicode 2.0, so it's somewhat dated. The Unicode Character Database is provided as is by Unicode, Inc. No claims are made as to fitness for any particular purpose. No warranties of any kind are --- /mips/include/u.h Fri Apr 13 02:41:25 2007 +++ /mips/include/u.h Tue Apr 30 22:01:39 2013 @@ -8,7 +8,7 @@ typedef unsigned long long uvlong; typedef unsigned long uintptr; typedef unsigned long usize; -typedef ushort Rune; +typedef uint Rune; typedef union FPdbleword FPdbleword; typedef long jmp_buf[2]; #define JMPBUFSP 0 --- /power/include/u.h Tue Jul 7 23:20:57 2009 +++ /power/include/u.h Tue Apr 30 22:01:39 2013 @@ -8,7 +8,7 @@ typedef unsigned long long uvlong; typedef unsigned long uintptr; typedef unsigned long usize; -typedef ushort Rune; +typedef uint Rune; typedef union FPdbleword FPdbleword; typedef long jmp_buf[2]; #define JMPBUFSP 0 --- /power64/include/u.h Fri May 11 16:01:09 2007 +++ /power64/include/u.h Tue Apr 30 22:01:39 2013 @@ -8,7 +8,7 @@ typedef unsigned long long uvlong; typedef unsigned long long uintptr; typedef unsigned long usize; -typedef ushort Rune; +typedef uint Rune; typedef union FPdbleword FPdbleword; typedef uintptr jmp_buf[2]; #define JMPBUFSP 0 --- /sparc/include/u.h Fri Apr 13 02:41:25 2007 +++ /sparc/include/u.h Tue Apr 30 22:01:39 2013 @@ -8,7 +8,7 @@ typedef unsigned long long uvlong; typedef unsigned long uintptr; typedef unsigned long usize; -typedef ushort Rune; +typedef uint Rune; typedef union FPdbleword FPdbleword; typedef long jmp_buf[2]; #define JMPBUFSP 0 --- /sys/include/ape/limits.h Sat Mar 2 00:42:33 2013 +++ /sys/include/ape/limits.h Tue Apr 30 22:03:37 2013 @@ -3,7 +3,7 @@ /* 8 bit chars (signed), 16 bit shorts, 32 bit ints/longs */ #define CHAR_BIT 8 -#define MB_LEN_MAX 3 +#define MB_LEN_MAX 4 #define UCHAR_MAX 0xff #define USHRT_MAX 0xffff --- /sys/include/ape/stdlib.h Mon Nov 25 16:18:56 2002 +++ /sys/include/ape/stdlib.h Tue Apr 30 22:03:37 2013 @@ -6,7 +6,7 @@ #define EXIT_FAILURE 1 #define EXIT_SUCCESS 0 -#define MB_CUR_MAX 3 +#define MB_CUR_MAX 4 #define RAND_MAX 32767 typedef struct { int quot, rem; } div_t; --- /sys/include/ape/u.h Thu Apr 27 02:29:43 2006 +++ /sys/include/ape/u.h Tue Apr 30 22:03:37 2013 @@ -12,7 +12,7 @@ typedef signed char schar; typedef long long vlong; typedef unsigned long long uvlong; -typedef ushort Rune; +typedef unsigned int Rune; typedef union FPdbleword FPdbleword; typedef char* p9va_list; --- /sys/include/ape/utf.h Tue Dec 2 02:09:19 2003 +++ /sys/include/ape/utf.h Tue Apr 30 22:03:37 2013 @@ -7,14 +7,15 @@ extern "C" { #endif -typedef unsigned short Rune; /* 16 bits */ +typedef unsigned int Rune; /* 32 bits */ enum { - UTFmax = 3, /* maximum bytes per rune */ + UTFmax = 4, /* maximum bytes per rune */ Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ Runeself = 0x80, /* rune and UTF sequences are the same (<) */ - Runeerror = 0x80, /* decoding error in UTF */ + Runeerror = 0xFFFD, /* decoding error in UTF */ + Runemax = 0x10FFFF, /* 21-bit rune */ }; /* --- /sys/include/bio.h Thu Feb 28 21:44:22 2002 +++ /sys/include/bio.h Tue Apr 30 22:04:42 2013 @@ -7,7 +7,7 @@ enum { Bsize = 8*1024, - Bungetsize = 4, /* space for ungetc */ + Bungetsize = UTFmax+1, /* space for ungetc */ Bmagic = 0x314159, Beof = -1, Bbad = -2, --- /sys/include/libc.h Fri Apr 12 22:13:19 2013 +++ /sys/include/libc.h Wed May 1 00:18:56 2013 @@ -41,12 +41,12 @@ enum { - UTFmax = 3, /* maximum bytes per rune */ + UTFmax = 4, /* maximum bytes per rune */ Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ Runeself = 0x80, /* rune and UTF sequences are the same (<) */ Runeerror = 0xFFFD, /* decoding error in UTF */ - Runemax = 0xFFFF, /* largest 16-bit character */ - Runemask = 0xFFFF, /* bits used by runes (see grep) */ + Runemax = 0x10FFFF, /* 21-bit rune */ + Runemask = 0x1FFFFF, /* bits used by runes (see grep) */ }; /* @@ -80,12 +80,14 @@ extern Rune tolowerrune(Rune); extern Rune totitlerune(Rune); extern Rune toupperrune(Rune); +extern Rune tobaserune(Rune); extern int isalpharune(Rune); +extern int isbaserune(Rune); +extern int isdigitrune(Rune); extern int islowerrune(Rune); extern int isspacerune(Rune); extern int istitlerune(Rune); extern int isupperrune(Rune); -extern int isdigitrune(Rune); /* * malloc --- /sys/lib/dist/setup Fri Feb 1 20:41:17 2013 +++ /sys/lib/dist/setup Tue Apr 30 22:05:56 2013 @@ -16,7 +16,6 @@ echo import web.protect failed: $dist/web.protect/plan9.iso missing \ >[1=2] - 9fs outfsother bind /n/outfsother/web.protect $dist/web.protect # HACK if (! test -e $dist/web.protect/plan9.iso) { echo bind outfsother failed: $dist/web.protect/plan9.iso \ --- /sys/man/1/sort Mon Dec 3 00:42:13 2007 +++ /sys/man/1/sort Thu Apr 25 01:43:02 2013 @@ -256,7 +256,5 @@ less than a longer field. .PP Some of the options, e.g. -.B -i -and .BR -M , are hopelessly provincial. --- /sys/man/1/tr Mon Dec 3 00:42:16 2007 +++ /sys/man/1/tr Tue Apr 30 22:05:23 2013 @@ -62,9 +62,9 @@ value is given by those digits. The character sequence .L \ex -followed by 1, 2, 3, or 4 hexadecimal digits stands +followed by 1 to 6 hexadecimal digits stands for the character whose -16-bit value is given by those digits. +21-bit value is given by those digits. A .L \e followed by any other character stands --- /sys/man/2/bio Mon Nov 2 20:05:42 2009 +++ /sys/man/2/bio Tue Apr 30 22:05:23 2013 @@ -257,7 +257,7 @@ calls .I Bputc to output the low order -16 bits of +21 bits of .I c as a rune in --- /sys/man/2/isalpharune Wed Mar 9 19:53:13 2011 +++ /sys/man/2/isalpharune Thu Apr 25 00:56:10 2013 @@ -1,6 +1,6 @@ .TH ISALPHARUNE 2 .SH NAME -isalpharune, islowerrune, isspacerune, istitlerune, isupperrune, isdigitrune, tolowerrune, totitlerune, toupperrune \- Unicode character classes and cases +isalpharune, isbaserune, islowerrune, isspacerune, istitlerune, isupperrune, isdigitrune, tobaserune, tolowerrune, totitlerune, toupperrune \- Unicode character classes and cases .SH SYNOPSIS .B #include .br @@ -10,6 +10,9 @@ int isalpharune(Rune c) .PP .B +int isbaserune(Rune c) +.PP +.B int islowerrune(Rune c) .PP .B @@ -23,6 +26,9 @@ .PP .B int isdigitrune(Rune c) +.PP +.B +Rune tobaserune(Rune c) .PP .B Rune tolowerrune(Rune c) --- /sys/man/2/rune Mon Dec 3 00:42:18 2007 +++ /sys/man/2/rune Tue Apr 30 22:05:23 2013 @@ -54,7 +54,7 @@ and returns the number of bytes copied. .BR UTFmax , defined as -.B 3 +.B 4 in .BR , is the maximum number of bytes required to represent a rune. --- /sys/man/3/cons Tue Mar 27 20:56:35 2012 +++ /sys/man/3/cons Tue Apr 30 22:05:23 2013 @@ -51,7 +51,7 @@ the previous non-kill, non-erase character from the input buffer. Killing and erasing only delete characters back to, but not including, the last newline. -Characters typed at the keyboard actually produce 16-bit runes (see +Characters typed at the keyboard actually produce 21-bit runes (see .IR utf (6)), but the runes are translated into the variable-length .SM UTF --- /sys/man/6/keyboard Mon Dec 3 00:42:25 2007 +++ /sys/man/6/keyboard Thu Apr 25 01:50:16 2013 @@ -69,7 +69,7 @@ .PP Characters in Plan 9 are runes (see .IR utf (6)). -Any 16-bit rune can be typed using a compose key followed by several +Any rune can be typed using a compose key followed by several other keys. The compose key is also generally near the lower right of the main key area: the @@ -89,8 +89,15 @@ .L a to .LR f ) -to type a single rune with the value represented by +to type a single two-byte rune with the value represented by the typed number. +Type a lower case +.L x +and exactly +.I UTFmax*2 +hexadecimal characters to type a single +.I UTFmax +bytes rune. There are shorthands for many characters, comprising the compose key followed by a two- or three-character sequence. There are several rules guiding the design of the sequences, as --- /sys/man/6/utf Mon Dec 3 00:42:25 2007 +++ /sys/man/6/utf Tue Apr 30 22:05:23 2013 @@ -7,7 +7,7 @@ .SM UTF-8 encoding (Universal Character Set Transformation Format, 8 bits wide). -The Unicode Standard represents its characters in 16 +The Unicode Standard represents its characters in 21 bits; .SM UTF-8 represents such @@ -19,7 +19,7 @@ .PP In Plan 9, a .I rune -is a 16-bit quantity representing a Unicode character. +is a 21-bit quantity representing a Unicode character. Internally, programs may store characters as runes. However, any external manifestation of textual information, in files or at the interface between programs, uses a @@ -65,19 +65,21 @@ sequence as follows: .PP -01. x in [00000000.0bbbbbbb] → 0bbbbbbb +01. x in [000000.00000000.0bbbbbbb] → 0bbbbbbb .br -10. x in [00000bbb.bbbbbbbb] → 110bbbbb, 10bbbbbb +10. x in [000000.00000bbb.bbbbbbbb] → 110bbbbb, 10bbbbbb .br -11. x in [bbbbbbbb.bbbbbbbb] → 1110bbbb, 10bbbbbb, 10bbbbbb +11. x in [000000.bbbbbbbb.bbbbbbbb] → 1110bbbb, 10bbbbbb, 10bbbbbb +.br +100. x in [bbbbbb.bbbbbbbb.bbbbbbbb] → 1110bbbb, 10bbbbbb, 10bbbbbb, 10bbbbbb .br .PP Conversion 01 provides a one-byte sequence that spans the .SM ASCII character set in a compatible way. -Conversions 10 and 11 represent higher-valued characters -as sequences of two or three bytes with the high bit set. -Plan 9 does not support the 4, 5, and 6 byte sequences proposed by X-Open. +Conversions 10, 11 and 100 represent higher-valued characters +as sequences of two, three or four bytes with the high bit set. +Plan 9 does not support the 5 and 6 byte sequences proposed by X-Open. When there are multiple ways to encode a value, for example rune 0, the shortest encoding is used. .PP --- /sys/man/7/dict Mon Dec 3 00:42:25 2007 +++ /sys/man/7/dict Thu Apr 25 01:02:07 2013 @@ -55,7 +55,7 @@ to form a `match set'. By default, both patterns and the index are folded: upper case characters are mapped into their lower case equivalents, -and Latin accented characters are mapped into their non-accented +and accented characters are mapped into their base equivalents. In interactive mode, there is always a `current match set' and a `current entry' within the match set. --- /sys/src/9/ip/ip.h Wed Nov 25 05:19:33 2009 +++ /sys/src/9/ip/ip.h Tue Apr 30 05:58:57 2013 @@ -38,7 +38,7 @@ Addrlen= 64, Maxproto= 20, Nhash= 64, - Maxincall= 10, + Maxincall= 32, /* max. conn.s in listen q not accepted yet */ Nchans= 1024, MAClen= 16, /* longest mac address */ --- /sys/src/9/omap/devether.c Tue May 4 20:07:27 2010 +++ /sys/src/9/omap/devether.c Mon Apr 29 22:02:51 2013 @@ -381,7 +381,7 @@ continue; if(isaconfig("ether", ctlrno, ether) == 0){ - free(ether); +// free(ether); // return nil; continue; } --- /sys/src/9/pc/uartpci.c Wed Jun 22 01:51:06 2011 +++ /sys/src/9/pc/uartpci.c Sat Apr 27 00:47:56 2013 @@ -42,6 +42,8 @@ kstrdup(&uart->name, buf); uart->freq = freq; uart->phys = &i8250physuart; + /* print("#t: %s port %#x freq %,ldHz irq %d\n", + uart->name, io - iosize, uart->freq, p->intl); /**/ if(uart != head) (uart-1)->next = uart; uart++; @@ -101,7 +103,8 @@ perlehead = perletail = nil; ctlrno = 0; for(p = pcimatch(nil, 0, 0); p != nil; p = pcimatch(p, 0, 0)){ - if(p->ccrb != Pcibccomm || p->ccru > 2) + /* StarTech PCI8S9503V has ccru == 0x80 (other) */ + if(p->ccrb != Pcibccomm || p->ccru > 2 && p->ccru != 0x80) continue; switch(p->did<<16 | p->vid){ @@ -167,7 +170,15 @@ freq = 7372800; switch(subid){ default: + print("uartpci: unknown perle subid %#ux\n", + subid); continue; + case (0x1588<<16)|0x10B5: /* StarTech PCI8S9503V (P588UG) */ + name = "P588UG"; + /* max. baud rate is 921,600 */ + freq = 1843200; + uart = uartpci(ctlrno, p, 2, 8, freq, name, 8); + break; case (0x0011<<16)|0x12E0: /* Perle PCI-Fast16 */ name = "PCI-Fast16"; uart = uartpci(ctlrno, p, 2, 16, freq, name, 8); --- /sys/src/9/port/latin1.c Mon Mar 4 22:45:39 2002 +++ /sys/src/9/port/latin1.c Tue Apr 30 22:05:23 2013 @@ -1,5 +1,5 @@ -#include - +#include "u.h" +#include "../port/lib.h" /* * The code makes two assumptions: strlen(ld) is 1 or 2; latintab[i].ld can be a * prefix of latintab[j].ld only when j=5) - return unicode(k); + return unicode(k, 5); else return -5; + if(k[0] == 'x') + if(n>=UTFmax*2+1) + return unicode(k, UTFmax*2+1); + else + return -(UTFmax+1); for(l=latintab; l->ld!=0; l++) if(k[0] == l->ld[0]){ if(n == 1) --- /sys/src/9/port/lib.h Tue Oct 5 00:16:43 2010 +++ /sys/src/9/port/lib.h Tue Apr 30 22:05:24 2013 @@ -35,10 +35,12 @@ enum { - UTFmax = 3, /* maximum bytes per rune */ - Runesync = 0x80, /* cannot represent part of a UTF sequence */ - Runeself = 0x80, /* rune and UTF sequences are the same (<) */ - Runeerror = 0x80, /* decoding error in UTF */ + UTFmax = 4, /* maximum bytes per rune */ + Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ + Runeself = 0x80, /* rune and UTF sequences are the same (<) */ + Runeerror = 0xFFFD, /* decoding error in UTF */ + Runemax = 0x10FFFF, /* 24 bit rune */ + Runemask = 0x1FFFFF, /* bits used by runes (see grep) */ }; /* --- /sys/src/9/teg2/devether.c Fri Feb 10 23:04:51 2012 +++ /sys/src/9/teg2/devether.c Mon Apr 29 22:02:51 2013 @@ -379,7 +379,7 @@ continue; if(isaconfig("ether", ctlrno, ether) == 0){ - free(ether); +// free(ether); // return nil; continue; } --- /sys/src/ape/lib/ap/gen/mbwc.c Thu Feb 28 19:46:27 2002 +++ /sys/src/ape/lib/ap/gen/mbwc.c Tue Apr 30 22:05:24 2013 @@ -1,4 +1,5 @@ #include +#include /* * Use the FSS-UTF transformation proposed by posix. @@ -7,67 +8,80 @@ * Tx 10xxxxxx 6 free bits * T1 110xxxxx 5 free bits * T2 1110xxxx 4 free bits + * T3 11110xxx 3 free bits + * T4 111110xx 2 free bits + * T5 1111110x 1 free bit * * Encoding is as follows. * From hex Thru hex Sequence Bits - * 00000000 0000007F T0 7 + * 00000000 0000007F T0 7 * 00000080 000007FF T1 Tx 11 - * 00000800 0000FFFF T2 Tx Tx 16 + * 00000800 0000FFFF T2 Tx Tx 16 + * 00010000 001FFFFF T3 Tx Tx Tx 21 + * 00200000 03FFFFFF T4 Tx Tx Tx Tx 26 + * 04000000 7FFFFFFF T5 Tx Tx Tx Tx Tx 31 */ +int +mbtowc(wchar_t *pwc, const char *s, size_t n); int mblen(const char *s, size_t n) { - return mbtowc(0, s, n); } +enum { + C0MSK = 0x7F, + C1MSK = 0x7FF, + T1 = 0xC0, + T2 = 0xE0, + NT1BITS = 11, + NSHFT = 5, + NCSHFT = NSHFT + 1, + WCHARMSK = (1<< (8*MB_LEN_MAX - 1)) - 1, +}; + int mbtowc(wchar_t *pwc, const char *s, size_t n) { - int c, c1, c2; - long l; + unsigned long long c[MB_LEN_MAX]; + unsigned long long l, m, wm, b; + int i; if(!s) return 0; if(n < 1) goto bad; - c = s[0] & 0xff; - if((c & 0x80) == 0x00) { + + c[0] = s[0] & 0xff; /* first one is special */ + if((c[0] & 0x80) == 0x00) { if(pwc) - *pwc = c; - if(c == 0) + *pwc = c[0]; + if(c[0] == 0) return 0; return 1; } - if(n < 2) - goto bad; - c1 = (s[1] ^ 0x80) & 0xff; - if((c1 & 0xC0) != 0x00) - goto bad; - if((c & 0xE0) == 0xC0) { - l = ((c << 6) | c1) & 0x7FF; - if(l < 0x080) + m = T2; + b = m^0x20; + l = c[0]; + wm = C1MSK; + for(i = 1; i < MB_LEN_MAX + 1; i++){ + if(n < i+1) goto bad; - if(pwc) - *pwc = l; - return 2; - } - - if(n < 3) - goto bad; - c2 = (s[2] ^ 0x80) & 0xff; - if((c2 & 0xC0) != 0x00) - goto bad; - if((c & 0xF0) == 0xE0) { - l = ((((c << 6) | c1) << 6) | c2) & 0xFFFF; - if(l < 0x0800) + c[i] = (s[i] ^ 0x80) & 0xff; + l = (l << NCSHFT) | c[i]; + if((c[i] & 0xC0) != 0x00) goto bad; - if(pwc) - *pwc = l; - return 3; + if((c[0] & m) == b) { + if(pwc) + *pwc = l & wm; + return i + 1; + } + b = m; + m = (m >> 1) | 0x80; + wm = (wm << NSHFT) | wm; } /* @@ -81,27 +95,32 @@ int wctomb(char *s, wchar_t wchar) { - long c; + unsigned long long c, maxc, m; + int i, j; if(!s) return 0; - c = wchar & 0xFFFF; - if(c < 0x80) { + maxc = 0x80; + c = wchar & WCHARMSK; + if(c < maxc) { s[0] = c; return 1; } - if(c < 0x800) { - s[0] = 0xC0 | (c >> 6); - s[1] = 0x80 | (c & 0x3F); - return 2; + m = T1; + for(i = 2; i < MB_LEN_MAX + 1; i++){ + maxc <<= 4; + if(c < maxc || i == MB_LEN_MAX){ + s[0] = m | (c >> ((i - 1) * NCSHFT)); + for(j = i - 1; j >= 1; j--){ + s[i - j] = 0x80|((c>>(6 * (j - 1)))&0x3f); + } + return i; + } + m = (m >> 1) | 0x80; } - - s[0] = 0xE0 | (c >> 12); - s[1] = 0x80 | ((c >> 6) & 0x3F); - s[2] = 0x80 | (c & 0x3F); - return 3; + return MB_LEN_MAX; } size_t @@ -117,7 +136,7 @@ break; s++; } else { - d = mbtowc(pwcs, s, 3); + d = mbtowc(pwcs, s, MB_LEN_MAX); if(d <= 0) return (size_t)((d<0) ? -1 : i); s += d; @@ -133,10 +152,10 @@ int i, d; long c; char *p, *pe; - char buf[3]; + char buf[MB_LEN_MAX]; p = s; - pe = p+n-3; + pe = p+n-MB_LEN_MAX; while(p < pe) { c = *pwcs++; if(c < 0x80) @@ -146,15 +165,15 @@ if(c == 0) return p-s; } - while(p < pe+3) { + while(p < pe+MB_LEN_MAX) { c = *pwcs++; d = wctomb(buf, c); - if(p+d <= pe+3) { - *p++ = buf[0]; - if(d > 1) { - *p++ = buf[2]; - if(d > 2) - *p++ = buf[3]; + if(p+d <= pe+MB_LEN_MAX) { + *p++ = buf[0]; /* first one is special */ + for(i = 2; i < MB_LEN_MAX + 1; i++){ + if(d <= i -1) + break; + *p++ = buf[i]; } } if(c == 0) @@ -162,4 +181,3 @@ } return p-s; } - --- /sys/src/ape/lib/ap/plan9/frexp.c Thu Feb 28 19:46:25 2002 +++ /sys/src/ape/lib/ap/plan9/frexp.c Thu Apr 25 01:03:56 2013 @@ -6,6 +6,7 @@ #define MASK 0x7ffL #define SHIFT 20 #define BIAS 1022L +#define SIG 52 typedef union { @@ -25,13 +26,18 @@ double frexp(double d, int *ep) { - Cheat x; + Cheat x, a; - if(d == 0) { - *ep = 0; - return 0; - } + *ep = 0; + /* order matters: only isNaN can operate on NaN */ + if(isNaN(d) || isInf(d, 0) || d == 0) + return d; x.d = d; + a.d = fabs(d); + if((a.ms >> SHIFT) == 0){ /* normalize subnormal numbers */ + x.d = (double)(1ULL<> SHIFT) & MASK) - BIAS; x.ms &= ~(MASK << SHIFT); x.ms |= BIAS << SHIFT; --- /sys/src/ape/lib/utf/rune.c Tue Dec 2 02:04:50 2003 +++ /sys/src/ape/lib/utf/rune.c Tue Apr 30 22:05:24 2013 @@ -23,27 +23,33 @@ Bit2 = 5, Bit3 = 4, Bit4 = 3, + Bit5 = 2, T1 = ((1<<(Bit1+1))-1) ^ 0xFF, /* 0000 0000 */ Tx = ((1<<(Bitx+1))-1) ^ 0xFF, /* 1000 0000 */ T2 = ((1<<(Bit2+1))-1) ^ 0xFF, /* 1100 0000 */ T3 = ((1<<(Bit3+1))-1) ^ 0xFF, /* 1110 0000 */ T4 = ((1<<(Bit4+1))-1) ^ 0xFF, /* 1111 0000 */ + T5 = ((1<<(Bit5+1))-1) ^ 0xFF, /* 1111 1000 */ - Rune1 = (1<<(Bit1+0*Bitx))-1, /* 0000 0000 0111 1111 */ - Rune2 = (1<<(Bit2+1*Bitx))-1, /* 0000 0111 1111 1111 */ - Rune3 = (1<<(Bit3+2*Bitx))-1, /* 1111 1111 1111 1111 */ + Rune1 = (1<<(Bit1+0*Bitx))-1, /* 0000 0000 0000 0000 0111 1111 */ + Rune2 = (1<<(Bit2+1*Bitx))-1, /* 0000 0000 0000 0111 1111 1111 */ + Rune3 = (1<<(Bit3+2*Bitx))-1, /* 0000 0000 1111 1111 1111 1111 */ + Rune4 = (1<<(Bit4+3*Bitx))-1, /* 0001 1111 1111 1111 1111 1111 */ Maskx = (1< T2 Tx + * 00080-007FF => T2 Tx */ c1 = *(uchar*)(str+1) ^ Tx; if(c1 & Testx) @@ -75,20 +81,42 @@ /* * three character sequence - * 0800-FFFF => T3 Tx Tx + * 00800-0FFFF => T3 Tx Tx */ c2 = *(uchar*)(str+2) ^ Tx; + if(c2 & Testx) goto bad; if(c < T4) { l = ((((c << Bitx) | c1) << Bitx) | c2) & Rune3; if(l <= Rune2) goto bad; + if (SurrogateMin <= l && l <= SurrogateMax) + goto bad; *rune = l; return 3; } /* + * four character sequence + * 10000-10FFFF => T4 Tx Tx Tx + */ + if(UTFmax >= 4) { + c3 = *(uchar*)(str+3) ^ Tx; + if(c3 & Testx) + goto bad; + if(c < T5) { + l = ((((((c << Bitx) | c1) << Bitx) | c2) << Bitx) | c3) & Rune4; + if(l <= Rune3) + goto bad; + if(l > Runemax) + goto bad; + *rune = l; + return 4; + } + } + + /* * bad decoding */ bad: @@ -120,15 +148,37 @@ str[1] = Tx | (c & Maskx); return 2; } + /* + * If the Rune is out of range or a surrogate half, convert it to the error rune. + * Do this test here because the error rune encodes to three bytes. + * Doing it earlier would duplicate work, since an out of range + * Rune wouldn't have fit in one or two bytes. + */ + if (c > Runemax) + c = Runeerror; + if (SurrogateMin <= c && c <= SurrogateMax) + c = Runeerror; /* * three character sequence * 0800-FFFF => T3 Tx Tx */ - str[0] = T3 | (c >> 2*Bitx); - str[1] = Tx | ((c >> 1*Bitx) & Maskx); - str[2] = Tx | (c & Maskx); - return 3; + if (c <= Rune3) { + str[0] = T3 | (c >> 2*Bitx); + str[1] = Tx | ((c >> 1*Bitx) & Maskx); + str[2] = Tx | (c & Maskx); + return 3; + } + + /* + * four character sequence (21-bit value) + * 10000-1FFFFF => T4 Tx Tx Tx + */ + str[0] = T4 | (c >> 3*Bitx); + str[1] = Tx | ((c >> 2*Bitx) & Maskx); + str[2] = Tx | ((c >> 1*Bitx) & Maskx); + str[3] = Tx | (c & Maskx); + return 4; } int @@ -151,11 +201,12 @@ c = *r++; if(c <= Rune1) nb++; - else - if(c <= Rune2) + else if(c <= Rune2) nb += 2; + else if(c <= Rune3) + nb += 3; else - nb += 3; + nb += 4; } return nb; } @@ -164,14 +215,14 @@ fullrune(char *str, int n) { int c; - - if(n > 0) { - c = *(uchar*)str; - if(c < Tx) - return 1; - if(n > 1) - if(c < T3 || n > 2) - return 1; - } - return 0; + if(n <= 0) + return 0; + c = *(uchar*)str; + if(c < Tx) + return 1; + if(c < T3) + return n >= 2; + if(c < T4) + return n >= 3; + return n >= 4; } --- /sys/src/cmd/abaco/util.c Wed Jul 29 18:23:32 2009 +++ /sys/src/cmd/abaco/util.c Sat Apr 27 01:16:19 2013 @@ -699,9 +699,9 @@ threadsetname("writeproc"); a = v; sync = a[0]; - fd = (int)a[1]; + fd = (uintptr)a[1]; s = a[2]; - np =(long)a[3]; + np =(uintptr)a[3]; free(a); for(i=0; i0; i--) { c = getc(); @@ -1100,7 +1100,7 @@ */ i = 2; if(longflg) - i = 5; + i = 8; l = c - '0'; for(; i>0; i--) { c = getc(); --- /sys/src/cmd/dict/utils.c Fri Nov 19 21:00:37 2004 +++ /sys/src/cmd/dict/utils.c Thu Apr 25 01:01:53 2013 @@ -230,34 +230,6 @@ [MES-MULTI] L" ", }; -#define risupper(r) (L'A' <= (r) && (r) <= L'Z') -#define rislatin1(r) (0xC0 <= (r) && (r) <= 0xFF) -#define rtolower(r) ((r)-'A'+'a') - -static Rune latin_fold_tab[] = -{ -/* Table to fold latin 1 characters to ASCII equivalents - based at Rune value 0xc0 - - À Á Â Ã Ä Å Æ Ç - È É Ê Ë Ì Í Î Ï - Ð Ñ Ò Ó Ô Õ Ö × - Ø Ù Ú Û Ü Ý Þ ß - à á â ã ä å æ ç - è é ê ë ì í î ï - ð ñ ò ó ô õ ö ÷ - ø ù ú û ü ý þ ÿ -*/ - 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c', - 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', - 'd', 'n', 'o', 'o', 'o', 'o', 'o', 0 , - 'o', 'u', 'u', 'u', 'u', 'y', 0 , 0 , - 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c', - 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', - 'd', 'n', 'o', 'o', 'o', 'o', 'o', 0 , - 'o', 'u', 'u', 'u', 'u', 'y', 0 , 'y', -}; - static Rune *ttabstack[20]; static int ntt; @@ -426,7 +398,7 @@ /* * Fold the runes in null-terminated rp. * Use the sort(1) definition of folding (uppercase to lowercase, - * latin1-accented characters to corresponding unaccented chars) + * accented characters to corresponding unaccented chars) */ void fold(Rune *rp) @@ -434,10 +406,9 @@ Rune r; while((r = *rp) != 0) { - if (rislatin1(r) && latin_fold_tab[r-0xc0]) - r = latin_fold_tab[r-0xc0]; - if(risupper(r)) - r = rtolower(r); + r = tobaserune(r); + if(isupperrune(r)) + r = tolowerrune(r); *rp++ = r; } } @@ -455,10 +426,9 @@ while(*old) { old += chartorune(&r, old); - if (rislatin1(r) && latin_fold_tab[r-0xc0]) - r = latin_fold_tab[r-0xc0]; - if(risupper(r)) - r = rtolower(r); + r = tobaserune(r); + if(isupperrune(r)) + r = tolowerrune(r); new += runetochar(new, &r); } *new = 0; --- /sys/src/cmd/ip/tftpd.c Sat Mar 16 21:20:56 2013 +++ /sys/src/cmd/ip/tftpd.c Tue Apr 30 05:59:18 2013 @@ -596,6 +596,9 @@ for(txtry = 0; txtry < timeout;) { if(rexmit == Ackok) { + /* block number wraparound for enormous hogs */ + if (block >= 65536) + block = 0; block++; buf[0] = 0; buf[1] = Tftp_DATA; --- /sys/src/cmd/page/pdfprolog.c Thu Jan 1 01:00:00 1970 +++ /sys/src/cmd/page/pdfprolog.c Wed May 1 00:20:35 2013 @@ -0,0 +1,20 @@ +"/Page null def\n" +"/Page# 0 def\n" +"/PDFSave null def\n" +"/DSCPageCount 0 def\n" +"/DoPDFPage {dup /Page# exch store pdfgetpage pdfshowpage } def\n" +"\n" +"/pdfshowpage_mysetpage { % pdfshowpage_mysetpage \n" +" dup /CropBox pget {\n" +" boxrect\n" +" 2 array astore /PageSize exch 4 2 roll\n" +" 4 index /Rotate pget {\n" +" dup 0 lt {360 add} if 90 idiv {exch neg} repeat\n" +" } if\n" +" exch neg exch 2 array astore /PageOffset exch\n" +" << 5 1 roll >> setpagedevice\n" +" } if\n" +"} bind def\n" +"\n" +"GS_PDF_ProcSet begin\n" +"pdfdict begin\n" --- /sys/src/cmd/samterm/main.c Fri Mar 18 22:33:36 2005 +++ /sys/src/cmd/samterm/main.c Mon Apr 29 23:39:33 2013 @@ -9,6 +9,8 @@ #include "flayer.h" #include "samterm.h" +int mainstacksize = 16*1024; + Text cmd; Rune *scratch; long nscralloc; --- /sys/src/cmd/sort.c Tue Jul 25 17:58:56 2000 +++ /sys/src/cmd/sort.c Thu Apr 25 00:52:51 2013 @@ -71,7 +71,7 @@ int end2; long flags; - uchar mapto[256]; + uchar mapto[1+0xffff]; /* this is not Runemax to keep this table small */ void (*dokey)(Key*, uchar*, uchar*, Field*); }; @@ -95,7 +95,6 @@ long mline; /* max lines per file */ } args; -extern int latinmap[]; extern Rune* month[12]; void buildkey(Line*); @@ -1293,15 +1292,26 @@ /* * for characters out of range, * the table does not do Rflag. - * ignore is based on mapto[255] + * ignore is based on mapto[nelem(f->mapto)] */ if(c != 0 && c < nelem(f->mapto)) { c = f->mapto[c]; if(c == 0) continue; - } else + } else { if(f->mapto[nelem(f->mapto)-1] == 0) continue; + /* + * consider building maps as necessary + */ + if(f->flags & Fflag) + c = tolowerrune(tobaserune(c)); + if(f->flags & Dflag && !isalpharune(c) && + !isdigitrune(c) && !isspacerune(c)) + continue; + if((f->flags & Wflag) && isspacerune(c)) + continue; + } /* * put it in the key @@ -1430,7 +1440,8 @@ k->klen = cl; if(args.vflag) { - write(2, l->line, l->llen); + if(write(2, l->line, l->llen) != l->llen) + exits("write"); for(i=0; iklen; i++) { fprint(2, " %.2x", k->key[i]); if(k->key[i] == 0x00 || k->key[i] == 0xff) @@ -1466,7 +1477,7 @@ void makemapd(Field *f) { - int i, j, c; + int i, c; for(i=0; imapto); i++) { c = i; @@ -1480,24 +1491,12 @@ if(!(c == ' ' || c == '\t' || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || - (c >= '0' && c <= '9'))) { - for(j=0; latinmap[j]; j+=3) - if(c == latinmap[j+0] || - c == latinmap[j+1]) - break; - if(latinmap[j] == 0) + (c >= '0' && c <= '9'))){ + if(!isupperrune(c = toupperrune(c))) c = -1; } - if((f->flags & Fflag) && c >= 0) { - if(c >= 'a' && c <= 'z') - c += 'A' - 'a'; - for(j=0; latinmap[j]; j+=3) - if(c == latinmap[j+0] || - c == latinmap[j+1]) { - c = latinmap[j+2]; - break; - } - } + if((f->flags & Fflag) && c >= 0) + c = toupperrune(tobaserune(c)); if((f->flags & Rflag) && c >= 0 && i > 0 && i < Runeself) c = ~c & 0xff; if(c < 0) @@ -1512,41 +1511,6 @@ } } } - -int latinmap[] = -{ -/* lcase ucase fold */ - L'à', L'À', L'A', - L'á', L'Á', L'A', - L'â', L'Â', L'A', - L'ä', L'Ä', L'A', - L'ã', L'Ã', L'A', - L'å', L'Å', L'A', - L'è', L'È', L'E', - L'é', L'É', L'E', - L'ê', L'Ê', L'E', - L'ë', L'Ë', L'E', - L'ì', L'Ì', L'I', - L'í', L'Í', L'I', - L'î', L'Î', L'I', - L'ï', L'Ï', L'I', - L'ò', L'Ò', L'O', - L'ó', L'Ó', L'O', - L'ô', L'Ô', L'O', - L'ö', L'Ö', L'O', - L'õ', L'Õ', L'O', - L'ø', L'Ø', L'O', - L'ù', L'Ù', L'U', - L'ú', L'Ú', L'U', - L'û', L'Û', L'U', - L'ü', L'Ü', L'U', - L'æ', L'Æ', L'A', - L'ð', L'Ð', L'D', - L'ñ', L'Ñ', L'N', - L'ý', L'Ý', L'Y', - L'ç', L'Ç', L'C', - 0, -}; Rune* month[12] = { --- /sys/src/cmd/tcs/plan9.h Sun Dec 12 02:14:47 1999 +++ /sys/src/cmd/tcs/plan9.h Tue Apr 30 22:05:24 2013 @@ -1,4 +1,4 @@ -typedef unsigned short Rune; /* 16 bits */ +typedef unsigned long Rune; /* 21 bits */ typedef unsigned char uchar; #define Runeerror 0x80 /* decoding error in UTF */ #define Runeself 0x80 /* rune and UTF sequences are the same (<) */ --- /sys/src/cmd/unix/drawterm/include/lib.h Mon Apr 13 01:38:50 2009 +++ /sys/src/cmd/unix/drawterm/include/lib.h Mon Apr 29 23:45:21 2013 @@ -27,7 +27,7 @@ typedef int p9_long; typedef signed char p9_schar; typedef unsigned short p9_ushort; -typedef unsigned short Rune; +typedef unsigned int Rune; typedef unsigned int p9_u32int; typedef p9_u32int mpdigit; @@ -50,10 +50,12 @@ enum { - UTFmax = 3, /* maximum bytes per rune */ + UTFmax = 4, /* maximum bytes per rune */ Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ Runeself = 0x80, /* rune and UTF sequences are the same (<) */ - Runeerror = 0x80 /* decoding error in UTF */ + Runeerror = 0xFFFD, /* decoding error in UTF */ + Runemax = 0x10FFFF, /* 21-bit rune */ + Runemask = 0x1FFFFF, /* bits used by runes (see grep) */ }; /* --- /sys/src/cmd/unix/drawterm/libc/rune.c Wed Apr 24 01:14:58 2013 +++ /sys/src/cmd/unix/drawterm/libc/rune.c Mon Apr 29 23:44:56 2013 @@ -1,28 +1,21 @@ #include #include +#define Bit(i) (7-(i)) +/* N 0's preceded by i 1's, T(Bit(2)) is 1100 0000 */ +#define T(i) (((1 << (Bit(i)+1))-1) ^ 0xFF) +/* 0000 0000 0000 0111 1111 1111 */ +#define RuneX(i) ((1 << (Bit(i) + ((i)-1)*Bitx))-1) + enum { - Bit1 = 7, - Bitx = 6, - Bit2 = 5, - Bit3 = 4, - Bit4 = 3, - - T1 = ((1<<(Bit1+1))-1) ^ 0xFF, /* 0000 0000 */ - Tx = ((1<<(Bitx+1))-1) ^ 0xFF, /* 1000 0000 */ - T2 = ((1<<(Bit2+1))-1) ^ 0xFF, /* 1100 0000 */ - T3 = ((1<<(Bit3+1))-1) ^ 0xFF, /* 1110 0000 */ - T4 = ((1<<(Bit4+1))-1) ^ 0xFF, /* 1111 0000 */ - T5 = ((1<<(Bit5+1))-1) ^ 0xFF, /* 1111 1000 */ - - Rune1 = (1<<(Bit1+0*Bitx))-1, /* 0000 0000 0000 0000 0111 1111 */ - Rune2 = (1<<(Bit2+1*Bitx))-1, /* 0000 0000 0000 0111 1111 1111 */ - Rune3 = (1<<(Bit3+2*Bitx))-1, /* 0000 0000 1111 1111 1111 1111 */ - Rune4 = (1<<(Bit4+3*Bitx))-1, /* 0001 1111 1111 1111 1111 1111 */ + Bitx = Bit(1), + + Tx = T(1), /* 1000 0000 */ + Rune1 = (1<<(Bit(0)+0*Bitx))-1, /* 0000 0000 0000 0000 0111 1111 */ - Maskx = (1< T1 - */ - c = *(uchar*)str; - if(c < Tx) { - *rune = c; - return 1; - } - - /* - * two character sequence * 00080-007FF => T2 Tx - */ - c1 = *(uchar*)(str+1) ^ Tx; - if(c1 & Testx) - goto bad; - if(c < T3) { - if(c < T2) - goto bad; - l = ((c << Bitx) | c1) & Rune2; - if(l <= Rune1) - goto bad; - *rune = l; - return 2; - } - - /* - * three character sequence * 00800-0FFFF => T3 Tx Tx + * 10000-10FFFF => T4 Tx Tx Tx */ - c2 = *(uchar*)(str+2) ^ Tx; - if(c2 & Testx) - goto bad; - if(c < T4) { - l = ((((c << Bitx) | c1) << Bitx) | c2) & Rune3; - if(l <= Rune2) - goto bad; - if (SurrogateMin <= l && l <= SurrogateMax) - goto bad; - *rune = l; - return 3; + c[0] = *(uchar*)(str); + if(c[0] < Tx){ + *rune = c[0]; + return 1; } + l = c[0]; - /* - * four character sequence - * 10000-10FFFF => T4 Tx Tx Tx - */ - if(UTFmax >= 4) { - c3 = *(uchar*)(str+3) ^ Tx; - if(c3 & Testx) + for(i = 1; i < UTFmax; i++) { + c[i] = *(uchar*)(str+i); + c[i] ^= Tx; + if(c[i] & Testx) goto bad; - if(c < T5) { - l = ((((((c << Bitx) | c1) << Bitx) | c2) << Bitx) | c3) & Rune4; - if(l <= Rune3) + l = (l << Bitx) | c[i]; + if(c[0] < T(i + 2)) { + l &= RuneX(i + 1); + if(i == 1) { + if(c[0] < T(2) || l <= Rune1) + goto bad; + } else if(l <= RuneX(i) || l > Runemax) goto bad; - if(l > Runemax) + if (i == 2 && SurrogateMin <= l && l <= SurrogateMax) goto bad; *rune = l; - return 4; + return i + 1; } } @@ -111,12 +75,9 @@ int runetochar(char *str, Rune *rune) { - long c; + int i, j; + Rune c; - /* - * one character sequence - * 00000-0007F => 00-7F - */ c = *rune; if(c <= Rune1) { str[0] = c; @@ -124,45 +85,35 @@ } /* + * one character sequence + * 00000-0007F => 00-7F * two character sequence * 0080-07FF => T2 Tx - */ - if(c <= Rune2) { - str[0] = T2 | (c >> 1*Bitx); - str[1] = Tx | (c & Maskx); - return 2; - } - /* - * If the Rune is out of range or a surrogate half, convert it to the error rune. - * Do this test here because the error rune encodes to three bytes. - * Doing it earlier would duplicate work, since an out of range - * Rune wouldn't have fit in one or two bytes. - */ - if (c > Runemax) - c = Runeerror; - if (SurrogateMin <= c && c <= SurrogateMax) - c = Runeerror; - - /* * three character sequence * 0800-FFFF => T3 Tx Tx - */ - if (c <= Rune3) { - str[0] = T3 | (c >> 2*Bitx); - str[1] = Tx | ((c >> 1*Bitx) & Maskx); - str[2] = Tx | (c & Maskx); - return 3; - } - - /* * four character sequence (21-bit value) * 10000-1FFFFF => T4 Tx Tx Tx + * If the Rune is out of range or a surrogate half, + * convert it to the error rune. + * Do this test when i==3 because the error rune encodes to three bytes. + * Doing it earlier would duplicate work, since an out of range + * Rune wouldn't have fit in one or two bytes. */ - str[0] = T4 | (c >> 3*Bitx); - str[1] = Tx | ((c >> 2*Bitx) & Maskx); - str[2] = Tx | ((c >> 1*Bitx) & Maskx); - str[3] = Tx | (c & Maskx); - return 4; + for(i = 2; i < UTFmax + 1; i++){ + if(i == 3){ + if(c > Runemax) + c = Runeerror; + if(SurrogateMin <= c && c <= SurrogateMax) + c = Runeerror; + } + if (c <= RuneX(i) || i == UTFmax ) { + str[0] = T(i) | (c >> (i - 1)*Bitx); + for(j = 1; j < i; j++) + str[j] = Tx | ((c >> (i - j - 1)*Bitx) & Maskx); + return i; + } + } + return UTFmax; } int @@ -178,19 +129,21 @@ int runenlen(Rune *r, int nrune) { - int nb, c; + int nb, i; + Rune c; nb = 0; while(nrune--) { c = *r++; - if(c <= Rune1) + if(c <= Rune1){ nb++; - else if(c <= Rune2) - nb += 2; - else if(c <= Rune3) - nb += 3; - else - nb += 4; + } else { + for(i = 2; i < UTFmax + 1; i++) + if(c <= RuneX(i) || i == UTFmax){ + nb += i; + break; + } + } } return nb; } @@ -198,15 +151,16 @@ int fullrune(char *str, int n) { - int c; + int i; + Rune c; + if(n <= 0) return 0; c = *(uchar*)str; if(c < Tx) return 1; - if(c < T3) - return n >= 2; - if(c < T4) - return n >= 3; - return n >= 4; + for(i = 3; i < UTFmax + 1; i++) + if(c < T(i)) + return n >= i - 1; + return n >= UTFmax; } --- /sys/src/cmd/unix/drawterm/libc/utf.h Fri Dec 30 00:56:12 2005 +++ /sys/src/cmd/unix/drawterm/libc/utf.h Mon Apr 29 23:45:05 2013 @@ -1,14 +1,16 @@ #ifndef _UTFH_ #define _UTFH_ 1 -typedef unsigned short Rune; /* 16 bits */ +typedef unsigned int Rune; /* 32 bits */ enum { - UTFmax = 3, /* maximum bytes per rune */ + UTFmax = 4, /* maximum bytes per rune */ Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ Runeself = 0x80, /* rune and UTF sequences are the same (<) */ - Runeerror = 0x80, /* decoding error in UTF */ + Runeerror = 0xFFFD, /* decoding error in UTF */ + Runemax = 0x10FFFF, /* 21-bit rune */ + Runemask = 0x1FFFFF, /* bits used by runes (see grep) */ }; /* --- /sys/src/libbio/bgetrune.c Sun Dec 12 02:21:47 1999 +++ /sys/src/libbio/bgetrune.c Thu Apr 25 00:55:40 2013 @@ -7,7 +7,7 @@ { int c, i; Rune rune; - char str[4]; + char str[UTFmax]; c = Bgetc(bp); if(c < Runeself) { /* one char */ @@ -15,19 +15,25 @@ return c; } str[0] = c; + bp->runesize = 0; for(i=1;;) { c = Bgetc(bp); if(c < 0) return c; + if (i >= sizeof str) + return Runeerror; str[i++] = c; if(fullrune(str, i)) { + /* utf is long enough to be a rune, but could be bad. */ bp->runesize = chartorune(&rune, str); - while(i > bp->runesize) { - Bungetc(bp); - i--; - } + if (rune == Runeerror) + bp->runesize = 0; /* push back nothing */ + else + /* push back bytes unconsumed by chartorune */ + for(; i > bp->runesize; i--) + Bungetc(bp); return rune; } } --- /sys/src/libbio/bputrune.c Sun Dec 12 02:21:47 1999 +++ /sys/src/libbio/bputrune.c Thu Apr 25 00:55:40 2013 @@ -6,7 +6,7 @@ Bputrune(Biobufhdr *bp, long c) { Rune rune; - char str[4]; + char str[UTFmax]; int n; rune = c; --- /sys/src/libc/9sys/ctime.c Mon Apr 10 17:20:11 2006 +++ /sys/src/libc/9sys/ctime.c Thu Apr 25 01:03:52 2013 @@ -106,8 +106,8 @@ /* * break initial number into days */ - hms = tim % 86400L; - day = tim / 86400L; + hms = (ulong)tim % 86400L; + day = (ulong)tim / 86400L; if(hms < 0) { hms += 86400L; day -= 1; --- /sys/src/libc/port/frexp.c Thu Feb 28 21:16:37 2002 +++ /sys/src/libc/port/frexp.c Thu Apr 25 01:04:00 2013 @@ -9,18 +9,24 @@ #define MASK 0x7ffL #define SHIFT 20 #define BIAS 1022L +#define SIG 52 double frexp(double d, int *ep) { - FPdbleword x; + FPdbleword x, a; - if(d == 0) { - *ep = 0; - return 0; - } + *ep = 0; + /* order matters: only isNaN can operate on NaN */ + if(isNaN(d) || isInf(d, 0) || d == 0) + return d; x.x = d; - *ep = ((x.hi >> SHIFT) & MASK) - BIAS; + a.x = fabs(d); + if((a.hi >> SHIFT) == 0){ /* normalize subnormal numbers */ + x.x = (double)(1ULL<> SHIFT) & MASK) - BIAS; x.hi &= ~(MASK << SHIFT); x.hi |= BIAS << SHIFT; return x.x; --- /sys/src/libc/port/mkfile Sat Nov 1 21:37:24 2003 +++ /sys/src/libc/port/mkfile Thu Apr 25 00:51:53 2013 @@ -60,6 +60,8 @@ rand.c\ readn.c\ rune.c\ + runebase.c\ + runebsearch.c\ runestrcat.c\ runestrchr.c\ runestrcmp.c\ --- /sys/src/libc/port/rune.c Thu Feb 28 21:16:42 2002 +++ /sys/src/libc/port/rune.c Tue Apr 30 22:04:58 2013 @@ -1,26 +1,24 @@ #include #include +#define Bit(i) (7-(i)) +/* N 0's preceded by i 1's, T(Bit(2)) is 1100 0000 */ +#define T(i) (((1 << (Bit(i)+1))-1) ^ 0xFF) +/* 0000 0000 0000 0111 1111 1111 */ +#define RuneX(i) ((1 << (Bit(i) + ((i)-1)*Bitx))-1) + enum { - Bit1 = 7, - Bitx = 6, - Bit2 = 5, - Bit3 = 4, - Bit4 = 3, - - T1 = ((1<<(Bit1+1))-1) ^ 0xFF, /* 0000 0000 */ - Tx = ((1<<(Bitx+1))-1) ^ 0xFF, /* 1000 0000 */ - T2 = ((1<<(Bit2+1))-1) ^ 0xFF, /* 1100 0000 */ - T3 = ((1<<(Bit3+1))-1) ^ 0xFF, /* 1110 0000 */ - T4 = ((1<<(Bit4+1))-1) ^ 0xFF, /* 1111 0000 */ - - Rune1 = (1<<(Bit1+0*Bitx))-1, /* 0000 0000 0111 1111 */ - Rune2 = (1<<(Bit2+1*Bitx))-1, /* 0000 0111 1111 1111 */ - Rune3 = (1<<(Bit3+2*Bitx))-1, /* 1111 1111 1111 1111 */ + Bitx = Bit(1), + + Tx = T(1), /* 1000 0000 */ + Rune1 = (1<<(Bit(0)+0*Bitx))-1, /* 0000 0000 0000 0000 0111 1111 */ + + Maskx = (1< T1 + * 00080-007FF => T2 Tx + * 00800-0FFFF => T3 Tx Tx + * 10000-10FFFF => T4 Tx Tx Tx */ - c = *(uchar*)str; - if(c < Tx) { - *rune = c; + + c[0] = *(uchar*)(str); + if(c[0] < Tx){ + *rune = c[0]; return 1; } + l = c[0]; - /* - * two character sequence - * 0080-07FF => T2 Tx - */ - c1 = *(uchar*)(str+1) ^ Tx; - if(c1 & Testx) - goto bad; - if(c < T3) { - if(c < T2) - goto bad; - l = ((c << Bitx) | c1) & Rune2; - if(l <= Rune1) + for(i = 1; i < UTFmax; i++) { + c[i] = *(uchar*)(str+i); + c[i] ^= Tx; + if(c[i] & Testx) goto bad; - *rune = l; - return 2; - } - - /* - * three character sequence - * 0800-FFFF => T3 Tx Tx - */ - c2 = *(uchar*)(str+2) ^ Tx; - if(c2 & Testx) - goto bad; - if(c < T4) { - l = ((((c << Bitx) | c1) << Bitx) | c2) & Rune3; - if(l <= Rune2) - goto bad; - *rune = l; - return 3; + l = (l << Bitx) | c[i]; + if(c[0] < T(i + 2)) { + l &= RuneX(i + 1); + if(i == 1) { + if(c[0] < T(2) || l <= Rune1) + goto bad; + } else if(l <= RuneX(i) || l > Runemax) + goto bad; + if (i == 2 && SurrogateMin <= l && l <= SurrogateMax) + goto bad; + *rune = l; + return i + 1; + } } /* @@ -84,12 +75,9 @@ int runetochar(char *str, Rune *rune) { - long c; + int i, j; + Rune c; - /* - * one character sequence - * 00000-0007F => 00-7F - */ c = *rune; if(c <= Rune1) { str[0] = c; @@ -97,23 +85,35 @@ } /* + * one character sequence + * 00000-0007F => 00-7F * two character sequence * 0080-07FF => T2 Tx - */ - if(c <= Rune2) { - str[0] = T2 | (c >> 1*Bitx); - str[1] = Tx | (c & Maskx); - return 2; - } - - /* * three character sequence * 0800-FFFF => T3 Tx Tx - */ - str[0] = T3 | (c >> 2*Bitx); - str[1] = Tx | ((c >> 1*Bitx) & Maskx); - str[2] = Tx | (c & Maskx); - return 3; + * four character sequence (21-bit value) + * 10000-1FFFFF => T4 Tx Tx Tx + * If the Rune is out of range or a surrogate half, + * convert it to the error rune. + * Do this test when i==3 because the error rune encodes to three bytes. + * Doing it earlier would duplicate work, since an out of range + * Rune wouldn't have fit in one or two bytes. + */ + for(i = 2; i < UTFmax + 1; i++){ + if(i == 3){ + if(c > Runemax) + c = Runeerror; + if(SurrogateMin <= c && c <= SurrogateMax) + c = Runeerror; + } + if (c <= RuneX(i) || i == UTFmax ) { + str[0] = T(i) | (c >> (i - 1)*Bitx); + for(j = 1; j < i; j++) + str[j] = Tx | ((c >> (i - j - 1)*Bitx) & Maskx); + return i; + } + } + return UTFmax; } int @@ -129,18 +129,21 @@ int runenlen(Rune *r, int nrune) { - int nb, c; + int nb, i; + Rune c; nb = 0; while(nrune--) { c = *r++; - if(c <= Rune1) + if(c <= Rune1){ nb++; - else - if(c <= Rune2) - nb += 2; - else - nb += 3; + } else { + for(i = 2; i < UTFmax + 1; i++) + if(c <= RuneX(i) || i == UTFmax){ + nb += i; + break; + } + } } return nb; } @@ -148,15 +151,16 @@ int fullrune(char *str, int n) { - int c; + int i; + Rune c; - if(n > 0) { - c = *(uchar*)str; - if(c < Tx) - return 1; - if(n > 1) - if(c < T3 || n > 2) - return 1; - } - return 0; + if(n <= 0) + return 0; + c = *(uchar*)str; + if(c < Tx) + return 1; + for(i = 3; i < UTFmax + 1; i++) + if(c < T(i)) + return n >= i - 1; + return n >= UTFmax; } --- /sys/src/libc/port/runebase.c Thu Jan 1 01:00:00 1970 +++ /sys/src/libc/port/runebase.c Tue Apr 30 22:04:58 2013 @@ -0,0 +1,1958 @@ +#include +#include + +Rune*_runebsearch(Rune c, Rune *t, int n, int ne); + +static Rune _base2[] = +{ + 0x00c0, 0x0041, /* À A */ + 0x00c1, 0x0041, /* Á A */ + 0x00c2, 0x0041, /*  A */ + 0x00c3, 0x0041, /* à A */ + 0x00c4, 0x0041, /* Ä A */ + 0x00c5, 0x0041, /* Å A */ + 0x00c7, 0x0043, /* Ç C */ + 0x00c8, 0x0045, /* È E */ + 0x00c9, 0x0045, /* É E */ + 0x00ca, 0x0045, /* Ê E */ + 0x00cb, 0x0045, /* Ë E */ + 0x00cc, 0x0049, /* Ì I */ + 0x00cd, 0x0049, /* Í I */ + 0x00ce, 0x0049, /* Î I */ + 0x00cf, 0x0049, /* Ï I */ + 0x00d1, 0x004e, /* Ñ N */ + 0x00d2, 0x004f, /* Ò O */ + 0x00d3, 0x004f, /* Ó O */ + 0x00d4, 0x004f, /* Ô O */ + 0x00d5, 0x004f, /* Õ O */ + 0x00d6, 0x004f, /* Ö O */ + 0x00d9, 0x0055, /* Ù U */ + 0x00da, 0x0055, /* Ú U */ + 0x00db, 0x0055, /* Û U */ + 0x00dc, 0x0055, /* Ü U */ + 0x00dd, 0x0059, /* Ý Y */ + 0x00e0, 0x0061, /* à a */ + 0x00e1, 0x0061, /* á a */ + 0x00e2, 0x0061, /* â a */ + 0x00e3, 0x0061, /* ã a */ + 0x00e4, 0x0061, /* ä a */ + 0x00e5, 0x0061, /* å a */ + 0x00e7, 0x0063, /* ç c */ + 0x00e8, 0x0065, /* è e */ + 0x00e9, 0x0065, /* é e */ + 0x00ea, 0x0065, /* ê e */ + 0x00eb, 0x0065, /* ë e */ + 0x00ec, 0x0069, /* ì i */ + 0x00ed, 0x0069, /* í i */ + 0x00ee, 0x0069, /* î i */ + 0x00ef, 0x0069, /* ï i */ + 0x00f1, 0x006e, /* ñ n */ + 0x00f2, 0x006f, /* ò o */ + 0x00f3, 0x006f, /* ó o */ + 0x00f4, 0x006f, /* ô o */ + 0x00f5, 0x006f, /* õ o */ + 0x00f6, 0x006f, /* ö o */ + 0x00f9, 0x0075, /* ù u */ + 0x00fa, 0x0075, /* ú u */ + 0x00fb, 0x0075, /* û u */ + 0x00fc, 0x0075, /* ü u */ + 0x00fd, 0x0079, /* ý y */ + 0x00ff, 0x0079, /* ÿ y */ + 0x0100, 0x0041, /* Ā A */ + 0x0101, 0x0061, /* ā a */ + 0x0102, 0x0041, /* Ă A */ + 0x0103, 0x0061, /* ă a */ + 0x0104, 0x0041, /* Ą A */ + 0x0105, 0x0061, /* ą a */ + 0x0106, 0x0043, /* Ć C */ + 0x0107, 0x0063, /* ć c */ + 0x0108, 0x0043, /* Ĉ C */ + 0x0109, 0x0063, /* ĉ c */ + 0x010a, 0x0043, /* Ċ C */ + 0x010b, 0x0063, /* ċ c */ + 0x010c, 0x0043, /* Č C */ + 0x010d, 0x0063, /* č c */ + 0x010e, 0x0044, /* Ď D */ + 0x010f, 0x0064, /* ď d */ + 0x0112, 0x0045, /* Ē E */ + 0x0113, 0x0065, /* ē e */ + 0x0114, 0x0045, /* Ĕ E */ + 0x0115, 0x0065, /* ĕ e */ + 0x0116, 0x0045, /* Ė E */ + 0x0117, 0x0065, /* ė e */ + 0x0118, 0x0045, /* Ę E */ + 0x0119, 0x0065, /* ę e */ + 0x011a, 0x0045, /* Ě E */ + 0x011b, 0x0065, /* ě e */ + 0x011c, 0x0047, /* Ĝ G */ + 0x011d, 0x0067, /* ĝ g */ + 0x011e, 0x0047, /* Ğ G */ + 0x011f, 0x0067, /* ğ g */ + 0x0120, 0x0047, /* Ġ G */ + 0x0121, 0x0067, /* ġ g */ + 0x0122, 0x0047, /* Ģ G */ + 0x0123, 0x0067, /* ģ g */ + 0x0124, 0x0048, /* Ĥ H */ + 0x0125, 0x0068, /* ĥ h */ + 0x0128, 0x0049, /* Ĩ I */ + 0x0129, 0x0069, /* ĩ i */ + 0x012a, 0x0049, /* Ī I */ + 0x012b, 0x0069, /* ī i */ + 0x012c, 0x0049, /* Ĭ I */ + 0x012d, 0x0069, /* ĭ i */ + 0x012e, 0x0049, /* Į I */ + 0x012f, 0x0069, /* į i */ + 0x0130, 0x0049, /* İ I */ + 0x0134, 0x004a, /* Ĵ J */ + 0x0135, 0x006a, /* ĵ j */ + 0x0136, 0x004b, /* Ķ K */ + 0x0137, 0x006b, /* ķ k */ + 0x0139, 0x004c, /* Ĺ L */ + 0x013a, 0x006c, /* ĺ l */ + 0x013b, 0x004c, /* Ļ L */ + 0x013c, 0x006c, /* ļ l */ + 0x013d, 0x004c, /* Ľ L */ + 0x013e, 0x006c, /* ľ l */ + 0x0143, 0x004e, /* Ń N */ + 0x0144, 0x006e, /* ń n */ + 0x0145, 0x004e, /* Ņ N */ + 0x0146, 0x006e, /* ņ n */ + 0x0147, 0x004e, /* Ň N */ + 0x0148, 0x006e, /* ň n */ + 0x014c, 0x004f, /* Ō O */ + 0x014d, 0x006f, /* ō o */ + 0x014e, 0x004f, /* Ŏ O */ + 0x014f, 0x006f, /* ŏ o */ + 0x0150, 0x004f, /* Ő O */ + 0x0151, 0x006f, /* ő o */ + 0x0154, 0x0052, /* Ŕ R */ + 0x0155, 0x0072, /* ŕ r */ + 0x0156, 0x0052, /* Ŗ R */ + 0x0157, 0x0072, /* ŗ r */ + 0x0158, 0x0052, /* Ř R */ + 0x0159, 0x0072, /* ř r */ + 0x015a, 0x0053, /* Ś S */ + 0x015b, 0x0073, /* ś s */ + 0x015c, 0x0053, /* Ŝ S */ + 0x015d, 0x0073, /* ŝ s */ + 0x015e, 0x0053, /* Ş S */ + 0x015f, 0x0073, /* ş s */ + 0x0160, 0x0053, /* Š S */ + 0x0161, 0x0073, /* š s */ + 0x0162, 0x0054, /* Ţ T */ + 0x0163, 0x0074, /* ţ t */ + 0x0164, 0x0054, /* Ť T */ + 0x0165, 0x0074, /* ť t */ + 0x0168, 0x0055, /* Ũ U */ + 0x0169, 0x0075, /* ũ u */ + 0x016a, 0x0055, /* Ū U */ + 0x016b, 0x0075, /* ū u */ + 0x016c, 0x0055, /* Ŭ U */ + 0x016d, 0x0075, /* ŭ u */ + 0x016e, 0x0055, /* Ů U */ + 0x016f, 0x0075, /* ů u */ + 0x0170, 0x0055, /* Ű U */ + 0x0171, 0x0075, /* ű u */ + 0x0172, 0x0055, /* Ų U */ + 0x0173, 0x0075, /* ų u */ + 0x0174, 0x0057, /* Ŵ W */ + 0x0175, 0x0077, /* ŵ w */ + 0x0176, 0x0059, /* Ŷ Y */ + 0x0177, 0x0079, /* ŷ y */ + 0x0178, 0x0059, /* Ÿ Y */ + 0x0179, 0x005a, /* Ź Z */ + 0x017a, 0x007a, /* ź z */ + 0x017b, 0x005a, /* Ż Z */ + 0x017c, 0x007a, /* ż z */ + 0x017d, 0x005a, /* Ž Z */ + 0x017e, 0x007a, /* ž z */ + 0x01a0, 0x004f, /* Ơ O */ + 0x01a1, 0x006f, /* ơ o */ + 0x01af, 0x0055, /* Ư U */ + 0x01b0, 0x0075, /* ư u */ + 0x01cd, 0x0041, /* Ǎ A */ + 0x01ce, 0x0061, /* ǎ a */ + 0x01cf, 0x0049, /* Ǐ I */ + 0x01d0, 0x0069, /* ǐ i */ + 0x01d1, 0x004f, /* Ǒ O */ + 0x01d2, 0x006f, /* ǒ o */ + 0x01d3, 0x0055, /* Ǔ U */ + 0x01d4, 0x0075, /* ǔ u */ + 0x01d5, 0x0055, /* Ǖ U */ + 0x01d6, 0x0075, /* ǖ u */ + 0x01d7, 0x0055, /* Ǘ U */ + 0x01d8, 0x0075, /* ǘ u */ + 0x01d9, 0x0055, /* Ǚ U */ + 0x01da, 0x0075, /* ǚ u */ + 0x01db, 0x0055, /* Ǜ U */ + 0x01dc, 0x0075, /* ǜ u */ + 0x01de, 0x0041, /* Ǟ A */ + 0x01df, 0x0061, /* ǟ a */ + 0x01e0, 0x0041, /* Ǡ A */ + 0x01e1, 0x0061, /* ǡ a */ + 0x01e2, 0x00c6, /* Ǣ Æ */ + 0x01e3, 0x00e6, /* ǣ æ */ + 0x01e6, 0x0047, /* Ǧ G */ + 0x01e7, 0x0067, /* ǧ g */ + 0x01e8, 0x004b, /* Ǩ K */ + 0x01e9, 0x006b, /* ǩ k */ + 0x01ea, 0x004f, /* Ǫ O */ + 0x01eb, 0x006f, /* ǫ o */ + 0x01ec, 0x004f, /* Ǭ O */ + 0x01ed, 0x006f, /* ǭ o */ + 0x01ee, 0x01b7, /* Ǯ Ʒ */ + 0x01ef, 0x0292, /* ǯ ʒ */ + 0x01f0, 0x006a, /* ǰ j */ + 0x01f4, 0x0047, /* Ǵ G */ + 0x01f5, 0x0067, /* ǵ g */ + 0x01f8, 0x004e, /* Ǹ N */ + 0x01f9, 0x006e, /* ǹ n */ + 0x01fa, 0x0041, /* Ǻ A */ + 0x01fb, 0x0061, /* ǻ a */ + 0x01fc, 0x00c6, /* Ǽ Æ */ + 0x01fd, 0x00e6, /* ǽ æ */ + 0x01fe, 0x00d8, /* Ǿ Ø */ + 0x01ff, 0x00f8, /* ǿ ø */ + 0x0200, 0x0041, /* Ȁ A */ + 0x0201, 0x0061, /* ȁ a */ + 0x0202, 0x0041, /* Ȃ A */ + 0x0203, 0x0061, /* ȃ a */ + 0x0204, 0x0045, /* Ȅ E */ + 0x0205, 0x0065, /* ȅ e */ + 0x0206, 0x0045, /* Ȇ E */ + 0x0207, 0x0065, /* ȇ e */ + 0x0208, 0x0049, /* Ȉ I */ + 0x0209, 0x0069, /* ȉ i */ + 0x020a, 0x0049, /* Ȋ I */ + 0x020b, 0x0069, /* ȋ i */ + 0x020c, 0x004f, /* Ȍ O */ + 0x020d, 0x006f, /* ȍ o */ + 0x020e, 0x004f, /* Ȏ O */ + 0x020f, 0x006f, /* ȏ o */ + 0x0210, 0x0052, /* Ȑ R */ + 0x0211, 0x0072, /* ȑ r */ + 0x0212, 0x0052, /* Ȓ R */ + 0x0213, 0x0072, /* ȓ r */ + 0x0214, 0x0055, /* Ȕ U */ + 0x0215, 0x0075, /* ȕ u */ + 0x0216, 0x0055, /* Ȗ U */ + 0x0217, 0x0075, /* ȗ u */ + 0x0218, 0x0053, /* Ș S */ + 0x0219, 0x0073, /* ș s */ + 0x021a, 0x0054, /* Ț T */ + 0x021b, 0x0074, /* ț t */ + 0x021e, 0x0048, /* Ȟ H */ + 0x021f, 0x0068, /* ȟ h */ + 0x0226, 0x0041, /* Ȧ A */ + 0x0227, 0x0061, /* ȧ a */ + 0x0228, 0x0045, /* Ȩ E */ + 0x0229, 0x0065, /* ȩ e */ + 0x022a, 0x004f, /* Ȫ O */ + 0x022b, 0x006f, /* ȫ o */ + 0x022c, 0x004f, /* Ȭ O */ + 0x022d, 0x006f, /* ȭ o */ + 0x022e, 0x004f, /* Ȯ O */ + 0x022f, 0x006f, /* ȯ o */ + 0x0230, 0x004f, /* Ȱ O */ + 0x0231, 0x006f, /* ȱ o */ + 0x0232, 0x0059, /* Ȳ Y */ + 0x0233, 0x0079, /* ȳ y */ + 0x0374, 0x02b9, /* ʹ ʹ */ + 0x0386, 0x0391, /* Ά Α */ + 0x0388, 0x0395, /* Έ Ε */ + 0x0389, 0x0397, /* Ή Η */ + 0x038a, 0x0399, /* Ί Ι */ + 0x038c, 0x039f, /* Ό Ο */ + 0x038e, 0x03a5, /* Ύ Υ */ + 0x038f, 0x03a9, /* Ώ Ω */ + 0x0390, 0x03b9, /* ΐ ι */ + 0x03aa, 0x0399, /* Ϊ Ι */ + 0x03ab, 0x03a5, /* Ϋ Υ */ + 0x03ac, 0x03b1, /* ά α */ + 0x03ad, 0x03b5, /* έ ε */ + 0x03ae, 0x03b7, /* ή η */ + 0x03af, 0x03b9, /* ί ι */ + 0x03b0, 0x03c5, /* ΰ υ */ + 0x03ca, 0x03b9, /* ϊ ι */ + 0x03cb, 0x03c5, /* ϋ υ */ + 0x03cc, 0x03bf, /* ό ο */ + 0x03cd, 0x03c5, /* ύ υ */ + 0x03ce, 0x03c9, /* ώ ω */ + 0x03d3, 0x03d2, /* ϓ ϒ */ + 0x03d4, 0x03d2, /* ϔ ϒ */ + 0x0400, 0x0415, /* Ѐ Е */ + 0x0401, 0x0415, /* Ё Е */ + 0x0403, 0x0413, /* Ѓ Г */ + 0x0407, 0x0406, /* Ї І */ + 0x040c, 0x041a, /* Ќ К */ + 0x040d, 0x0418, /* Ѝ И */ + 0x040e, 0x0423, /* Ў У */ + 0x0419, 0x0418, /* Й И */ + 0x0439, 0x0438, /* й и */ + 0x0450, 0x0435, /* ѐ е */ + 0x0451, 0x0435, /* ё е */ + 0x0453, 0x0433, /* ѓ г */ + 0x0457, 0x0456, /* ї і */ + 0x045c, 0x043a, /* ќ к */ + 0x045d, 0x0438, /* ѝ и */ + 0x045e, 0x0443, /* ў у */ + 0x0476, 0x0474, /* Ѷ Ѵ */ + 0x0477, 0x0475, /* ѷ ѵ */ + 0x04c1, 0x0416, /* Ӂ Ж */ + 0x04c2, 0x0436, /* ӂ ж */ + 0x04d0, 0x0410, /* Ӑ А */ + 0x04d1, 0x0430, /* ӑ а */ + 0x04d2, 0x0410, /* Ӓ А */ + 0x04d3, 0x0430, /* ӓ а */ + 0x04d6, 0x0415, /* Ӗ Е */ + 0x04d7, 0x0435, /* ӗ е */ + 0x04da, 0x04d8, /* Ӛ Ә */ + 0x04db, 0x04d9, /* ӛ ә */ + 0x04dc, 0x0416, /* Ӝ Ж */ + 0x04dd, 0x0436, /* ӝ ж */ + 0x04de, 0x0417, /* Ӟ З */ + 0x04df, 0x0437, /* ӟ з */ + 0x04e2, 0x0418, /* Ӣ И */ + 0x04e3, 0x0438, /* ӣ и */ + 0x04e4, 0x0418, /* Ӥ И */ + 0x04e5, 0x0438, /* ӥ и */ + 0x04e6, 0x041e, /* Ӧ О */ + 0x04e7, 0x043e, /* ӧ о */ + 0x04ea, 0x04e8, /* Ӫ Ө */ + 0x04eb, 0x04e9, /* ӫ ө */ + 0x04ec, 0x042d, /* Ӭ Э */ + 0x04ed, 0x044d, /* ӭ э */ + 0x04ee, 0x0423, /* Ӯ У */ + 0x04ef, 0x0443, /* ӯ у */ + 0x04f0, 0x0423, /* Ӱ У */ + 0x04f1, 0x0443, /* ӱ у */ + 0x04f2, 0x0423, /* Ӳ У */ + 0x04f3, 0x0443, /* ӳ у */ + 0x04f4, 0x0427, /* Ӵ Ч */ + 0x04f5, 0x0447, /* ӵ ч */ + 0x04f8, 0x042b, /* Ӹ Ы */ + 0x04f9, 0x044b, /* ӹ ы */ + 0x0622, 0x0627, /* آ ا */ + 0x0623, 0x0627, /* أ ا */ + 0x0624, 0x0648, /* ؤ و */ + 0x0625, 0x0627, /* إ ا */ + 0x0626, 0x064a, /* ئ ي */ + 0x06c0, 0x06d5, /* ۀ ە */ + 0x06c2, 0x06c1, /* ۂ ہ */ + 0x06d3, 0x06d2, /* ۓ ے */ + 0x0929, 0x0928, /* ऩ न */ + 0x0931, 0x0930, /* ऱ र */ + 0x0934, 0x0933, /* ऴ ळ */ + 0x0958, 0x0915, /* क़ क */ + 0x0959, 0x0916, /* ख़ ख */ + 0x095a, 0x0917, /* ग़ ग */ + 0x095b, 0x091c, /* ज़ ज */ + 0x095c, 0x0921, /* ड़ ड */ + 0x095d, 0x0922, /* ढ़ ढ */ + 0x095e, 0x092b, /* फ़ फ */ + 0x095f, 0x092f, /* य़ य */ + 0x09dc, 0x09a1, /* ড় ড */ + 0x09dd, 0x09a2, /* ঢ় ঢ */ + 0x09df, 0x09af, /* য় য */ + 0x0a33, 0x0a32, /* ਲ਼ ਲ */ + 0x0a36, 0x0a38, /* ਸ਼ ਸ */ + 0x0a59, 0x0a16, /* ਖ਼ ਖ */ + 0x0a5a, 0x0a17, /* ਗ਼ ਗ */ + 0x0a5b, 0x0a1c, /* ਜ਼ ਜ */ + 0x0a5e, 0x0a2b, /* ਫ਼ ਫ */ + 0x0b5c, 0x0b21, /* ଡ଼ ଡ */ + 0x0b5d, 0x0b22, /* ଢ଼ ଢ */ + 0x0b94, 0x0b92, /* ஔ ஒ */ + 0x0f43, 0x0f42, /* གྷ ག */ + 0x0f4d, 0x0f4c, /* ཌྷ ཌ */ + 0x0f52, 0x0f51, /* དྷ ད */ + 0x0f57, 0x0f56, /* བྷ བ */ + 0x0f5c, 0x0f5b, /* ཛྷ ཛ */ + 0x0f69, 0x0f40, /* ཀྵ ཀ */ + 0x1026, 0x1025, /* ဦ ဥ */ + 0x1b06, 0x1b05, /* ᬆ ᬅ */ + 0x1b08, 0x1b07, /* ᬈ ᬇ */ + 0x1b0a, 0x1b09, /* ᬊ ᬉ */ + 0x1b0c, 0x1b0b, /* ᬌ ᬋ */ + 0x1b0e, 0x1b0d, /* ᬎ ᬍ */ + 0x1b12, 0x1b11, /* ᬒ ᬑ */ + 0x1e00, 0x0041, /* Ḁ A */ + 0x1e01, 0x0061, /* ḁ a */ + 0x1e02, 0x0042, /* Ḃ B */ + 0x1e03, 0x0062, /* ḃ b */ + 0x1e04, 0x0042, /* Ḅ B */ + 0x1e05, 0x0062, /* ḅ b */ + 0x1e06, 0x0042, /* Ḇ B */ + 0x1e07, 0x0062, /* ḇ b */ + 0x1e08, 0x0043, /* Ḉ C */ + 0x1e09, 0x0063, /* ḉ c */ + 0x1e0a, 0x0044, /* Ḋ D */ + 0x1e0b, 0x0064, /* ḋ d */ + 0x1e0c, 0x0044, /* Ḍ D */ + 0x1e0d, 0x0064, /* ḍ d */ + 0x1e0e, 0x0044, /* Ḏ D */ + 0x1e0f, 0x0064, /* ḏ d */ + 0x1e10, 0x0044, /* Ḑ D */ + 0x1e11, 0x0064, /* ḑ d */ + 0x1e12, 0x0044, /* Ḓ D */ + 0x1e13, 0x0064, /* ḓ d */ + 0x1e14, 0x0045, /* Ḕ E */ + 0x1e15, 0x0065, /* ḕ e */ + 0x1e16, 0x0045, /* Ḗ E */ + 0x1e17, 0x0065, /* ḗ e */ + 0x1e18, 0x0045, /* Ḙ E */ + 0x1e19, 0x0065, /* ḙ e */ + 0x1e1a, 0x0045, /* Ḛ E */ + 0x1e1b, 0x0065, /* ḛ e */ + 0x1e1c, 0x0045, /* Ḝ E */ + 0x1e1d, 0x0065, /* ḝ e */ + 0x1e1e, 0x0046, /* Ḟ F */ + 0x1e1f, 0x0066, /* ḟ f */ + 0x1e20, 0x0047, /* Ḡ G */ + 0x1e21, 0x0067, /* ḡ g */ + 0x1e22, 0x0048, /* Ḣ H */ + 0x1e23, 0x0068, /* ḣ h */ + 0x1e24, 0x0048, /* Ḥ H */ + 0x1e25, 0x0068, /* ḥ h */ + 0x1e26, 0x0048, /* Ḧ H */ + 0x1e27, 0x0068, /* ḧ h */ + 0x1e28, 0x0048, /* Ḩ H */ + 0x1e29, 0x0068, /* ḩ h */ + 0x1e2a, 0x0048, /* Ḫ H */ + 0x1e2b, 0x0068, /* ḫ h */ + 0x1e2c, 0x0049, /* Ḭ I */ + 0x1e2d, 0x0069, /* ḭ i */ + 0x1e2e, 0x0049, /* Ḯ I */ + 0x1e2f, 0x0069, /* ḯ i */ + 0x1e30, 0x004b, /* Ḱ K */ + 0x1e31, 0x006b, /* ḱ k */ + 0x1e32, 0x004b, /* Ḳ K */ + 0x1e33, 0x006b, /* ḳ k */ + 0x1e34, 0x004b, /* Ḵ K */ + 0x1e35, 0x006b, /* ḵ k */ + 0x1e36, 0x004c, /* Ḷ L */ + 0x1e37, 0x006c, /* ḷ l */ + 0x1e38, 0x004c, /* Ḹ L */ + 0x1e39, 0x006c, /* ḹ l */ + 0x1e3a, 0x004c, /* Ḻ L */ + 0x1e3b, 0x006c, /* ḻ l */ + 0x1e3c, 0x004c, /* Ḽ L */ + 0x1e3d, 0x006c, /* ḽ l */ + 0x1e3e, 0x004d, /* Ḿ M */ + 0x1e3f, 0x006d, /* ḿ m */ + 0x1e40, 0x004d, /* Ṁ M */ + 0x1e41, 0x006d, /* ṁ m */ + 0x1e42, 0x004d, /* Ṃ M */ + 0x1e43, 0x006d, /* ṃ m */ + 0x1e44, 0x004e, /* Ṅ N */ + 0x1e45, 0x006e, /* ṅ n */ + 0x1e46, 0x004e, /* Ṇ N */ + 0x1e47, 0x006e, /* ṇ n */ + 0x1e48, 0x004e, /* Ṉ N */ + 0x1e49, 0x006e, /* ṉ n */ + 0x1e4a, 0x004e, /* Ṋ N */ + 0x1e4b, 0x006e, /* ṋ n */ + 0x1e4c, 0x004f, /* Ṍ O */ + 0x1e4d, 0x006f, /* ṍ o */ + 0x1e4e, 0x004f, /* Ṏ O */ + 0x1e4f, 0x006f, /* ṏ o */ + 0x1e50, 0x004f, /* Ṑ O */ + 0x1e51, 0x006f, /* ṑ o */ + 0x1e52, 0x004f, /* Ṓ O */ + 0x1e53, 0x006f, /* ṓ o */ + 0x1e54, 0x0050, /* Ṕ P */ + 0x1e55, 0x0070, /* ṕ p */ + 0x1e56, 0x0050, /* Ṗ P */ + 0x1e57, 0x0070, /* ṗ p */ + 0x1e58, 0x0052, /* Ṙ R */ + 0x1e59, 0x0072, /* ṙ r */ + 0x1e5a, 0x0052, /* Ṛ R */ + 0x1e5b, 0x0072, /* ṛ r */ + 0x1e5c, 0x0052, /* Ṝ R */ + 0x1e5d, 0x0072, /* ṝ r */ + 0x1e5e, 0x0052, /* Ṟ R */ + 0x1e5f, 0x0072, /* ṟ r */ + 0x1e60, 0x0053, /* Ṡ S */ + 0x1e61, 0x0073, /* ṡ s */ + 0x1e62, 0x0053, /* Ṣ S */ + 0x1e63, 0x0073, /* ṣ s */ + 0x1e64, 0x0053, /* Ṥ S */ + 0x1e65, 0x0073, /* ṥ s */ + 0x1e66, 0x0053, /* Ṧ S */ + 0x1e67, 0x0073, /* ṧ s */ + 0x1e68, 0x0053, /* Ṩ S */ + 0x1e69, 0x0073, /* ṩ s */ + 0x1e6a, 0x0054, /* Ṫ T */ + 0x1e6b, 0x0074, /* ṫ t */ + 0x1e6c, 0x0054, /* Ṭ T */ + 0x1e6d, 0x0074, /* ṭ t */ + 0x1e6e, 0x0054, /* Ṯ T */ + 0x1e6f, 0x0074, /* ṯ t */ + 0x1e70, 0x0054, /* Ṱ T */ + 0x1e71, 0x0074, /* ṱ t */ + 0x1e72, 0x0055, /* Ṳ U */ + 0x1e73, 0x0075, /* ṳ u */ + 0x1e74, 0x0055, /* Ṵ U */ + 0x1e75, 0x0075, /* ṵ u */ + 0x1e76, 0x0055, /* Ṷ U */ + 0x1e77, 0x0075, /* ṷ u */ + 0x1e78, 0x0055, /* Ṹ U */ + 0x1e79, 0x0075, /* ṹ u */ + 0x1e7a, 0x0055, /* Ṻ U */ + 0x1e7b, 0x0075, /* ṻ u */ + 0x1e7c, 0x0056, /* Ṽ V */ + 0x1e7d, 0x0076, /* ṽ v */ + 0x1e7e, 0x0056, /* Ṿ V */ + 0x1e7f, 0x0076, /* ṿ v */ + 0x1e80, 0x0057, /* Ẁ W */ + 0x1e81, 0x0077, /* ẁ w */ + 0x1e82, 0x0057, /* Ẃ W */ + 0x1e83, 0x0077, /* ẃ w */ + 0x1e84, 0x0057, /* Ẅ W */ + 0x1e85, 0x0077, /* ẅ w */ + 0x1e86, 0x0057, /* Ẇ W */ + 0x1e87, 0x0077, /* ẇ w */ + 0x1e88, 0x0057, /* Ẉ W */ + 0x1e89, 0x0077, /* ẉ w */ + 0x1e8a, 0x0058, /* Ẋ X */ + 0x1e8b, 0x0078, /* ẋ x */ + 0x1e8c, 0x0058, /* Ẍ X */ + 0x1e8d, 0x0078, /* ẍ x */ + 0x1e8e, 0x0059, /* Ẏ Y */ + 0x1e8f, 0x0079, /* ẏ y */ + 0x1e90, 0x005a, /* Ẑ Z */ + 0x1e91, 0x007a, /* ẑ z */ + 0x1e92, 0x005a, /* Ẓ Z */ + 0x1e93, 0x007a, /* ẓ z */ + 0x1e94, 0x005a, /* Ẕ Z */ + 0x1e95, 0x007a, /* ẕ z */ + 0x1e96, 0x0068, /* ẖ h */ + 0x1e97, 0x0074, /* ẗ t */ + 0x1e98, 0x0077, /* ẘ w */ + 0x1e99, 0x0079, /* ẙ y */ + 0x1e9b, 0x017f, /* ẛ ſ */ + 0x1ea0, 0x0041, /* Ạ A */ + 0x1ea1, 0x0061, /* ạ a */ + 0x1ea2, 0x0041, /* Ả A */ + 0x1ea3, 0x0061, /* ả a */ + 0x1ea4, 0x0041, /* Ấ A */ + 0x1ea5, 0x0061, /* ấ a */ + 0x1ea6, 0x0041, /* Ầ A */ + 0x1ea7, 0x0061, /* ầ a */ + 0x1ea8, 0x0041, /* Ẩ A */ + 0x1ea9, 0x0061, /* ẩ a */ + 0x1eaa, 0x0041, /* Ẫ A */ + 0x1eab, 0x0061, /* ẫ a */ + 0x1eac, 0x0041, /* Ậ A */ + 0x1ead, 0x0061, /* ậ a */ + 0x1eae, 0x0041, /* Ắ A */ + 0x1eaf, 0x0061, /* ắ a */ + 0x1eb0, 0x0041, /* Ằ A */ + 0x1eb1, 0x0061, /* ằ a */ + 0x1eb2, 0x0041, /* Ẳ A */ + 0x1eb3, 0x0061, /* ẳ a */ + 0x1eb4, 0x0041, /* Ẵ A */ + 0x1eb5, 0x0061, /* ẵ a */ + 0x1eb6, 0x0041, /* Ặ A */ + 0x1eb7, 0x0061, /* ặ a */ + 0x1eb8, 0x0045, /* Ẹ E */ + 0x1eb9, 0x0065, /* ẹ e */ + 0x1eba, 0x0045, /* Ẻ E */ + 0x1ebb, 0x0065, /* ẻ e */ + 0x1ebc, 0x0045, /* Ẽ E */ + 0x1ebd, 0x0065, /* ẽ e */ + 0x1ebe, 0x0045, /* Ế E */ + 0x1ebf, 0x0065, /* ế e */ + 0x1ec0, 0x0045, /* Ề E */ + 0x1ec1, 0x0065, /* ề e */ + 0x1ec2, 0x0045, /* Ể E */ + 0x1ec3, 0x0065, /* ể e */ + 0x1ec4, 0x0045, /* Ễ E */ + 0x1ec5, 0x0065, /* ễ e */ + 0x1ec6, 0x0045, /* Ệ E */ + 0x1ec7, 0x0065, /* ệ e */ + 0x1ec8, 0x0049, /* Ỉ I */ + 0x1ec9, 0x0069, /* ỉ i */ + 0x1eca, 0x0049, /* Ị I */ + 0x1ecb, 0x0069, /* ị i */ + 0x1ecc, 0x004f, /* Ọ O */ + 0x1ecd, 0x006f, /* ọ o */ + 0x1ece, 0x004f, /* Ỏ O */ + 0x1ecf, 0x006f, /* ỏ o */ + 0x1ed0, 0x004f, /* Ố O */ + 0x1ed1, 0x006f, /* ố o */ + 0x1ed2, 0x004f, /* Ồ O */ + 0x1ed3, 0x006f, /* ồ o */ + 0x1ed4, 0x004f, /* Ổ O */ + 0x1ed5, 0x006f, /* ổ o */ + 0x1ed6, 0x004f, /* Ỗ O */ + 0x1ed7, 0x006f, /* ỗ o */ + 0x1ed8, 0x004f, /* Ộ O */ + 0x1ed9, 0x006f, /* ộ o */ + 0x1eda, 0x004f, /* Ớ O */ + 0x1edb, 0x006f, /* ớ o */ + 0x1edc, 0x004f, /* Ờ O */ + 0x1edd, 0x006f, /* ờ o */ + 0x1ede, 0x004f, /* Ở O */ + 0x1edf, 0x006f, /* ở o */ + 0x1ee0, 0x004f, /* Ỡ O */ + 0x1ee1, 0x006f, /* ỡ o */ + 0x1ee2, 0x004f, /* Ợ O */ + 0x1ee3, 0x006f, /* ợ o */ + 0x1ee4, 0x0055, /* Ụ U */ + 0x1ee5, 0x0075, /* ụ u */ + 0x1ee6, 0x0055, /* Ủ U */ + 0x1ee7, 0x0075, /* ủ u */ + 0x1ee8, 0x0055, /* Ứ U */ + 0x1ee9, 0x0075, /* ứ u */ + 0x1eea, 0x0055, /* Ừ U */ + 0x1eeb, 0x0075, /* ừ u */ + 0x1eec, 0x0055, /* Ử U */ + 0x1eed, 0x0075, /* ử u */ + 0x1eee, 0x0055, /* Ữ U */ + 0x1eef, 0x0075, /* ữ u */ + 0x1ef0, 0x0055, /* Ự U */ + 0x1ef1, 0x0075, /* ự u */ + 0x1ef2, 0x0059, /* Ỳ Y */ + 0x1ef3, 0x0079, /* ỳ y */ + 0x1ef4, 0x0059, /* Ỵ Y */ + 0x1ef5, 0x0079, /* ỵ y */ + 0x1ef6, 0x0059, /* Ỷ Y */ + 0x1ef7, 0x0079, /* ỷ y */ + 0x1ef8, 0x0059, /* Ỹ Y */ + 0x1ef9, 0x0079, /* ỹ y */ + 0x1f00, 0x03b1, /* ἀ α */ + 0x1f01, 0x03b1, /* ἁ α */ + 0x1f02, 0x03b1, /* ἂ α */ + 0x1f03, 0x03b1, /* ἃ α */ + 0x1f04, 0x03b1, /* ἄ α */ + 0x1f05, 0x03b1, /* ἅ α */ + 0x1f06, 0x03b1, /* ἆ α */ + 0x1f07, 0x03b1, /* ἇ α */ + 0x1f08, 0x0391, /* Ἀ Α */ + 0x1f09, 0x0391, /* Ἁ Α */ + 0x1f0a, 0x0391, /* Ἂ Α */ + 0x1f0b, 0x0391, /* Ἃ Α */ + 0x1f0c, 0x0391, /* Ἄ Α */ + 0x1f0d, 0x0391, /* Ἅ Α */ + 0x1f0e, 0x0391, /* Ἆ Α */ + 0x1f0f, 0x0391, /* Ἇ Α */ + 0x1f10, 0x03b5, /* ἐ ε */ + 0x1f11, 0x03b5, /* ἑ ε */ + 0x1f12, 0x03b5, /* ἒ ε */ + 0x1f13, 0x03b5, /* ἓ ε */ + 0x1f14, 0x03b5, /* ἔ ε */ + 0x1f15, 0x03b5, /* ἕ ε */ + 0x1f18, 0x0395, /* Ἐ Ε */ + 0x1f19, 0x0395, /* Ἑ Ε */ + 0x1f1a, 0x0395, /* Ἒ Ε */ + 0x1f1b, 0x0395, /* Ἓ Ε */ + 0x1f1c, 0x0395, /* Ἔ Ε */ + 0x1f1d, 0x0395, /* Ἕ Ε */ + 0x1f20, 0x03b7, /* ἠ η */ + 0x1f21, 0x03b7, /* ἡ η */ + 0x1f22, 0x03b7, /* ἢ η */ + 0x1f23, 0x03b7, /* ἣ η */ + 0x1f24, 0x03b7, /* ἤ η */ + 0x1f25, 0x03b7, /* ἥ η */ + 0x1f26, 0x03b7, /* ἦ η */ + 0x1f27, 0x03b7, /* ἧ η */ + 0x1f28, 0x0397, /* Ἠ Η */ + 0x1f29, 0x0397, /* Ἡ Η */ + 0x1f2a, 0x0397, /* Ἢ Η */ + 0x1f2b, 0x0397, /* Ἣ Η */ + 0x1f2c, 0x0397, /* Ἤ Η */ + 0x1f2d, 0x0397, /* Ἥ Η */ + 0x1f2e, 0x0397, /* Ἦ Η */ + 0x1f2f, 0x0397, /* Ἧ Η */ + 0x1f30, 0x03b9, /* ἰ ι */ + 0x1f31, 0x03b9, /* ἱ ι */ + 0x1f32, 0x03b9, /* ἲ ι */ + 0x1f33, 0x03b9, /* ἳ ι */ + 0x1f34, 0x03b9, /* ἴ ι */ + 0x1f35, 0x03b9, /* ἵ ι */ + 0x1f36, 0x03b9, /* ἶ ι */ + 0x1f37, 0x03b9, /* ἷ ι */ + 0x1f38, 0x0399, /* Ἰ Ι */ + 0x1f39, 0x0399, /* Ἱ Ι */ + 0x1f3a, 0x0399, /* Ἲ Ι */ + 0x1f3b, 0x0399, /* Ἳ Ι */ + 0x1f3c, 0x0399, /* Ἴ Ι */ + 0x1f3d, 0x0399, /* Ἵ Ι */ + 0x1f3e, 0x0399, /* Ἶ Ι */ + 0x1f3f, 0x0399, /* Ἷ Ι */ + 0x1f40, 0x03bf, /* ὀ ο */ + 0x1f41, 0x03bf, /* ὁ ο */ + 0x1f42, 0x03bf, /* ὂ ο */ + 0x1f43, 0x03bf, /* ὃ ο */ + 0x1f44, 0x03bf, /* ὄ ο */ + 0x1f45, 0x03bf, /* ὅ ο */ + 0x1f48, 0x039f, /* Ὀ Ο */ + 0x1f49, 0x039f, /* Ὁ Ο */ + 0x1f4a, 0x039f, /* Ὂ Ο */ + 0x1f4b, 0x039f, /* Ὃ Ο */ + 0x1f4c, 0x039f, /* Ὄ Ο */ + 0x1f4d, 0x039f, /* Ὅ Ο */ + 0x1f50, 0x03c5, /* ὐ υ */ + 0x1f51, 0x03c5, /* ὑ υ */ + 0x1f52, 0x03c5, /* ὒ υ */ + 0x1f53, 0x03c5, /* ὓ υ */ + 0x1f54, 0x03c5, /* ὔ υ */ + 0x1f55, 0x03c5, /* ὕ υ */ + 0x1f56, 0x03c5, /* ὖ υ */ + 0x1f57, 0x03c5, /* ὗ υ */ + 0x1f59, 0x03a5, /* Ὑ Υ */ + 0x1f5b, 0x03a5, /* Ὓ Υ */ + 0x1f5d, 0x03a5, /* Ὕ Υ */ + 0x1f5f, 0x03a5, /* Ὗ Υ */ + 0x1f60, 0x03c9, /* ὠ ω */ + 0x1f61, 0x03c9, /* ὡ ω */ + 0x1f62, 0x03c9, /* ὢ ω */ + 0x1f63, 0x03c9, /* ὣ ω */ + 0x1f64, 0x03c9, /* ὤ ω */ + 0x1f65, 0x03c9, /* ὥ ω */ + 0x1f66, 0x03c9, /* ὦ ω */ + 0x1f67, 0x03c9, /* ὧ ω */ + 0x1f68, 0x03a9, /* Ὠ Ω */ + 0x1f69, 0x03a9, /* Ὡ Ω */ + 0x1f6a, 0x03a9, /* Ὢ Ω */ + 0x1f6b, 0x03a9, /* Ὣ Ω */ + 0x1f6c, 0x03a9, /* Ὤ Ω */ + 0x1f6d, 0x03a9, /* Ὥ Ω */ + 0x1f6e, 0x03a9, /* Ὦ Ω */ + 0x1f6f, 0x03a9, /* Ὧ Ω */ + 0x1f70, 0x03b1, /* ὰ α */ + 0x1f71, 0x03b1, /* ά α */ + 0x1f72, 0x03b5, /* ὲ ε */ + 0x1f73, 0x03b5, /* έ ε */ + 0x1f74, 0x03b7, /* ὴ η */ + 0x1f75, 0x03b7, /* ή η */ + 0x1f76, 0x03b9, /* ὶ ι */ + 0x1f77, 0x03b9, /* ί ι */ + 0x1f78, 0x03bf, /* ὸ ο */ + 0x1f79, 0x03bf, /* ό ο */ + 0x1f7a, 0x03c5, /* ὺ υ */ + 0x1f7b, 0x03c5, /* ύ υ */ + 0x1f7c, 0x03c9, /* ὼ ω */ + 0x1f7d, 0x03c9, /* ώ ω */ + 0x1f80, 0x03b1, /* ᾀ α */ + 0x1f81, 0x03b1, /* ᾁ α */ + 0x1f82, 0x03b1, /* ᾂ α */ + 0x1f83, 0x03b1, /* ᾃ α */ + 0x1f84, 0x03b1, /* ᾄ α */ + 0x1f85, 0x03b1, /* ᾅ α */ + 0x1f86, 0x03b1, /* ᾆ α */ + 0x1f87, 0x03b1, /* ᾇ α */ + 0x1f88, 0x0391, /* ᾈ Α */ + 0x1f89, 0x0391, /* ᾉ Α */ + 0x1f8a, 0x0391, /* ᾊ Α */ + 0x1f8b, 0x0391, /* ᾋ Α */ + 0x1f8c, 0x0391, /* ᾌ Α */ + 0x1f8d, 0x0391, /* ᾍ Α */ + 0x1f8e, 0x0391, /* ᾎ Α */ + 0x1f8f, 0x0391, /* ᾏ Α */ + 0x1f90, 0x03b7, /* ᾐ η */ + 0x1f91, 0x03b7, /* ᾑ η */ + 0x1f92, 0x03b7, /* ᾒ η */ + 0x1f93, 0x03b7, /* ᾓ η */ + 0x1f94, 0x03b7, /* ᾔ η */ + 0x1f95, 0x03b7, /* ᾕ η */ + 0x1f96, 0x03b7, /* ᾖ η */ + 0x1f97, 0x03b7, /* ᾗ η */ + 0x1f98, 0x0397, /* ᾘ Η */ + 0x1f99, 0x0397, /* ᾙ Η */ + 0x1f9a, 0x0397, /* ᾚ Η */ + 0x1f9b, 0x0397, /* ᾛ Η */ + 0x1f9c, 0x0397, /* ᾜ Η */ + 0x1f9d, 0x0397, /* ᾝ Η */ + 0x1f9e, 0x0397, /* ᾞ Η */ + 0x1f9f, 0x0397, /* ᾟ Η */ + 0x1fa0, 0x03c9, /* ᾠ ω */ + 0x1fa1, 0x03c9, /* ᾡ ω */ + 0x1fa2, 0x03c9, /* ᾢ ω */ + 0x1fa3, 0x03c9, /* ᾣ ω */ + 0x1fa4, 0x03c9, /* ᾤ ω */ + 0x1fa5, 0x03c9, /* ᾥ ω */ + 0x1fa6, 0x03c9, /* ᾦ ω */ + 0x1fa7, 0x03c9, /* ᾧ ω */ + 0x1fa8, 0x03a9, /* ᾨ Ω */ + 0x1fa9, 0x03a9, /* ᾩ Ω */ + 0x1faa, 0x03a9, /* ᾪ Ω */ + 0x1fab, 0x03a9, /* ᾫ Ω */ + 0x1fac, 0x03a9, /* ᾬ Ω */ + 0x1fad, 0x03a9, /* ᾭ Ω */ + 0x1fae, 0x03a9, /* ᾮ Ω */ + 0x1faf, 0x03a9, /* ᾯ Ω */ + 0x1fb0, 0x03b1, /* ᾰ α */ + 0x1fb1, 0x03b1, /* ᾱ α */ + 0x1fb2, 0x03b1, /* ᾲ α */ + 0x1fb3, 0x03b1, /* ᾳ α */ + 0x1fb4, 0x03b1, /* ᾴ α */ + 0x1fb6, 0x03b1, /* ᾶ α */ + 0x1fb7, 0x03b1, /* ᾷ α */ + 0x1fb8, 0x0391, /* Ᾰ Α */ + 0x1fb9, 0x0391, /* Ᾱ Α */ + 0x1fba, 0x0391, /* Ὰ Α */ + 0x1fbb, 0x0391, /* Ά Α */ + 0x1fbc, 0x0391, /* ᾼ Α */ + 0x1fbe, 0x03b9, /* ι ι */ + 0x1fc2, 0x03b7, /* ῂ η */ + 0x1fc3, 0x03b7, /* ῃ η */ + 0x1fc4, 0x03b7, /* ῄ η */ + 0x1fc6, 0x03b7, /* ῆ η */ + 0x1fc7, 0x03b7, /* ῇ η */ + 0x1fc8, 0x0395, /* Ὲ Ε */ + 0x1fc9, 0x0395, /* Έ Ε */ + 0x1fca, 0x0397, /* Ὴ Η */ + 0x1fcb, 0x0397, /* Ή Η */ + 0x1fcc, 0x0397, /* ῌ Η */ + 0x1fd0, 0x03b9, /* ῐ ι */ + 0x1fd1, 0x03b9, /* ῑ ι */ + 0x1fd2, 0x03b9, /* ῒ ι */ + 0x1fd3, 0x03b9, /* ΐ ι */ + 0x1fd6, 0x03b9, /* ῖ ι */ + 0x1fd7, 0x03b9, /* ῗ ι */ + 0x1fd8, 0x0399, /* Ῐ Ι */ + 0x1fd9, 0x0399, /* Ῑ Ι */ + 0x1fda, 0x0399, /* Ὶ Ι */ + 0x1fdb, 0x0399, /* Ί Ι */ + 0x1fe0, 0x03c5, /* ῠ υ */ + 0x1fe1, 0x03c5, /* ῡ υ */ + 0x1fe2, 0x03c5, /* ῢ υ */ + 0x1fe3, 0x03c5, /* ΰ υ */ + 0x1fe4, 0x03c1, /* ῤ ρ */ + 0x1fe5, 0x03c1, /* ῥ ρ */ + 0x1fe6, 0x03c5, /* ῦ υ */ + 0x1fe7, 0x03c5, /* ῧ υ */ + 0x1fe8, 0x03a5, /* Ῠ Υ */ + 0x1fe9, 0x03a5, /* Ῡ Υ */ + 0x1fea, 0x03a5, /* Ὺ Υ */ + 0x1feb, 0x03a5, /* Ύ Υ */ + 0x1fec, 0x03a1, /* Ῥ Ρ */ + 0x1ff2, 0x03c9, /* ῲ ω */ + 0x1ff3, 0x03c9, /* ῳ ω */ + 0x1ff4, 0x03c9, /* ῴ ω */ + 0x1ff6, 0x03c9, /* ῶ ω */ + 0x1ff7, 0x03c9, /* ῷ ω */ + 0x1ff8, 0x039f, /* Ὸ Ο */ + 0x1ff9, 0x039f, /* Ό Ο */ + 0x1ffa, 0x03a9, /* Ὼ Ω */ + 0x1ffb, 0x03a9, /* Ώ Ω */ + 0x1ffc, 0x03a9, /* ῼ Ω */ + 0x2126, 0x03a9, /* Ω Ω */ + 0x212a, 0x004b, /* K K */ + 0x212b, 0x0041, /* Å A */ + 0x304c, 0x304b, /* が か */ + 0x304e, 0x304d, /* ぎ き */ + 0x3050, 0x304f, /* ぐ く */ + 0x3052, 0x3051, /* げ け */ + 0x3054, 0x3053, /* ご こ */ + 0x3056, 0x3055, /* ざ さ */ + 0x3058, 0x3057, /* じ し */ + 0x305a, 0x3059, /* ず す */ + 0x305c, 0x305b, /* ぜ せ */ + 0x305e, 0x305d, /* ぞ そ */ + 0x3060, 0x305f, /* だ た */ + 0x3062, 0x3061, /* ぢ ち */ + 0x3065, 0x3064, /* づ つ */ + 0x3067, 0x3066, /* で て */ + 0x3069, 0x3068, /* ど と */ + 0x3070, 0x306f, /* ば は */ + 0x3071, 0x306f, /* ぱ は */ + 0x3073, 0x3072, /* び ひ */ + 0x3074, 0x3072, /* ぴ ひ */ + 0x3076, 0x3075, /* ぶ ふ */ + 0x3077, 0x3075, /* ぷ ふ */ + 0x3079, 0x3078, /* べ へ */ + 0x307a, 0x3078, /* ぺ へ */ + 0x307c, 0x307b, /* ぼ ほ */ + 0x307d, 0x307b, /* ぽ ほ */ + 0x3094, 0x3046, /* ゔ う */ + 0x309e, 0x309d, /* ゞ ゝ */ + 0x30ac, 0x30ab, /* ガ カ */ + 0x30ae, 0x30ad, /* ギ キ */ + 0x30b0, 0x30af, /* グ ク */ + 0x30b2, 0x30b1, /* ゲ ケ */ + 0x30b4, 0x30b3, /* ゴ コ */ + 0x30b6, 0x30b5, /* ザ サ */ + 0x30b8, 0x30b7, /* ジ シ */ + 0x30ba, 0x30b9, /* ズ ス */ + 0x30bc, 0x30bb, /* ゼ セ */ + 0x30be, 0x30bd, /* ゾ ソ */ + 0x30c0, 0x30bf, /* ダ タ */ + 0x30c2, 0x30c1, /* ヂ チ */ + 0x30c5, 0x30c4, /* ヅ ツ */ + 0x30c7, 0x30c6, /* デ テ */ + 0x30c9, 0x30c8, /* ド ト */ + 0x30d0, 0x30cf, /* バ ハ */ + 0x30d1, 0x30cf, /* パ ハ */ + 0x30d3, 0x30d2, /* ビ ヒ */ + 0x30d4, 0x30d2, /* ピ ヒ */ + 0x30d6, 0x30d5, /* ブ フ */ + 0x30d7, 0x30d5, /* プ フ */ + 0x30d9, 0x30d8, /* ベ ヘ */ + 0x30da, 0x30d8, /* ペ ヘ */ + 0x30dc, 0x30db, /* ボ ホ */ + 0x30dd, 0x30db, /* ポ ホ */ + 0x30f4, 0x30a6, /* ヴ ウ */ + 0x30f7, 0x30ef, /* ヷ ワ */ + 0x30f8, 0x30f0, /* ヸ ヰ */ + 0x30f9, 0x30f1, /* ヹ ヱ */ + 0x30fa, 0x30f2, /* ヺ ヲ */ + 0x30fe, 0x30fd, /* ヾ ヽ */ + 0xf900, 0x8c48, /* 豈 豈 */ + 0xf901, 0x66f4, /* 更 更 */ + 0xf902, 0x8eca, /* 車 車 */ + 0xf903, 0x8cc8, /* 賈 賈 */ + 0xf904, 0x6ed1, /* 滑 滑 */ + 0xf905, 0x4e32, /* 串 串 */ + 0xf906, 0x53e5, /* 句 句 */ + 0xf907, 0x9f9c, /* 龜 龜 */ + 0xf908, 0x9f9c, /* 龜 龜 */ + 0xf909, 0x5951, /* 契 契 */ + 0xf90a, 0x91d1, /* 金 金 */ + 0xf90b, 0x5587, /* 喇 喇 */ + 0xf90c, 0x5948, /* 奈 奈 */ + 0xf90d, 0x61f6, /* 懶 懶 */ + 0xf90e, 0x7669, /* 癩 癩 */ + 0xf90f, 0x7f85, /* 羅 羅 */ + 0xf910, 0x863f, /* 蘿 蘿 */ + 0xf911, 0x87ba, /* 螺 螺 */ + 0xf912, 0x88f8, /* 裸 裸 */ + 0xf913, 0x908f, /* 邏 邏 */ + 0xf914, 0x6a02, /* 樂 樂 */ + 0xf915, 0x6d1b, /* 洛 洛 */ + 0xf916, 0x70d9, /* 烙 烙 */ + 0xf917, 0x73de, /* 珞 珞 */ + 0xf918, 0x843d, /* 落 落 */ + 0xf919, 0x916a, /* 酪 酪 */ + 0xf91a, 0x99f1, /* 駱 駱 */ + 0xf91b, 0x4e82, /* 亂 亂 */ + 0xf91c, 0x5375, /* 卵 卵 */ + 0xf91d, 0x6b04, /* 欄 欄 */ + 0xf91e, 0x721b, /* 爛 爛 */ + 0xf91f, 0x862d, /* 蘭 蘭 */ + 0xf920, 0x9e1e, /* 鸞 鸞 */ + 0xf921, 0x5d50, /* 嵐 嵐 */ + 0xf922, 0x6feb, /* 濫 濫 */ + 0xf923, 0x85cd, /* 藍 藍 */ + 0xf924, 0x8964, /* 襤 襤 */ + 0xf925, 0x62c9, /* 拉 拉 */ + 0xf926, 0x81d8, /* 臘 臘 */ + 0xf927, 0x881f, /* 蠟 蠟 */ + 0xf928, 0x5eca, /* 廊 廊 */ + 0xf929, 0x6717, /* 朗 朗 */ + 0xf92a, 0x6d6a, /* 浪 浪 */ + 0xf92b, 0x72fc, /* 狼 狼 */ + 0xf92c, 0x90ce, /* 郎 郎 */ + 0xf92d, 0x4f86, /* 來 來 */ + 0xf92e, 0x51b7, /* 冷 冷 */ + 0xf92f, 0x52de, /* 勞 勞 */ + 0xf930, 0x64c4, /* 擄 擄 */ + 0xf931, 0x6ad3, /* 櫓 櫓 */ + 0xf932, 0x7210, /* 爐 爐 */ + 0xf933, 0x76e7, /* 盧 盧 */ + 0xf934, 0x8001, /* 老 老 */ + 0xf935, 0x8606, /* 蘆 蘆 */ + 0xf936, 0x865c, /* 虜 虜 */ + 0xf937, 0x8def, /* 路 路 */ + 0xf938, 0x9732, /* 露 露 */ + 0xf939, 0x9b6f, /* 魯 魯 */ + 0xf93a, 0x9dfa, /* 鷺 鷺 */ + 0xf93b, 0x788c, /* 碌 碌 */ + 0xf93c, 0x797f, /* 祿 祿 */ + 0xf93d, 0x7da0, /* 綠 綠 */ + 0xf93e, 0x83c9, /* 菉 菉 */ + 0xf93f, 0x9304, /* 錄 錄 */ + 0xf940, 0x9e7f, /* 鹿 鹿 */ + 0xf941, 0x8ad6, /* 論 論 */ + 0xf942, 0x58df, /* 壟 壟 */ + 0xf943, 0x5f04, /* 弄 弄 */ + 0xf944, 0x7c60, /* 籠 籠 */ + 0xf945, 0x807e, /* 聾 聾 */ + 0xf946, 0x7262, /* 牢 牢 */ + 0xf947, 0x78ca, /* 磊 磊 */ + 0xf948, 0x8cc2, /* 賂 賂 */ + 0xf949, 0x96f7, /* 雷 雷 */ + 0xf94a, 0x58d8, /* 壘 壘 */ + 0xf94b, 0x5c62, /* 屢 屢 */ + 0xf94c, 0x6a13, /* 樓 樓 */ + 0xf94d, 0x6dda, /* 淚 淚 */ + 0xf94e, 0x6f0f, /* 漏 漏 */ + 0xf94f, 0x7d2f, /* 累 累 */ + 0xf950, 0x7e37, /* 縷 縷 */ + 0xf951, 0x964b, /* 陋 陋 */ + 0xf952, 0x52d2, /* 勒 勒 */ + 0xf953, 0x808b, /* 肋 肋 */ + 0xf954, 0x51dc, /* 凜 凜 */ + 0xf955, 0x51cc, /* 凌 凌 */ + 0xf956, 0x7a1c, /* 稜 稜 */ + 0xf957, 0x7dbe, /* 綾 綾 */ + 0xf958, 0x83f1, /* 菱 菱 */ + 0xf959, 0x9675, /* 陵 陵 */ + 0xf95a, 0x8b80, /* 讀 讀 */ + 0xf95b, 0x62cf, /* 拏 拏 */ + 0xf95c, 0x6a02, /* 樂 樂 */ + 0xf95d, 0x8afe, /* 諾 諾 */ + 0xf95e, 0x4e39, /* 丹 丹 */ + 0xf95f, 0x5be7, /* 寧 寧 */ + 0xf960, 0x6012, /* 怒 怒 */ + 0xf961, 0x7387, /* 率 率 */ + 0xf962, 0x7570, /* 異 異 */ + 0xf963, 0x5317, /* 北 北 */ + 0xf964, 0x78fb, /* 磻 磻 */ + 0xf965, 0x4fbf, /* 便 便 */ + 0xf966, 0x5fa9, /* 復 復 */ + 0xf967, 0x4e0d, /* 不 不 */ + 0xf968, 0x6ccc, /* 泌 泌 */ + 0xf969, 0x6578, /* 數 數 */ + 0xf96a, 0x7d22, /* 索 索 */ + 0xf96b, 0x53c3, /* 參 參 */ + 0xf96c, 0x585e, /* 塞 塞 */ + 0xf96d, 0x7701, /* 省 省 */ + 0xf96e, 0x8449, /* 葉 葉 */ + 0xf96f, 0x8aaa, /* 說 說 */ + 0xf970, 0x6bba, /* 殺 殺 */ + 0xf971, 0x8fb0, /* 辰 辰 */ + 0xf972, 0x6c88, /* 沈 沈 */ + 0xf973, 0x62fe, /* 拾 拾 */ + 0xf974, 0x82e5, /* 若 若 */ + 0xf975, 0x63a0, /* 掠 掠 */ + 0xf976, 0x7565, /* 略 略 */ + 0xf977, 0x4eae, /* 亮 亮 */ + 0xf978, 0x5169, /* 兩 兩 */ + 0xf979, 0x51c9, /* 凉 凉 */ + 0xf97a, 0x6881, /* 梁 梁 */ + 0xf97b, 0x7ce7, /* 糧 糧 */ + 0xf97c, 0x826f, /* 良 良 */ + 0xf97d, 0x8ad2, /* 諒 諒 */ + 0xf97e, 0x91cf, /* 量 量 */ + 0xf97f, 0x52f5, /* 勵 勵 */ + 0xf980, 0x5442, /* 呂 呂 */ + 0xf981, 0x5973, /* 女 女 */ + 0xf982, 0x5eec, /* 廬 廬 */ + 0xf983, 0x65c5, /* 旅 旅 */ + 0xf984, 0x6ffe, /* 濾 濾 */ + 0xf985, 0x792a, /* 礪 礪 */ + 0xf986, 0x95ad, /* 閭 閭 */ + 0xf987, 0x9a6a, /* 驪 驪 */ + 0xf988, 0x9e97, /* 麗 麗 */ + 0xf989, 0x9ece, /* 黎 黎 */ + 0xf98a, 0x529b, /* 力 力 */ + 0xf98b, 0x66c6, /* 曆 曆 */ + 0xf98c, 0x6b77, /* 歷 歷 */ + 0xf98d, 0x8f62, /* 轢 轢 */ + 0xf98e, 0x5e74, /* 年 年 */ + 0xf98f, 0x6190, /* 憐 憐 */ + 0xf990, 0x6200, /* 戀 戀 */ + 0xf991, 0x649a, /* 撚 撚 */ + 0xf992, 0x6f23, /* 漣 漣 */ + 0xf993, 0x7149, /* 煉 煉 */ + 0xf994, 0x7489, /* 璉 璉 */ + 0xf995, 0x79ca, /* 秊 秊 */ + 0xf996, 0x7df4, /* 練 練 */ + 0xf997, 0x806f, /* 聯 聯 */ + 0xf998, 0x8f26, /* 輦 輦 */ + 0xf999, 0x84ee, /* 蓮 蓮 */ + 0xf99a, 0x9023, /* 連 連 */ + 0xf99b, 0x934a, /* 鍊 鍊 */ + 0xf99c, 0x5217, /* 列 列 */ + 0xf99d, 0x52a3, /* 劣 劣 */ + 0xf99e, 0x54bd, /* 咽 咽 */ + 0xf99f, 0x70c8, /* 烈 烈 */ + 0xf9a0, 0x88c2, /* 裂 裂 */ + 0xf9a1, 0x8aaa, /* 說 說 */ + 0xf9a2, 0x5ec9, /* 廉 廉 */ + 0xf9a3, 0x5ff5, /* 念 念 */ + 0xf9a4, 0x637b, /* 捻 捻 */ + 0xf9a5, 0x6bae, /* 殮 殮 */ + 0xf9a6, 0x7c3e, /* 簾 簾 */ + 0xf9a7, 0x7375, /* 獵 獵 */ + 0xf9a8, 0x4ee4, /* 令 令 */ + 0xf9a9, 0x56f9, /* 囹 囹 */ + 0xf9aa, 0x5be7, /* 寧 寧 */ + 0xf9ab, 0x5dba, /* 嶺 嶺 */ + 0xf9ac, 0x601c, /* 怜 怜 */ + 0xf9ad, 0x73b2, /* 玲 玲 */ + 0xf9ae, 0x7469, /* 瑩 瑩 */ + 0xf9af, 0x7f9a, /* 羚 羚 */ + 0xf9b0, 0x8046, /* 聆 聆 */ + 0xf9b1, 0x9234, /* 鈴 鈴 */ + 0xf9b2, 0x96f6, /* 零 零 */ + 0xf9b3, 0x9748, /* 靈 靈 */ + 0xf9b4, 0x9818, /* 領 領 */ + 0xf9b5, 0x4f8b, /* 例 例 */ + 0xf9b6, 0x79ae, /* 禮 禮 */ + 0xf9b7, 0x91b4, /* 醴 醴 */ + 0xf9b8, 0x96b8, /* 隸 隸 */ + 0xf9b9, 0x60e1, /* 惡 惡 */ + 0xf9ba, 0x4e86, /* 了 了 */ + 0xf9bb, 0x50da, /* 僚 僚 */ + 0xf9bc, 0x5bee, /* 寮 寮 */ + 0xf9bd, 0x5c3f, /* 尿 尿 */ + 0xf9be, 0x6599, /* 料 料 */ + 0xf9bf, 0x6a02, /* 樂 樂 */ + 0xf9c0, 0x71ce, /* 燎 燎 */ + 0xf9c1, 0x7642, /* 療 療 */ + 0xf9c2, 0x84fc, /* 蓼 蓼 */ + 0xf9c3, 0x907c, /* 遼 遼 */ + 0xf9c4, 0x9f8d, /* 龍 龍 */ + 0xf9c5, 0x6688, /* 暈 暈 */ + 0xf9c6, 0x962e, /* 阮 阮 */ + 0xf9c7, 0x5289, /* 劉 劉 */ + 0xf9c8, 0x677b, /* 杻 杻 */ + 0xf9c9, 0x67f3, /* 柳 柳 */ + 0xf9ca, 0x6d41, /* 流 流 */ + 0xf9cb, 0x6e9c, /* 溜 溜 */ + 0xf9cc, 0x7409, /* 琉 琉 */ + 0xf9cd, 0x7559, /* 留 留 */ + 0xf9ce, 0x786b, /* 硫 硫 */ + 0xf9cf, 0x7d10, /* 紐 紐 */ + 0xf9d0, 0x985e, /* 類 類 */ + 0xf9d1, 0x516d, /* 六 六 */ + 0xf9d2, 0x622e, /* 戮 戮 */ + 0xf9d3, 0x9678, /* 陸 陸 */ + 0xf9d4, 0x502b, /* 倫 倫 */ + 0xf9d5, 0x5d19, /* 崙 崙 */ + 0xf9d6, 0x6dea, /* 淪 淪 */ + 0xf9d7, 0x8f2a, /* 輪 輪 */ + 0xf9d8, 0x5f8b, /* 律 律 */ + 0xf9d9, 0x6144, /* 慄 慄 */ + 0xf9da, 0x6817, /* 栗 栗 */ + 0xf9db, 0x7387, /* 率 率 */ + 0xf9dc, 0x9686, /* 隆 隆 */ + 0xf9dd, 0x5229, /* 利 利 */ + 0xf9de, 0x540f, /* 吏 吏 */ + 0xf9df, 0x5c65, /* 履 履 */ + 0xf9e0, 0x6613, /* 易 易 */ + 0xf9e1, 0x674e, /* 李 李 */ + 0xf9e2, 0x68a8, /* 梨 梨 */ + 0xf9e3, 0x6ce5, /* 泥 泥 */ + 0xf9e4, 0x7406, /* 理 理 */ + 0xf9e5, 0x75e2, /* 痢 痢 */ + 0xf9e6, 0x7f79, /* 罹 罹 */ + 0xf9e7, 0x88cf, /* 裏 裏 */ + 0xf9e8, 0x88e1, /* 裡 裡 */ + 0xf9e9, 0x91cc, /* 里 里 */ + 0xf9ea, 0x96e2, /* 離 離 */ + 0xf9eb, 0x533f, /* 匿 匿 */ + 0xf9ec, 0x6eba, /* 溺 溺 */ + 0xf9ed, 0x541d, /* 吝 吝 */ + 0xf9ee, 0x71d0, /* 燐 燐 */ + 0xf9ef, 0x7498, /* 璘 璘 */ + 0xf9f0, 0x85fa, /* 藺 藺 */ + 0xf9f1, 0x96a3, /* 隣 隣 */ + 0xf9f2, 0x9c57, /* 鱗 鱗 */ + 0xf9f3, 0x9e9f, /* 麟 麟 */ + 0xf9f4, 0x6797, /* 林 林 */ + 0xf9f5, 0x6dcb, /* 淋 淋 */ + 0xf9f6, 0x81e8, /* 臨 臨 */ + 0xf9f7, 0x7acb, /* 立 立 */ + 0xf9f8, 0x7b20, /* 笠 笠 */ + 0xf9f9, 0x7c92, /* 粒 粒 */ + 0xf9fa, 0x72c0, /* 狀 狀 */ + 0xf9fb, 0x7099, /* 炙 炙 */ + 0xf9fc, 0x8b58, /* 識 識 */ + 0xf9fd, 0x4ec0, /* 什 什 */ + 0xf9fe, 0x8336, /* 茶 茶 */ + 0xf9ff, 0x523a, /* 刺 刺 */ + 0xfa00, 0x5207, /* 切 切 */ + 0xfa01, 0x5ea6, /* 度 度 */ + 0xfa02, 0x62d3, /* 拓 拓 */ + 0xfa03, 0x7cd6, /* 糖 糖 */ + 0xfa04, 0x5b85, /* 宅 宅 */ + 0xfa05, 0x6d1e, /* 洞 洞 */ + 0xfa06, 0x66b4, /* 暴 暴 */ + 0xfa07, 0x8f3b, /* 輻 輻 */ + 0xfa08, 0x884c, /* 行 行 */ + 0xfa09, 0x964d, /* 降 降 */ + 0xfa0a, 0x898b, /* 見 見 */ + 0xfa0b, 0x5ed3, /* 廓 廓 */ + 0xfa0c, 0x5140, /* 兀 兀 */ + 0xfa0d, 0x55c0, /* 嗀 嗀 */ + 0xfa10, 0x585a, /* 塚 塚 */ + 0xfa12, 0x6674, /* 晴 晴 */ + 0xfa15, 0x51de, /* 凞 凞 */ + 0xfa16, 0x732a, /* 猪 猪 */ + 0xfa17, 0x76ca, /* 益 益 */ + 0xfa18, 0x793c, /* 礼 礼 */ + 0xfa19, 0x795e, /* 神 神 */ + 0xfa1a, 0x7965, /* 祥 祥 */ + 0xfa1b, 0x798f, /* 福 福 */ + 0xfa1c, 0x9756, /* 靖 靖 */ + 0xfa1d, 0x7cbe, /* 精 精 */ + 0xfa1e, 0x7fbd, /* 羽 羽 */ + 0xfa20, 0x8612, /* 蘒 蘒 */ + 0xfa22, 0x8af8, /* 諸 諸 */ + 0xfa25, 0x9038, /* 逸 逸 */ + 0xfa26, 0x90fd, /* 都 都 */ + 0xfa2a, 0x98ef, /* 飯 飯 */ + 0xfa2b, 0x98fc, /* 飼 飼 */ + 0xfa2c, 0x9928, /* 館 館 */ + 0xfa2d, 0x9db4, /* 鶴 鶴 */ + 0xfa2e, 0x90de, /* 郞 郞 */ + 0xfa2f, 0x96b7, /* 隷 隷 */ + 0xfa30, 0x4fae, /* 侮 侮 */ + 0xfa31, 0x50e7, /* 僧 僧 */ + 0xfa32, 0x514d, /* 免 免 */ + 0xfa33, 0x52c9, /* 勉 勉 */ + 0xfa34, 0x52e4, /* 勤 勤 */ + 0xfa35, 0x5351, /* 卑 卑 */ + 0xfa36, 0x559d, /* 喝 喝 */ + 0xfa37, 0x5606, /* 嘆 嘆 */ + 0xfa38, 0x5668, /* 器 器 */ + 0xfa39, 0x5840, /* 塀 塀 */ + 0xfa3a, 0x58a8, /* 墨 墨 */ + 0xfa3b, 0x5c64, /* 層 層 */ + 0xfa3c, 0x5c6e, /* 屮 屮 */ + 0xfa3d, 0x6094, /* 悔 悔 */ + 0xfa3e, 0x6168, /* 慨 慨 */ + 0xfa3f, 0x618e, /* 憎 憎 */ + 0xfa40, 0x61f2, /* 懲 懲 */ + 0xfa41, 0x654f, /* 敏 敏 */ + 0xfa42, 0x65e2, /* 既 既 */ + 0xfa43, 0x6691, /* 暑 暑 */ + 0xfa44, 0x6885, /* 梅 梅 */ + 0xfa45, 0x6d77, /* 海 海 */ + 0xfa46, 0x6e1a, /* 渚 渚 */ + 0xfa47, 0x6f22, /* 漢 漢 */ + 0xfa48, 0x716e, /* 煮 煮 */ + 0xfa49, 0x722b, /* 爫 爫 */ + 0xfa4a, 0x7422, /* 琢 琢 */ + 0xfa4b, 0x7891, /* 碑 碑 */ + 0xfa4c, 0x793e, /* 社 社 */ + 0xfa4d, 0x7949, /* 祉 祉 */ + 0xfa4e, 0x7948, /* 祈 祈 */ + 0xfa4f, 0x7950, /* 祐 祐 */ + 0xfa50, 0x7956, /* 祖 祖 */ + 0xfa51, 0x795d, /* 祝 祝 */ + 0xfa52, 0x798d, /* 禍 禍 */ + 0xfa53, 0x798e, /* 禎 禎 */ + 0xfa54, 0x7a40, /* 穀 穀 */ + 0xfa55, 0x7a81, /* 突 突 */ + 0xfa56, 0x7bc0, /* 節 節 */ + 0xfa57, 0x7df4, /* 練 練 */ + 0xfa58, 0x7e09, /* 縉 縉 */ + 0xfa59, 0x7e41, /* 繁 繁 */ + 0xfa5a, 0x7f72, /* 署 署 */ + 0xfa5b, 0x8005, /* 者 者 */ + 0xfa5c, 0x81ed, /* 臭 臭 */ + 0xfa5d, 0x8279, /* 艹 艹 */ + 0xfa5e, 0x8279, /* 艹 艹 */ + 0xfa5f, 0x8457, /* 著 著 */ + 0xfa60, 0x8910, /* 褐 褐 */ + 0xfa61, 0x8996, /* 視 視 */ + 0xfa62, 0x8b01, /* 謁 謁 */ + 0xfa63, 0x8b39, /* 謹 謹 */ + 0xfa64, 0x8cd3, /* 賓 賓 */ + 0xfa65, 0x8d08, /* 贈 贈 */ + 0xfa66, 0x8fb6, /* 辶 辶 */ + 0xfa67, 0x9038, /* 逸 逸 */ + 0xfa68, 0x96e3, /* 難 難 */ + 0xfa69, 0x97ff, /* 響 響 */ + 0xfa6a, 0x983b, /* 頻 頻 */ + 0xfa6b, 0x6075, /* 恵 恵 */ + 0xfa6c, 0x242ee, /* 𤋮 ���� */ + 0xfa6d, 0x8218, /* 舘 舘 */ + 0xfa70, 0x4e26, /* 並 並 */ + 0xfa71, 0x51b5, /* 况 况 */ + 0xfa72, 0x5168, /* 全 全 */ + 0xfa73, 0x4f80, /* 侀 侀 */ + 0xfa74, 0x5145, /* 充 充 */ + 0xfa75, 0x5180, /* 冀 冀 */ + 0xfa76, 0x52c7, /* 勇 勇 */ + 0xfa77, 0x52fa, /* 勺 勺 */ + 0xfa78, 0x559d, /* 喝 喝 */ + 0xfa79, 0x5555, /* 啕 啕 */ + 0xfa7a, 0x5599, /* 喙 喙 */ + 0xfa7b, 0x55e2, /* 嗢 嗢 */ + 0xfa7c, 0x585a, /* 塚 塚 */ + 0xfa7d, 0x58b3, /* 墳 墳 */ + 0xfa7e, 0x5944, /* 奄 奄 */ + 0xfa7f, 0x5954, /* 奔 奔 */ + 0xfa80, 0x5a62, /* 婢 婢 */ + 0xfa81, 0x5b28, /* 嬨 嬨 */ + 0xfa82, 0x5ed2, /* 廒 廒 */ + 0xfa83, 0x5ed9, /* 廙 廙 */ + 0xfa84, 0x5f69, /* 彩 彩 */ + 0xfa85, 0x5fad, /* 徭 徭 */ + 0xfa86, 0x60d8, /* 惘 惘 */ + 0xfa87, 0x614e, /* 慎 慎 */ + 0xfa88, 0x6108, /* 愈 愈 */ + 0xfa89, 0x618e, /* 憎 憎 */ + 0xfa8a, 0x6160, /* 慠 慠 */ + 0xfa8b, 0x61f2, /* 懲 懲 */ + 0xfa8c, 0x6234, /* 戴 戴 */ + 0xfa8d, 0x63c4, /* 揄 揄 */ + 0xfa8e, 0x641c, /* 搜 搜 */ + 0xfa8f, 0x6452, /* 摒 摒 */ + 0xfa90, 0x6556, /* 敖 敖 */ + 0xfa91, 0x6674, /* 晴 晴 */ + 0xfa92, 0x6717, /* 朗 朗 */ + 0xfa93, 0x671b, /* 望 望 */ + 0xfa94, 0x6756, /* 杖 杖 */ + 0xfa95, 0x6b79, /* 歹 歹 */ + 0xfa96, 0x6bba, /* 殺 殺 */ + 0xfa97, 0x6d41, /* 流 流 */ + 0xfa98, 0x6edb, /* 滛 滛 */ + 0xfa99, 0x6ecb, /* 滋 滋 */ + 0xfa9a, 0x6f22, /* 漢 漢 */ + 0xfa9b, 0x701e, /* 瀞 瀞 */ + 0xfa9c, 0x716e, /* 煮 煮 */ + 0xfa9d, 0x77a7, /* 瞧 瞧 */ + 0xfa9e, 0x7235, /* 爵 爵 */ + 0xfa9f, 0x72af, /* 犯 犯 */ + 0xfaa0, 0x732a, /* 猪 猪 */ + 0xfaa1, 0x7471, /* 瑱 瑱 */ + 0xfaa2, 0x7506, /* 甆 甆 */ + 0xfaa3, 0x753b, /* 画 画 */ + 0xfaa4, 0x761d, /* 瘝 瘝 */ + 0xfaa5, 0x761f, /* 瘟 瘟 */ + 0xfaa6, 0x76ca, /* 益 益 */ + 0xfaa7, 0x76db, /* 盛 盛 */ + 0xfaa8, 0x76f4, /* 直 直 */ + 0xfaa9, 0x774a, /* 睊 睊 */ + 0xfaaa, 0x7740, /* 着 着 */ + 0xfaab, 0x78cc, /* 磌 磌 */ + 0xfaac, 0x7ab1, /* 窱 窱 */ + 0xfaad, 0x7bc0, /* 節 節 */ + 0xfaae, 0x7c7b, /* 类 类 */ + 0xfaaf, 0x7d5b, /* 絛 絛 */ + 0xfab0, 0x7df4, /* 練 練 */ + 0xfab1, 0x7f3e, /* 缾 缾 */ + 0xfab2, 0x8005, /* 者 者 */ + 0xfab3, 0x8352, /* 荒 荒 */ + 0xfab4, 0x83ef, /* 華 華 */ + 0xfab5, 0x8779, /* 蝹 蝹 */ + 0xfab6, 0x8941, /* 襁 襁 */ + 0xfab7, 0x8986, /* 覆 覆 */ + 0xfab8, 0x8996, /* 視 視 */ + 0xfab9, 0x8abf, /* 調 調 */ + 0xfaba, 0x8af8, /* 諸 諸 */ + 0xfabb, 0x8acb, /* 請 請 */ + 0xfabc, 0x8b01, /* 謁 謁 */ + 0xfabd, 0x8afe, /* 諾 諾 */ + 0xfabe, 0x8aed, /* 諭 諭 */ + 0xfabf, 0x8b39, /* 謹 謹 */ + 0xfac0, 0x8b8a, /* 變 變 */ + 0xfac1, 0x8d08, /* 贈 贈 */ + 0xfac2, 0x8f38, /* 輸 輸 */ + 0xfac3, 0x9072, /* 遲 遲 */ + 0xfac4, 0x9199, /* 醙 醙 */ + 0xfac5, 0x9276, /* 鉶 鉶 */ + 0xfac6, 0x967c, /* 陼 陼 */ + 0xfac7, 0x96e3, /* 難 難 */ + 0xfac8, 0x9756, /* 靖 靖 */ + 0xfac9, 0x97db, /* 韛 韛 */ + 0xfaca, 0x97ff, /* 響 響 */ + 0xfacb, 0x980b, /* 頋 頋 */ + 0xfacc, 0x983b, /* 頻 頻 */ + 0xfacd, 0x9b12, /* 鬒 鬒 */ + 0xface, 0x9f9c, /* 龜 龜 */ + 0xfacf, 0x2284a, /* 𢡊 ���� */ + 0xfad0, 0x22844, /* 𢡄 ���� */ + 0xfad1, 0x233d5, /* 𣏕 ���� */ + 0xfad2, 0x3b9d, /* 㮝 㮝 */ + 0xfad3, 0x4018, /* 䀘 䀘 */ + 0xfad4, 0x4039, /* 䀹 䀹 */ + 0xfad5, 0x25249, /* 𥉉 ���� */ + 0xfad6, 0x25cd0, /* 𥳐 ���� */ + 0xfad7, 0x27ed3, /* 𧻓 ���� */ + 0xfad8, 0x9f43, /* 齃 齃 */ + 0xfad9, 0x9f8e, /* 龎 龎 */ + 0xfb1d, 0x05d9, /* יִ י */ + 0xfb1f, 0x05f2, /* ײַ ײ */ + 0xfb2a, 0x05e9, /* שׁ ש */ + 0xfb2b, 0x05e9, /* שׂ ש */ + 0xfb2c, 0x05e9, /* שּׁ ש */ + 0xfb2d, 0x05e9, /* שּׂ ש */ + 0xfb2e, 0x05d0, /* אַ א */ + 0xfb2f, 0x05d0, /* אָ א */ + 0xfb30, 0x05d0, /* אּ א */ + 0xfb31, 0x05d1, /* בּ ב */ + 0xfb32, 0x05d2, /* גּ ג */ + 0xfb33, 0x05d3, /* דּ ד */ + 0xfb34, 0x05d4, /* הּ ה */ + 0xfb35, 0x05d5, /* וּ ו */ + 0xfb36, 0x05d6, /* זּ ז */ + 0xfb38, 0x05d8, /* טּ ט */ + 0xfb39, 0x05d9, /* יּ י */ + 0xfb3a, 0x05da, /* ךּ ך */ + 0xfb3b, 0x05db, /* כּ כ */ + 0xfb3c, 0x05dc, /* לּ ל */ + 0xfb3e, 0x05de, /* מּ מ */ + 0xfb40, 0x05e0, /* נּ נ */ + 0xfb41, 0x05e1, /* סּ ס */ + 0xfb43, 0x05e3, /* ףּ ף */ + 0xfb44, 0x05e4, /* פּ פ */ + 0xfb46, 0x05e6, /* צּ צ */ + 0xfb47, 0x05e7, /* קּ ק */ + 0xfb48, 0x05e8, /* רּ ר */ + 0xfb49, 0x05e9, /* שּ ש */ + 0xfb4a, 0x05ea, /* תּ ת */ + 0xfb4b, 0x05d5, /* וֹ ו */ + 0xfb4c, 0x05d1, /* בֿ ב */ + 0xfb4d, 0x05db, /* כֿ כ */ + 0xfb4e, 0x05e4, /* פֿ פ */ + 0x1109a, 0x11099, /* ���� ���� */ + 0x1109c, 0x1109b, /* ���� ���� */ + 0x110ab, 0x110a5, /* ���� ���� */ + 0x2f800, 0x4e3d, /* ���� 丽 */ + 0x2f801, 0x4e38, /* ���� 丸 */ + 0x2f802, 0x4e41, /* ���� 乁 */ + 0x2f803, 0x20122, /* ���� ���� */ + 0x2f804, 0x4f60, /* ���� 你 */ + 0x2f805, 0x4fae, /* ���� 侮 */ + 0x2f806, 0x4fbb, /* ���� 侻 */ + 0x2f807, 0x5002, /* ���� 倂 */ + 0x2f808, 0x507a, /* ���� 偺 */ + 0x2f809, 0x5099, /* ���� 備 */ + 0x2f80a, 0x50e7, /* ���� 僧 */ + 0x2f80b, 0x50cf, /* ���� 像 */ + 0x2f80c, 0x349e, /* ���� 㒞 */ + 0x2f80d, 0x2063a, /* ���� ���� */ + 0x2f80e, 0x514d, /* ���� 免 */ + 0x2f80f, 0x5154, /* ���� 兔 */ + 0x2f810, 0x5164, /* ���� 兤 */ + 0x2f811, 0x5177, /* ���� 具 */ + 0x2f812, 0x2051c, /* ���� ���� */ + 0x2f813, 0x34b9, /* ���� 㒹 */ + 0x2f814, 0x5167, /* ���� 內 */ + 0x2f815, 0x518d, /* ���� 再 */ + 0x2f816, 0x2054b, /* ���� ���� */ + 0x2f817, 0x5197, /* ���� 冗 */ + 0x2f818, 0x51a4, /* ���� 冤 */ + 0x2f819, 0x4ecc, /* ���� 仌 */ + 0x2f81a, 0x51ac, /* ���� 冬 */ + 0x2f81b, 0x51b5, /* ���� 况 */ + 0x2f81c, 0x291df, /* ���� ���� */ + 0x2f81d, 0x51f5, /* ���� 凵 */ + 0x2f81e, 0x5203, /* ���� 刃 */ + 0x2f81f, 0x34df, /* ���� 㓟 */ + 0x2f820, 0x523b, /* ���� 刻 */ + 0x2f821, 0x5246, /* ���� 剆 */ + 0x2f822, 0x5272, /* ���� 割 */ + 0x2f823, 0x5277, /* ���� 剷 */ + 0x2f824, 0x3515, /* ���� 㔕 */ + 0x2f825, 0x52c7, /* ���� 勇 */ + 0x2f826, 0x52c9, /* ���� 勉 */ + 0x2f827, 0x52e4, /* ���� 勤 */ + 0x2f828, 0x52fa, /* ���� 勺 */ + 0x2f829, 0x5305, /* ���� 包 */ + 0x2f82a, 0x5306, /* ���� 匆 */ + 0x2f82b, 0x5317, /* ���� 北 */ + 0x2f82c, 0x5349, /* ���� 卉 */ + 0x2f82d, 0x5351, /* ���� 卑 */ + 0x2f82e, 0x535a, /* ���� 博 */ + 0x2f82f, 0x5373, /* ���� 即 */ + 0x2f830, 0x537d, /* ���� 卽 */ + 0x2f831, 0x537f, /* ���� 卿 */ + 0x2f832, 0x537f, /* ���� 卿 */ + 0x2f833, 0x537f, /* ���� 卿 */ + 0x2f834, 0x20a2c, /* ���� ���� */ + 0x2f835, 0x7070, /* ���� 灰 */ + 0x2f836, 0x53ca, /* ���� 及 */ + 0x2f837, 0x53df, /* ���� 叟 */ + 0x2f838, 0x20b63, /* ���� ���� */ + 0x2f839, 0x53eb, /* ���� 叫 */ + 0x2f83a, 0x53f1, /* ���� 叱 */ + 0x2f83b, 0x5406, /* ���� 吆 */ + 0x2f83c, 0x549e, /* ���� 咞 */ + 0x2f83d, 0x5438, /* ���� 吸 */ + 0x2f83e, 0x5448, /* ���� 呈 */ + 0x2f83f, 0x5468, /* ���� 周 */ + 0x2f840, 0x54a2, /* ���� 咢 */ + 0x2f841, 0x54f6, /* ���� 哶 */ + 0x2f842, 0x5510, /* ���� 唐 */ + 0x2f843, 0x5553, /* ���� 啓 */ + 0x2f844, 0x5563, /* ���� 啣 */ + 0x2f845, 0x5584, /* ���� 善 */ + 0x2f846, 0x5584, /* ���� 善 */ + 0x2f847, 0x5599, /* ���� 喙 */ + 0x2f848, 0x55ab, /* ���� 喫 */ + 0x2f849, 0x55b3, /* ���� 喳 */ + 0x2f84a, 0x55c2, /* ���� 嗂 */ + 0x2f84b, 0x5716, /* ���� 圖 */ + 0x2f84c, 0x5606, /* ���� 嘆 */ + 0x2f84d, 0x5717, /* ���� 圗 */ + 0x2f84e, 0x5651, /* ���� 噑 */ + 0x2f84f, 0x5674, /* ���� 噴 */ + 0x2f850, 0x5207, /* ���� 切 */ + 0x2f851, 0x58ee, /* ���� 壮 */ + 0x2f852, 0x57ce, /* ���� 城 */ + 0x2f853, 0x57f4, /* ���� 埴 */ + 0x2f854, 0x580d, /* ���� 堍 */ + 0x2f855, 0x578b, /* ���� 型 */ + 0x2f856, 0x5832, /* ���� 堲 */ + 0x2f857, 0x5831, /* ���� 報 */ + 0x2f858, 0x58ac, /* ���� 墬 */ + 0x2f859, 0x214e4, /* ���� ���� */ + 0x2f85a, 0x58f2, /* ���� 売 */ + 0x2f85b, 0x58f7, /* ���� 壷 */ + 0x2f85c, 0x5906, /* ���� 夆 */ + 0x2f85d, 0x591a, /* ���� 多 */ + 0x2f85e, 0x5922, /* ���� 夢 */ + 0x2f85f, 0x5962, /* ���� 奢 */ + 0x2f860, 0x216a8, /* ���� ���� */ + 0x2f861, 0x216ea, /* ���� ���� */ + 0x2f862, 0x59ec, /* ���� 姬 */ + 0x2f863, 0x5a1b, /* ���� 娛 */ + 0x2f864, 0x5a27, /* ���� 娧 */ + 0x2f865, 0x59d8, /* ���� 姘 */ + 0x2f866, 0x5a66, /* ���� 婦 */ + 0x2f867, 0x36ee, /* ���� 㛮 */ + 0x2f868, 0x36fc, /* ���� 㛼 */ + 0x2f869, 0x5b08, /* ���� 嬈 */ + 0x2f86a, 0x5b3e, /* ���� 嬾 */ + 0x2f86b, 0x5b3e, /* ���� 嬾 */ + 0x2f86c, 0x219c8, /* ���� ���� */ + 0x2f86d, 0x5bc3, /* ���� 寃 */ + 0x2f86e, 0x5bd8, /* ���� 寘 */ + 0x2f86f, 0x5be7, /* ���� 寧 */ + 0x2f870, 0x5bf3, /* ���� 寳 */ + 0x2f871, 0x21b18, /* ���� ���� */ + 0x2f872, 0x5bff, /* ���� 寿 */ + 0x2f873, 0x5c06, /* ���� 将 */ + 0x2f874, 0x5f53, /* ���� 当 */ + 0x2f875, 0x5c22, /* ���� 尢 */ + 0x2f876, 0x3781, /* ���� 㞁 */ + 0x2f877, 0x5c60, /* ���� 屠 */ + 0x2f878, 0x5c6e, /* ���� 屮 */ + 0x2f879, 0x5cc0, /* ���� 峀 */ + 0x2f87a, 0x5c8d, /* ���� 岍 */ + 0x2f87b, 0x21de4, /* ���� ���� */ + 0x2f87c, 0x5d43, /* ���� 嵃 */ + 0x2f87d, 0x21de6, /* ���� ���� */ + 0x2f87e, 0x5d6e, /* ���� 嵮 */ + 0x2f87f, 0x5d6b, /* ���� 嵫 */ + 0x2f880, 0x5d7c, /* ���� 嵼 */ + 0x2f881, 0x5de1, /* ���� 巡 */ + 0x2f882, 0x5de2, /* ���� 巢 */ + 0x2f883, 0x382f, /* ���� 㠯 */ + 0x2f884, 0x5dfd, /* ���� 巽 */ + 0x2f885, 0x5e28, /* ���� 帨 */ + 0x2f886, 0x5e3d, /* ���� 帽 */ + 0x2f887, 0x5e69, /* ���� 幩 */ + 0x2f888, 0x3862, /* ���� 㡢 */ + 0x2f889, 0x22183, /* ���� ���� */ + 0x2f88a, 0x387c, /* ���� 㡼 */ + 0x2f88b, 0x5eb0, /* ���� 庰 */ + 0x2f88c, 0x5eb3, /* ���� 庳 */ + 0x2f88d, 0x5eb6, /* ���� 庶 */ + 0x2f88e, 0x5eca, /* ���� 廊 */ + 0x2f88f, 0x2a392, /* ���� ���� */ + 0x2f890, 0x5efe, /* ���� 廾 */ + 0x2f891, 0x22331, /* ���� ���� */ + 0x2f892, 0x22331, /* ���� ���� */ + 0x2f893, 0x8201, /* ���� 舁 */ + 0x2f894, 0x5f22, /* ���� 弢 */ + 0x2f895, 0x5f22, /* ���� 弢 */ + 0x2f896, 0x38c7, /* ���� 㣇 */ + 0x2f897, 0x232b8, /* ���� ���� */ + 0x2f898, 0x261da, /* ���� ���� */ + 0x2f899, 0x5f62, /* ���� 形 */ + 0x2f89a, 0x5f6b, /* ���� 彫 */ + 0x2f89b, 0x38e3, /* ���� 㣣 */ + 0x2f89c, 0x5f9a, /* ���� 徚 */ + 0x2f89d, 0x5fcd, /* ���� 忍 */ + 0x2f89e, 0x5fd7, /* ���� 志 */ + 0x2f89f, 0x5ff9, /* ���� 忹 */ + 0x2f8a0, 0x6081, /* ���� 悁 */ + 0x2f8a1, 0x393a, /* ���� 㤺 */ + 0x2f8a2, 0x391c, /* ���� 㤜 */ + 0x2f8a3, 0x6094, /* ���� 悔 */ + 0x2f8a4, 0x226d4, /* ���� ���� */ + 0x2f8a5, 0x60c7, /* ���� 惇 */ + 0x2f8a6, 0x6148, /* ���� 慈 */ + 0x2f8a7, 0x614c, /* ���� 慌 */ + 0x2f8a8, 0x614e, /* ���� 慎 */ + 0x2f8a9, 0x614c, /* ���� 慌 */ + 0x2f8aa, 0x617a, /* ���� 慺 */ + 0x2f8ab, 0x618e, /* ���� 憎 */ + 0x2f8ac, 0x61b2, /* ���� 憲 */ + 0x2f8ad, 0x61a4, /* ���� 憤 */ + 0x2f8ae, 0x61af, /* ���� 憯 */ + 0x2f8af, 0x61de, /* ���� 懞 */ + 0x2f8b0, 0x61f2, /* ���� 懲 */ + 0x2f8b1, 0x61f6, /* ���� 懶 */ + 0x2f8b2, 0x6210, /* ���� 成 */ + 0x2f8b3, 0x621b, /* ���� 戛 */ + 0x2f8b4, 0x625d, /* ���� 扝 */ + 0x2f8b5, 0x62b1, /* ���� 抱 */ + 0x2f8b6, 0x62d4, /* ���� 拔 */ + 0x2f8b7, 0x6350, /* ���� 捐 */ + 0x2f8b8, 0x22b0c, /* ���� ���� */ + 0x2f8b9, 0x633d, /* ���� 挽 */ + 0x2f8ba, 0x62fc, /* ���� 拼 */ + 0x2f8bb, 0x6368, /* ���� 捨 */ + 0x2f8bc, 0x6383, /* ���� 掃 */ + 0x2f8bd, 0x63e4, /* ���� 揤 */ + 0x2f8be, 0x22bf1, /* ���� ���� */ + 0x2f8bf, 0x6422, /* ���� 搢 */ + 0x2f8c0, 0x63c5, /* ���� 揅 */ + 0x2f8c1, 0x63a9, /* ���� 掩 */ + 0x2f8c2, 0x3a2e, /* ���� 㨮 */ + 0x2f8c3, 0x6469, /* ���� 摩 */ + 0x2f8c4, 0x647e, /* ���� 摾 */ + 0x2f8c5, 0x649d, /* ���� 撝 */ + 0x2f8c6, 0x6477, /* ���� 摷 */ + 0x2f8c7, 0x3a6c, /* ���� 㩬 */ + 0x2f8c8, 0x654f, /* ���� 敏 */ + 0x2f8c9, 0x656c, /* ���� 敬 */ + 0x2f8ca, 0x2300a, /* ���� ���� */ + 0x2f8cb, 0x65e3, /* ���� 旣 */ + 0x2f8cc, 0x66f8, /* ���� 書 */ + 0x2f8cd, 0x6649, /* ���� 晉 */ + 0x2f8ce, 0x3b19, /* ���� 㬙 */ + 0x2f8cf, 0x6691, /* ���� 暑 */ + 0x2f8d0, 0x3b08, /* ���� 㬈 */ + 0x2f8d1, 0x3ae4, /* ���� 㫤 */ + 0x2f8d2, 0x5192, /* ���� 冒 */ + 0x2f8d3, 0x5195, /* ���� 冕 */ + 0x2f8d4, 0x6700, /* ���� 最 */ + 0x2f8d5, 0x669c, /* ���� 暜 */ + 0x2f8d6, 0x80ad, /* ���� 肭 */ + 0x2f8d7, 0x43d9, /* ���� 䏙 */ + 0x2f8d8, 0x6717, /* ���� 朗 */ + 0x2f8d9, 0x671b, /* ���� 望 */ + 0x2f8da, 0x6721, /* ���� 朡 */ + 0x2f8db, 0x675e, /* ���� 杞 */ + 0x2f8dc, 0x6753, /* ���� 杓 */ + 0x2f8dd, 0x233c3, /* ���� ���� */ + 0x2f8de, 0x3b49, /* ���� 㭉 */ + 0x2f8df, 0x67fa, /* ���� 柺 */ + 0x2f8e0, 0x6785, /* ���� 枅 */ + 0x2f8e1, 0x6852, /* ���� 桒 */ + 0x2f8e2, 0x6885, /* ���� 梅 */ + 0x2f8e3, 0x2346d, /* ���� ���� */ + 0x2f8e4, 0x688e, /* ���� 梎 */ + 0x2f8e5, 0x681f, /* ���� 栟 */ + 0x2f8e6, 0x6914, /* ���� 椔 */ + 0x2f8e7, 0x3b9d, /* ���� 㮝 */ + 0x2f8e8, 0x6942, /* ���� 楂 */ + 0x2f8e9, 0x69a3, /* ���� 榣 */ + 0x2f8ea, 0x69ea, /* ���� 槪 */ + 0x2f8eb, 0x6aa8, /* ���� 檨 */ + 0x2f8ec, 0x236a3, /* ���� ���� */ + 0x2f8ed, 0x6adb, /* ���� 櫛 */ + 0x2f8ee, 0x3c18, /* ���� 㰘 */ + 0x2f8ef, 0x6b21, /* ���� 次 */ + 0x2f8f0, 0x238a7, /* ���� ���� */ + 0x2f8f1, 0x6b54, /* ���� 歔 */ + 0x2f8f2, 0x3c4e, /* ���� 㱎 */ + 0x2f8f3, 0x6b72, /* ���� 歲 */ + 0x2f8f4, 0x6b9f, /* ���� 殟 */ + 0x2f8f5, 0x6bba, /* ���� 殺 */ + 0x2f8f6, 0x6bbb, /* ���� 殻 */ + 0x2f8f7, 0x23a8d, /* ���� ���� */ + 0x2f8f8, 0x21d0b, /* ���� ���� */ + 0x2f8f9, 0x23afa, /* ���� ���� */ + 0x2f8fa, 0x6c4e, /* ���� 汎 */ + 0x2f8fb, 0x23cbc, /* ���� ���� */ + 0x2f8fc, 0x6cbf, /* ���� 沿 */ + 0x2f8fd, 0x6ccd, /* ���� 泍 */ + 0x2f8fe, 0x6c67, /* ���� 汧 */ + 0x2f8ff, 0x6d16, /* ���� 洖 */ + 0x2f900, 0x6d3e, /* ���� 派 */ + 0x2f901, 0x6d77, /* ���� 海 */ + 0x2f902, 0x6d41, /* ���� 流 */ + 0x2f903, 0x6d69, /* ���� 浩 */ + 0x2f904, 0x6d78, /* ���� 浸 */ + 0x2f905, 0x6d85, /* ���� 涅 */ + 0x2f906, 0x23d1e, /* ���� ���� */ + 0x2f907, 0x6d34, /* ���� 洴 */ + 0x2f908, 0x6e2f, /* ���� 港 */ + 0x2f909, 0x6e6e, /* ���� 湮 */ + 0x2f90a, 0x3d33, /* ���� 㴳 */ + 0x2f90b, 0x6ecb, /* ���� 滋 */ + 0x2f90c, 0x6ec7, /* ���� 滇 */ + 0x2f90d, 0x23ed1, /* ���� ���� */ + 0x2f90e, 0x6df9, /* ���� 淹 */ + 0x2f90f, 0x6f6e, /* ���� 潮 */ + 0x2f910, 0x23f5e, /* ���� ���� */ + 0x2f911, 0x23f8e, /* ���� ���� */ + 0x2f912, 0x6fc6, /* ���� 濆 */ + 0x2f913, 0x7039, /* ���� 瀹 */ + 0x2f914, 0x701e, /* ���� 瀞 */ + 0x2f915, 0x701b, /* ���� 瀛 */ + 0x2f916, 0x3d96, /* ���� 㶖 */ + 0x2f917, 0x704a, /* ���� 灊 */ + 0x2f918, 0x707d, /* ���� 災 */ + 0x2f919, 0x7077, /* ���� 灷 */ + 0x2f91a, 0x70ad, /* ���� 炭 */ + 0x2f91b, 0x20525, /* ���� ���� */ + 0x2f91c, 0x7145, /* ���� 煅 */ + 0x2f91d, 0x24263, /* ���� ���� */ + 0x2f91e, 0x719c, /* ���� 熜 */ + 0x2f91f, 0x243ab, /* ���� ���� */ + 0x2f920, 0x7228, /* ���� 爨 */ + 0x2f921, 0x7235, /* ���� 爵 */ + 0x2f922, 0x7250, /* ���� 牐 */ + 0x2f923, 0x24608, /* ���� ���� */ + 0x2f924, 0x7280, /* ���� 犀 */ + 0x2f925, 0x7295, /* ���� 犕 */ + 0x2f926, 0x24735, /* ���� ���� */ + 0x2f927, 0x24814, /* ���� ���� */ + 0x2f928, 0x737a, /* ���� 獺 */ + 0x2f929, 0x738b, /* ���� 王 */ + 0x2f92a, 0x3eac, /* ���� 㺬 */ + 0x2f92b, 0x73a5, /* ���� 玥 */ + 0x2f92c, 0x3eb8, /* ���� 㺸 */ + 0x2f92d, 0x3eb8, /* ���� 㺸 */ + 0x2f92e, 0x7447, /* ���� 瑇 */ + 0x2f92f, 0x745c, /* ���� 瑜 */ + 0x2f930, 0x7471, /* ���� 瑱 */ + 0x2f931, 0x7485, /* ���� 璅 */ + 0x2f932, 0x74ca, /* ���� 瓊 */ + 0x2f933, 0x3f1b, /* ���� 㼛 */ + 0x2f934, 0x7524, /* ���� 甤 */ + 0x2f935, 0x24c36, /* ���� ���� */ + 0x2f936, 0x753e, /* ���� 甾 */ + 0x2f937, 0x24c92, /* ���� ���� */ + 0x2f938, 0x7570, /* ���� 異 */ + 0x2f939, 0x2219f, /* ���� ���� */ + 0x2f93a, 0x7610, /* ���� 瘐 */ + 0x2f93b, 0x24fa1, /* ���� ���� */ + 0x2f93c, 0x24fb8, /* ���� ���� */ + 0x2f93d, 0x25044, /* ���� ���� */ + 0x2f93e, 0x3ffc, /* ���� 㿼 */ + 0x2f93f, 0x4008, /* ���� 䀈 */ + 0x2f940, 0x76f4, /* ���� 直 */ + 0x2f941, 0x250f3, /* ���� ���� */ + 0x2f942, 0x250f2, /* ���� ���� */ + 0x2f943, 0x25119, /* ���� ���� */ + 0x2f944, 0x25133, /* ���� ���� */ + 0x2f945, 0x771e, /* ���� 眞 */ + 0x2f946, 0x771f, /* ���� 真 */ + 0x2f947, 0x771f, /* ���� 真 */ + 0x2f948, 0x774a, /* ���� 睊 */ + 0x2f949, 0x4039, /* ���� 䀹 */ + 0x2f94a, 0x778b, /* ���� 瞋 */ + 0x2f94b, 0x4046, /* ���� 䁆 */ + 0x2f94c, 0x4096, /* ���� 䂖 */ + 0x2f94d, 0x2541d, /* ���� ���� */ + 0x2f94e, 0x784e, /* ���� 硎 */ + 0x2f94f, 0x788c, /* ���� 碌 */ + 0x2f950, 0x78cc, /* ���� 磌 */ + 0x2f951, 0x40e3, /* ���� 䃣 */ + 0x2f952, 0x25626, /* ���� ���� */ + 0x2f953, 0x7956, /* ���� 祖 */ + 0x2f954, 0x2569a, /* ���� ���� */ + 0x2f955, 0x256c5, /* ���� ���� */ + 0x2f956, 0x798f, /* ���� 福 */ + 0x2f957, 0x79eb, /* ���� 秫 */ + 0x2f958, 0x412f, /* ���� 䄯 */ + 0x2f959, 0x7a40, /* ���� 穀 */ + 0x2f95a, 0x7a4a, /* ���� 穊 */ + 0x2f95b, 0x7a4f, /* ���� 穏 */ + 0x2f95c, 0x2597c, /* ���� ���� */ + 0x2f95d, 0x25aa7, /* ���� ���� */ + 0x2f95e, 0x25aa7, /* ���� ���� */ + 0x2f95f, 0x7aee, /* ���� 竮 */ + 0x2f960, 0x4202, /* ���� 䈂 */ + 0x2f961, 0x25bab, /* ���� ���� */ + 0x2f962, 0x7bc6, /* ���� 篆 */ + 0x2f963, 0x7bc9, /* ���� 築 */ + 0x2f964, 0x4227, /* ���� 䈧 */ + 0x2f965, 0x25c80, /* ���� ���� */ + 0x2f966, 0x7cd2, /* ���� 糒 */ + 0x2f967, 0x42a0, /* ���� 䊠 */ + 0x2f968, 0x7ce8, /* ���� 糨 */ + 0x2f969, 0x7ce3, /* ���� 糣 */ + 0x2f96a, 0x7d00, /* ���� 紀 */ + 0x2f96b, 0x25f86, /* ���� ���� */ + 0x2f96c, 0x7d63, /* ���� 絣 */ + 0x2f96d, 0x4301, /* ���� 䌁 */ + 0x2f96e, 0x7dc7, /* ���� 緇 */ + 0x2f96f, 0x7e02, /* ���� 縂 */ + 0x2f970, 0x7e45, /* ���� 繅 */ + 0x2f971, 0x4334, /* ���� 䌴 */ + 0x2f972, 0x26228, /* ���� ���� */ + 0x2f973, 0x26247, /* ���� ���� */ + 0x2f974, 0x4359, /* ���� 䍙 */ + 0x2f975, 0x262d9, /* ���� ���� */ + 0x2f976, 0x7f7a, /* ���� 罺 */ + 0x2f977, 0x2633e, /* ���� ���� */ + 0x2f978, 0x7f95, /* ���� 羕 */ + 0x2f979, 0x7ffa, /* ���� 翺 */ + 0x2f97a, 0x8005, /* ���� 者 */ + 0x2f97b, 0x264da, /* ���� ���� */ + 0x2f97c, 0x26523, /* ���� ���� */ + 0x2f97d, 0x8060, /* ���� 聠 */ + 0x2f97e, 0x265a8, /* ���� ���� */ + 0x2f97f, 0x8070, /* ���� 聰 */ + 0x2f980, 0x2335f, /* ���� ���� */ + 0x2f981, 0x43d5, /* ���� 䏕 */ + 0x2f982, 0x80b2, /* ���� 育 */ + 0x2f983, 0x8103, /* ���� 脃 */ + 0x2f984, 0x440b, /* ���� 䐋 */ + 0x2f985, 0x813e, /* ���� 脾 */ + 0x2f986, 0x5ab5, /* ���� 媵 */ + 0x2f987, 0x267a7, /* ���� ���� */ + 0x2f988, 0x267b5, /* ���� ���� */ + 0x2f989, 0x23393, /* ���� ���� */ + 0x2f98a, 0x2339c, /* ���� ���� */ + 0x2f98b, 0x8201, /* ���� 舁 */ + 0x2f98c, 0x8204, /* ���� 舄 */ + 0x2f98d, 0x8f9e, /* ���� 辞 */ + 0x2f98e, 0x446b, /* ���� 䑫 */ + 0x2f98f, 0x8291, /* ���� 芑 */ + 0x2f990, 0x828b, /* ���� 芋 */ + 0x2f991, 0x829d, /* ���� 芝 */ + 0x2f992, 0x52b3, /* ���� 劳 */ + 0x2f993, 0x82b1, /* ���� 花 */ + 0x2f994, 0x82b3, /* ���� 芳 */ + 0x2f995, 0x82bd, /* ���� 芽 */ + 0x2f996, 0x82e6, /* ���� 苦 */ + 0x2f997, 0x26b3c, /* ���� ���� */ + 0x2f998, 0x82e5, /* ���� 若 */ + 0x2f999, 0x831d, /* ���� 茝 */ + 0x2f99a, 0x8363, /* ���� 荣 */ + 0x2f99b, 0x83ad, /* ���� 莭 */ + 0x2f99c, 0x8323, /* ���� 茣 */ + 0x2f99d, 0x83bd, /* ���� 莽 */ + 0x2f99e, 0x83e7, /* ���� 菧 */ + 0x2f99f, 0x8457, /* ���� 著 */ + 0x2f9a0, 0x8353, /* ���� 荓 */ + 0x2f9a1, 0x83ca, /* ���� 菊 */ + 0x2f9a2, 0x83cc, /* ���� 菌 */ + 0x2f9a3, 0x83dc, /* ���� 菜 */ + 0x2f9a4, 0x26c36, /* ���� ���� */ + 0x2f9a5, 0x26d6b, /* ���� ���� */ + 0x2f9a6, 0x26cd5, /* ���� ���� */ + 0x2f9a7, 0x452b, /* ���� 䔫 */ + 0x2f9a8, 0x84f1, /* ���� 蓱 */ + 0x2f9a9, 0x84f3, /* ���� 蓳 */ + 0x2f9aa, 0x8516, /* ���� 蔖 */ + 0x2f9ab, 0x273ca, /* ���� ���� */ + 0x2f9ac, 0x8564, /* ���� 蕤 */ + 0x2f9ad, 0x26f2c, /* ���� ���� */ + 0x2f9ae, 0x455d, /* ���� 䕝 */ + 0x2f9af, 0x4561, /* ���� 䕡 */ + 0x2f9b0, 0x26fb1, /* ���� ���� */ + 0x2f9b1, 0x270d2, /* ���� ���� */ + 0x2f9b2, 0x456b, /* ���� 䕫 */ + 0x2f9b3, 0x8650, /* ���� 虐 */ + 0x2f9b4, 0x865c, /* ���� 虜 */ + 0x2f9b5, 0x8667, /* ���� 虧 */ + 0x2f9b6, 0x8669, /* ���� 虩 */ + 0x2f9b7, 0x86a9, /* ���� 蚩 */ + 0x2f9b8, 0x8688, /* ���� 蚈 */ + 0x2f9b9, 0x870e, /* ���� 蜎 */ + 0x2f9ba, 0x86e2, /* ���� 蛢 */ + 0x2f9bb, 0x8779, /* ���� 蝹 */ + 0x2f9bc, 0x8728, /* ���� 蜨 */ + 0x2f9bd, 0x876b, /* ���� 蝫 */ + 0x2f9be, 0x8786, /* ���� 螆 */ + 0x2f9bf, 0x45d7, /* ���� 䗗 */ + 0x2f9c0, 0x87e1, /* ���� 蟡 */ + 0x2f9c1, 0x8801, /* ���� 蠁 */ + 0x2f9c2, 0x45f9, /* ���� 䗹 */ + 0x2f9c3, 0x8860, /* ���� 衠 */ + 0x2f9c4, 0x8863, /* ���� 衣 */ + 0x2f9c5, 0x27667, /* ���� ���� */ + 0x2f9c6, 0x88d7, /* ���� 裗 */ + 0x2f9c7, 0x88de, /* ���� 裞 */ + 0x2f9c8, 0x4635, /* ���� 䘵 */ + 0x2f9c9, 0x88fa, /* ���� 裺 */ + 0x2f9ca, 0x34bb, /* ���� 㒻 */ + 0x2f9cb, 0x278ae, /* ���� ���� */ + 0x2f9cc, 0x27966, /* ���� ���� */ + 0x2f9cd, 0x46be, /* ���� 䚾 */ + 0x2f9ce, 0x46c7, /* ���� 䛇 */ + 0x2f9cf, 0x8aa0, /* ���� 誠 */ + 0x2f9d0, 0x8aed, /* ���� 諭 */ + 0x2f9d1, 0x8b8a, /* ���� 變 */ + 0x2f9d2, 0x8c55, /* ���� 豕 */ + 0x2f9d3, 0x27ca8, /* ���� ���� */ + 0x2f9d4, 0x8cab, /* ���� 貫 */ + 0x2f9d5, 0x8cc1, /* ���� 賁 */ + 0x2f9d6, 0x8d1b, /* ���� 贛 */ + 0x2f9d7, 0x8d77, /* ���� 起 */ + 0x2f9d8, 0x27f2f, /* ���� ���� */ + 0x2f9d9, 0x20804, /* ���� ���� */ + 0x2f9da, 0x8dcb, /* ���� 跋 */ + 0x2f9db, 0x8dbc, /* ���� 趼 */ + 0x2f9dc, 0x8df0, /* ���� 跰 */ + 0x2f9dd, 0x208de, /* ���� ���� */ + 0x2f9de, 0x8ed4, /* ���� 軔 */ + 0x2f9df, 0x8f38, /* ���� 輸 */ + 0x2f9e0, 0x285d2, /* ���� ���� */ + 0x2f9e1, 0x285ed, /* ���� ���� */ + 0x2f9e2, 0x9094, /* ���� 邔 */ + 0x2f9e3, 0x90f1, /* ���� 郱 */ + 0x2f9e4, 0x9111, /* ���� 鄑 */ + 0x2f9e5, 0x2872e, /* ���� ���� */ + 0x2f9e6, 0x911b, /* ���� 鄛 */ + 0x2f9e7, 0x9238, /* ���� 鈸 */ + 0x2f9e8, 0x92d7, /* ���� 鋗 */ + 0x2f9e9, 0x92d8, /* ���� 鋘 */ + 0x2f9ea, 0x927c, /* ���� 鉼 */ + 0x2f9eb, 0x93f9, /* ���� 鏹 */ + 0x2f9ec, 0x9415, /* ���� 鐕 */ + 0x2f9ed, 0x28bfa, /* ���� ���� */ + 0x2f9ee, 0x958b, /* ���� 開 */ + 0x2f9ef, 0x4995, /* ���� 䦕 */ + 0x2f9f0, 0x95b7, /* ���� 閷 */ + 0x2f9f1, 0x28d77, /* ���� ���� */ + 0x2f9f2, 0x49e6, /* ���� 䧦 */ + 0x2f9f3, 0x96c3, /* ���� 雃 */ + 0x2f9f4, 0x5db2, /* ���� 嶲 */ + 0x2f9f5, 0x9723, /* ���� 霣 */ + 0x2f9f6, 0x29145, /* ���� ���� */ + 0x2f9f7, 0x2921a, /* ���� ���� */ + 0x2f9f8, 0x4a6e, /* ���� 䩮 */ + 0x2f9f9, 0x4a76, /* ���� 䩶 */ + 0x2f9fa, 0x97e0, /* ���� 韠 */ + 0x2f9fb, 0x2940a, /* ���� ���� */ + 0x2f9fc, 0x4ab2, /* ���� 䪲 */ + 0x2f9fd, 0x29496, /* ���� ���� */ + 0x2f9fe, 0x980b, /* ���� 頋 */ + 0x2f9ff, 0x980b, /* ���� 頋 */ + 0x2fa00, 0x9829, /* ���� 頩 */ + 0x2fa01, 0x295b6, /* ���� ���� */ + 0x2fa02, 0x98e2, /* ���� 飢 */ + 0x2fa03, 0x4b33, /* ���� 䬳 */ + 0x2fa04, 0x9929, /* ���� 餩 */ + 0x2fa05, 0x99a7, /* ���� 馧 */ + 0x2fa06, 0x99c2, /* ���� 駂 */ + 0x2fa07, 0x99fe, /* ���� 駾 */ + 0x2fa08, 0x4bce, /* ���� 䯎 */ + 0x2fa09, 0x29b30, /* ���� ���� */ + 0x2fa0a, 0x9b12, /* ���� 鬒 */ + 0x2fa0b, 0x9c40, /* ���� 鱀 */ + 0x2fa0c, 0x9cfd, /* ���� 鳽 */ + 0x2fa0d, 0x4cce, /* ���� 䳎 */ + 0x2fa0e, 0x4ced, /* ���� 䳭 */ + 0x2fa0f, 0x9d67, /* ���� 鵧 */ + 0x2fa10, 0x2a0ce, /* ���� ���� */ + 0x2fa11, 0x4cf8, /* ���� 䳸 */ + 0x2fa12, 0x2a105, /* ���� ���� */ + 0x2fa13, 0x2a20e, /* ���� ���� */ + 0x2fa14, 0x2a291, /* ���� ���� */ + 0x2fa15, 0x9ebb, /* ���� 麻 */ + 0x2fa16, 0x4d56, /* ���� 䵖 */ + 0x2fa17, 0x9ef9, /* ���� 黹 */ + 0x2fa18, 0x9efe, /* ���� 黾 */ + 0x2fa19, 0x9f05, /* ���� 鼅 */ + 0x2fa1a, 0x9f0f, /* ���� 鼏 */ + 0x2fa1b, 0x9f16, /* ���� 鼖 */ + 0x2fa1c, 0x9f3b, /* ���� 鼻 */ +}; + +Rune +tobaserune(Rune c) +{ + Rune *p; + + p = _runebsearch(c, _base2, nelem(_base2)/2, 2); + if(p && c == p[0]) + c = p[1]; + return c; +} + +int +isbaserune(Rune c) +{ + return tobaserune(c) == c; +} --- /sys/src/libc/port/runebsearch.c Thu Jan 1 01:00:00 1970 +++ /sys/src/libc/port/runebsearch.c Thu Apr 25 00:51:53 2013 @@ -0,0 +1,22 @@ +#include +#include + +Rune* +_runebsearch(Rune c, Rune *t, int n, int ne) +{ + Rune *p; + int m; + + while(n > 1) { + m = n/2; + p = t + m*ne; + if(c >= p[0]) { + t = p; + n = n-m; + } else + n = m; + } + if(n && c >= t[0]) + return t; + return 0; +} --- /sys/src/libc/port/runetype.c Sat Jul 24 00:51:03 2010 +++ /sys/src/libc/port/runetype.c Tue Apr 30 22:04:58 2013 @@ -1,1181 +1,6 @@ #include #include -/* - * alpha ranges - - * only covers ranges not in lower||upper - */ -static -Rune _alpha2[] = -{ - 0x00d8, 0x00f6, /* Ø - ö */ - 0x00f8, 0x01f5, /* ø - ǵ */ - 0x0250, 0x02a8, /* ɐ - ʨ */ - 0x038e, 0x03a1, /* Ύ - Ρ */ - 0x03a3, 0x03ce, /* Σ - ώ */ - 0x03d0, 0x03d6, /* ϐ - ϖ */ - 0x03e2, 0x03f3, /* Ϣ - ϳ */ - 0x0490, 0x04c4, /* Ґ - ӄ */ - 0x0561, 0x0587, /* ա - և */ - 0x05d0, 0x05ea, /* א - ת */ - 0x05f0, 0x05f2, /* װ - ײ */ - 0x0621, 0x063a, /* ء - غ */ - 0x0640, 0x064a, /* ـ - ي */ - 0x0671, 0x06b7, /* ٱ - ڷ */ - 0x06ba, 0x06be, /* ں - ھ */ - 0x06c0, 0x06ce, /* ۀ - ێ */ - 0x06d0, 0x06d3, /* ې - ۓ */ - 0x0905, 0x0939, /* अ - ह */ - 0x0958, 0x0961, /* क़ - ॡ */ - 0x0985, 0x098c, /* অ - ঌ */ - 0x098f, 0x0990, /* এ - ঐ */ - 0x0993, 0x09a8, /* ও - ন */ - 0x09aa, 0x09b0, /* প - র */ - 0x09b6, 0x09b9, /* শ - হ */ - 0x09dc, 0x09dd, /* ড় - ঢ় */ - 0x09df, 0x09e1, /* য় - ৡ */ - 0x09f0, 0x09f1, /* ৰ - ৱ */ - 0x0a05, 0x0a0a, /* ਅ - ਊ */ - 0x0a0f, 0x0a10, /* ਏ - ਐ */ - 0x0a13, 0x0a28, /* ਓ - ਨ */ - 0x0a2a, 0x0a30, /* ਪ - ਰ */ - 0x0a32, 0x0a33, /* ਲ - ਲ਼ */ - 0x0a35, 0x0a36, /* ਵ - ਸ਼ */ - 0x0a38, 0x0a39, /* ਸ - ਹ */ - 0x0a59, 0x0a5c, /* ਖ਼ - ੜ */ - 0x0a85, 0x0a8b, /* અ - ઋ */ - 0x0a8f, 0x0a91, /* એ - ઑ */ - 0x0a93, 0x0aa8, /* ઓ - ન */ - 0x0aaa, 0x0ab0, /* પ - ર */ - 0x0ab2, 0x0ab3, /* લ - ળ */ - 0x0ab5, 0x0ab9, /* વ - હ */ - 0x0b05, 0x0b0c, /* ଅ - ଌ */ - 0x0b0f, 0x0b10, /* ଏ - ଐ */ - 0x0b13, 0x0b28, /* ଓ - ନ */ - 0x0b2a, 0x0b30, /* ପ - ର */ - 0x0b32, 0x0b33, /* ଲ - ଳ */ - 0x0b36, 0x0b39, /* ଶ - ହ */ - 0x0b5c, 0x0b5d, /* ଡ଼ - ଢ଼ */ - 0x0b5f, 0x0b61, /* ୟ - ୡ */ - 0x0b85, 0x0b8a, /* அ - ஊ */ - 0x0b8e, 0x0b90, /* எ - ஐ */ - 0x0b92, 0x0b95, /* ஒ - க */ - 0x0b99, 0x0b9a, /* ங - ச */ - 0x0b9e, 0x0b9f, /* ஞ - ட */ - 0x0ba3, 0x0ba4, /* ண - த */ - 0x0ba8, 0x0baa, /* ந - ப */ - 0x0bae, 0x0bb5, /* ம - வ */ - 0x0bb7, 0x0bb9, /* ஷ - ஹ */ - 0x0c05, 0x0c0c, /* అ - ఌ */ - 0x0c0e, 0x0c10, /* ఎ - ఐ */ - 0x0c12, 0x0c28, /* ఒ - న */ - 0x0c2a, 0x0c33, /* ప - ళ */ - 0x0c35, 0x0c39, /* వ - హ */ - 0x0c60, 0x0c61, /* ౠ - ౡ */ - 0x0c85, 0x0c8c, /* ಅ - ಌ */ - 0x0c8e, 0x0c90, /* ಎ - ಐ */ - 0x0c92, 0x0ca8, /* ಒ - ನ */ - 0x0caa, 0x0cb3, /* ಪ - ಳ */ - 0x0cb5, 0x0cb9, /* ವ - ಹ */ - 0x0ce0, 0x0ce1, /* ೠ - ೡ */ - 0x0d05, 0x0d0c, /* അ - ഌ */ - 0x0d0e, 0x0d10, /* എ - ഐ */ - 0x0d12, 0x0d28, /* ഒ - ന */ - 0x0d2a, 0x0d39, /* പ - ഹ */ - 0x0d60, 0x0d61, /* ൠ - ൡ */ - 0x0e01, 0x0e30, /* ก - ะ */ - 0x0e32, 0x0e33, /* า - ำ */ - 0x0e40, 0x0e46, /* เ - ๆ */ - 0x0e5a, 0x0e5b, /* ๚ - ๛ */ - 0x0e81, 0x0e82, /* ກ - ຂ */ - 0x0e87, 0x0e88, /* ງ - ຈ */ - 0x0e94, 0x0e97, /* ດ - ທ */ - 0x0e99, 0x0e9f, /* ນ - ຟ */ - 0x0ea1, 0x0ea3, /* ມ - ຣ */ - 0x0eaa, 0x0eab, /* ສ - ຫ */ - 0x0ead, 0x0eae, /* ອ - ຮ */ - 0x0eb2, 0x0eb3, /* າ - ຳ */ - 0x0ec0, 0x0ec4, /* ເ - ໄ */ - 0x0edc, 0x0edd, /* ໜ - ໝ */ - 0x0f18, 0x0f19, /* ༘ - ༙ */ - 0x0f40, 0x0f47, /* ཀ - ཇ */ - 0x0f49, 0x0f69, /* ཉ - ཀྵ */ - 0x10d0, 0x10f6, /* ა - ჶ */ - 0x1100, 0x1159, /* ᄀ - ᅙ */ - 0x115f, 0x11a2, /* ᅟ - ᆢ */ - 0x11a8, 0x11f9, /* ᆨ - ᇹ */ - 0x1e00, 0x1e9b, /* Ḁ - ẛ */ - 0x1f50, 0x1f57, /* ὐ - ὗ */ - 0x1f80, 0x1fb4, /* ᾀ - ᾴ */ - 0x1fb6, 0x1fbc, /* ᾶ - ᾼ */ - 0x1fc2, 0x1fc4, /* ῂ - ῄ */ - 0x1fc6, 0x1fcc, /* ῆ - ῌ */ - 0x1fd0, 0x1fd3, /* ῐ - ΐ */ - 0x1fd6, 0x1fdb, /* ῖ - Ί */ - 0x1fe0, 0x1fec, /* ῠ - Ῥ */ - 0x1ff2, 0x1ff4, /* ῲ - ῴ */ - 0x1ff6, 0x1ffc, /* ῶ - ῼ */ - 0x210a, 0x2113, /* ℊ - ℓ */ - 0x2115, 0x211d, /* ℕ - ℝ */ - 0x2120, 0x2122, /* ℠ - ™ */ - 0x212a, 0x2131, /* K - ℱ */ - 0x2133, 0x2138, /* ℳ - ℸ */ - 0x3041, 0x3094, /* ぁ - ゔ */ - 0x30a1, 0x30fa, /* ァ - ヺ */ - 0x3105, 0x312c, /* ㄅ - ㄬ */ - 0x3131, 0x318e, /* ㄱ - ㆎ */ - 0x3192, 0x319f, /* ㆒ - ㆟ */ - 0x3260, 0x327b, /* ㉠ - ㉻ */ - 0x328a, 0x32b0, /* ㊊ - ㊰ */ - 0x32d0, 0x32fe, /* ㋐ - ㋾ */ - 0x3300, 0x3357, /* ㌀ - ㍗ */ - 0x3371, 0x3376, /* ㍱ - ㍶ */ - 0x337b, 0x3394, /* ㍻ - ㎔ */ - 0x3399, 0x339e, /* ㎙ - ㎞ */ - 0x33a9, 0x33ad, /* ㎩ - ㎭ */ - 0x33b0, 0x33c1, /* ㎰ - ㏁ */ - 0x33c3, 0x33c5, /* ㏃ - ㏅ */ - 0x33c7, 0x33d7, /* ㏇ - ㏗ */ - 0x33d9, 0x33dd, /* ㏙ - ㏝ */ - 0x4e00, 0x9fff, /* 一 - 鿿 */ - 0xac00, 0xd7a3, /* 가 - 힣 */ - 0xf900, 0xfb06, /* 豈 - st */ - 0xfb13, 0xfb17, /* ﬓ - ﬗ */ - 0xfb1f, 0xfb28, /* ײַ - ﬨ */ - 0xfb2a, 0xfb36, /* שׁ - זּ */ - 0xfb38, 0xfb3c, /* טּ - לּ */ - 0xfb40, 0xfb41, /* נּ - סּ */ - 0xfb43, 0xfb44, /* ףּ - פּ */ - 0xfb46, 0xfbb1, /* צּ - ﮱ */ - 0xfbd3, 0xfd3d, /* ﯓ - ﴽ */ - 0xfd50, 0xfd8f, /* ﵐ - ﶏ */ - 0xfd92, 0xfdc7, /* ﶒ - ﷇ */ - 0xfdf0, 0xfdf9, /* ﷰ - ﷹ */ - 0xfe70, 0xfe72, /* ﹰ - ﹲ */ - 0xfe76, 0xfefc, /* ﹶ - ﻼ */ - 0xff66, 0xff6f, /* ヲ - ッ */ - 0xff71, 0xff9d, /* ア - ン */ - 0xffa0, 0xffbe, /* ᅠ - ᄒ */ - 0xffc2, 0xffc7, /* ᅡ - ᅦ */ - 0xffca, 0xffcf, /* ᅧ - ᅬ */ - 0xffd2, 0xffd7, /* ᅭ - ᅲ */ - 0xffda, 0xffdc, /* ᅳ - ᅵ */ -}; +Rune*_runebsearch(Rune c, Rune *t, int n, int ne); -/* - * alpha singlets - - * only covers ranges not in lower||upper - */ -static -Rune _alpha1[] = -{ - 0x00aa, /* ª */ - 0x00b5, /* µ */ - 0x00ba, /* º */ - 0x03da, /* Ϛ */ - 0x03dc, /* Ϝ */ - 0x03de, /* Ϟ */ - 0x03e0, /* Ϡ */ - 0x06d5, /* ە */ - 0x09b2, /* ল */ - 0x0a5e, /* ਫ਼ */ - 0x0a8d, /* ઍ */ - 0x0ae0, /* ૠ */ - 0x0b9c, /* ஜ */ - 0x0cde, /* ೞ */ - 0x0e4f, /* ๏ */ - 0x0e84, /* ຄ */ - 0x0e8a, /* ຊ */ - 0x0e8d, /* ຍ */ - 0x0ea5, /* ລ */ - 0x0ea7, /* ວ */ - 0x0eb0, /* ະ */ - 0x0ebd, /* ຽ */ - 0x1fbe, /* ι */ - 0x207f, /* ⁿ */ - 0x20a8, /* ₨ */ - 0x2102, /* ℂ */ - 0x2107, /* ℇ */ - 0x2124, /* ℤ */ - 0x2126, /* Ω */ - 0x2128, /* ℨ */ - 0xfb3e, /* מּ */ - 0xfe74, /* ﹴ */ -}; - -/* - * space ranges - */ -static -Rune _space2[] = -{ - 0x0009, 0x000a, /* tab and newline */ - 0x0020, 0x0020, /* space */ - 0x0085, 0x0085, - 0x00a0, 0x00a0, /*   */ - 0x1680, 0x1680, - 0x180e, 0x180e, - 0x2000, 0x200b, /*   - ​ */ - 0x2028, 0x2029, /* 
 - 
 */ - 0x202f, 0x202f, - 0x205f, 0x205f, - 0x3000, 0x3000, /*   */ - 0xfeff, 0xfeff, /*  */ -}; - -/* - * lower case ranges - * 3rd col is conversion excess 500 - */ -static -Rune _toupper2[] = -{ - 0x0061, 0x007a, 468, /* a-z A-Z */ - 0x00e0, 0x00f6, 468, /* à-ö À-Ö */ - 0x00f8, 0x00fe, 468, /* ø-þ Ø-Þ */ - 0x0256, 0x0257, 295, /* ɖ-ɗ Ɖ-Ɗ */ - 0x0258, 0x0259, 298, /* ɘ-ə Ǝ-Ə */ - 0x028a, 0x028b, 283, /* ʊ-ʋ Ʊ-Ʋ */ - 0x03ad, 0x03af, 463, /* έ-ί Έ-Ί */ - 0x03b1, 0x03c1, 468, /* α-ρ Α-Ρ */ - 0x03c3, 0x03cb, 468, /* σ-ϋ Σ-Ϋ */ - 0x03cd, 0x03ce, 437, /* ύ-ώ Ύ-Ώ */ - 0x0430, 0x044f, 468, /* а-я А-Я */ - 0x0451, 0x045c, 420, /* ё-ќ Ё-Ќ */ - 0x045e, 0x045f, 420, /* ў-џ Ў-Џ */ - 0x0561, 0x0586, 452, /* ա-ֆ Ա-Ֆ */ - 0x1f00, 0x1f07, 508, /* ἀ-ἇ Ἀ-Ἇ */ - 0x1f10, 0x1f15, 508, /* ἐ-ἕ Ἐ-Ἕ */ - 0x1f20, 0x1f27, 508, /* ἠ-ἧ Ἠ-Ἧ */ - 0x1f30, 0x1f37, 508, /* ἰ-ἷ Ἰ-Ἷ */ - 0x1f40, 0x1f45, 508, /* ὀ-ὅ Ὀ-Ὅ */ - 0x1f60, 0x1f67, 508, /* ὠ-ὧ Ὠ-Ὧ */ - 0x1f70, 0x1f71, 574, /* ὰ-ά Ὰ-Ά */ - 0x1f72, 0x1f75, 586, /* ὲ-ή Ὲ-Ή */ - 0x1f76, 0x1f77, 600, /* ὶ-ί Ὶ-Ί */ - 0x1f78, 0x1f79, 628, /* ὸ-ό Ὸ-Ό */ - 0x1f7a, 0x1f7b, 612, /* ὺ-ύ Ὺ-Ύ */ - 0x1f7c, 0x1f7d, 626, /* ὼ-ώ Ὼ-Ώ */ - 0x1f80, 0x1f87, 508, /* ᾀ-ᾇ ᾈ-ᾏ */ - 0x1f90, 0x1f97, 508, /* ᾐ-ᾗ ᾘ-ᾟ */ - 0x1fa0, 0x1fa7, 508, /* ᾠ-ᾧ ᾨ-ᾯ */ - 0x1fb0, 0x1fb1, 508, /* ᾰ-ᾱ Ᾰ-Ᾱ */ - 0x1fd0, 0x1fd1, 508, /* ῐ-ῑ Ῐ-Ῑ */ - 0x1fe0, 0x1fe1, 508, /* ῠ-ῡ Ῠ-Ῡ */ - 0x2170, 0x217f, 484, /* ⅰ-ⅿ Ⅰ-Ⅿ */ - 0x24d0, 0x24e9, 474, /* ⓐ-ⓩ Ⓐ-Ⓩ */ - 0xff41, 0xff5a, 468, /* a-z A-Z */ -}; - -/* - * lower case singlets - * 2nd col is conversion excess 500 - */ -static -Rune _toupper1[] = -{ - 0x00ff, 621, /* ÿ Ÿ */ - 0x0101, 499, /* ā Ā */ - 0x0103, 499, /* ă Ă */ - 0x0105, 499, /* ą Ą */ - 0x0107, 499, /* ć Ć */ - 0x0109, 499, /* ĉ Ĉ */ - 0x010b, 499, /* ċ Ċ */ - 0x010d, 499, /* č Č */ - 0x010f, 499, /* ď Ď */ - 0x0111, 499, /* đ Đ */ - 0x0113, 499, /* ē Ē */ - 0x0115, 499, /* ĕ Ĕ */ - 0x0117, 499, /* ė Ė */ - 0x0119, 499, /* ę Ę */ - 0x011b, 499, /* ě Ě */ - 0x011d, 499, /* ĝ Ĝ */ - 0x011f, 499, /* ğ Ğ */ - 0x0121, 499, /* ġ Ġ */ - 0x0123, 499, /* ģ Ģ */ - 0x0125, 499, /* ĥ Ĥ */ - 0x0127, 499, /* ħ Ħ */ - 0x0129, 499, /* ĩ Ĩ */ - 0x012b, 499, /* ī Ī */ - 0x012d, 499, /* ĭ Ĭ */ - 0x012f, 499, /* į Į */ - 0x0131, 268, /* ı I */ - 0x0133, 499, /* ij IJ */ - 0x0135, 499, /* ĵ Ĵ */ - 0x0137, 499, /* ķ Ķ */ - 0x013a, 499, /* ĺ Ĺ */ - 0x013c, 499, /* ļ Ļ */ - 0x013e, 499, /* ľ Ľ */ - 0x0140, 499, /* ŀ Ŀ */ - 0x0142, 499, /* ł Ł */ - 0x0144, 499, /* ń Ń */ - 0x0146, 499, /* ņ Ņ */ - 0x0148, 499, /* ň Ň */ - 0x014b, 499, /* ŋ Ŋ */ - 0x014d, 499, /* ō Ō */ - 0x014f, 499, /* ŏ Ŏ */ - 0x0151, 499, /* ő Ő */ - 0x0153, 499, /* œ Œ */ - 0x0155, 499, /* ŕ Ŕ */ - 0x0157, 499, /* ŗ Ŗ */ - 0x0159, 499, /* ř Ř */ - 0x015b, 499, /* ś Ś */ - 0x015d, 499, /* ŝ Ŝ */ - 0x015f, 499, /* ş Ş */ - 0x0161, 499, /* š Š */ - 0x0163, 499, /* ţ Ţ */ - 0x0165, 499, /* ť Ť */ - 0x0167, 499, /* ŧ Ŧ */ - 0x0169, 499, /* ũ Ũ */ - 0x016b, 499, /* ū Ū */ - 0x016d, 499, /* ŭ Ŭ */ - 0x016f, 499, /* ů Ů */ - 0x0171, 499, /* ű Ű */ - 0x0173, 499, /* ų Ų */ - 0x0175, 499, /* ŵ Ŵ */ - 0x0177, 499, /* ŷ Ŷ */ - 0x017a, 499, /* ź Ź */ - 0x017c, 499, /* ż Ż */ - 0x017e, 499, /* ž Ž */ - 0x017f, 200, /* ſ S */ - 0x0183, 499, /* ƃ Ƃ */ - 0x0185, 499, /* ƅ Ƅ */ - 0x0188, 499, /* ƈ Ƈ */ - 0x018c, 499, /* ƌ Ƌ */ - 0x0192, 499, /* ƒ Ƒ */ - 0x0199, 499, /* ƙ Ƙ */ - 0x01a1, 499, /* ơ Ơ */ - 0x01a3, 499, /* ƣ Ƣ */ - 0x01a5, 499, /* ƥ Ƥ */ - 0x01a8, 499, /* ƨ Ƨ */ - 0x01ad, 499, /* ƭ Ƭ */ - 0x01b0, 499, /* ư Ư */ - 0x01b4, 499, /* ƴ Ƴ */ - 0x01b6, 499, /* ƶ Ƶ */ - 0x01b9, 499, /* ƹ Ƹ */ - 0x01bd, 499, /* ƽ Ƽ */ - 0x01c5, 499, /* Dž DŽ */ - 0x01c6, 498, /* dž DŽ */ - 0x01c8, 499, /* Lj LJ */ - 0x01c9, 498, /* lj LJ */ - 0x01cb, 499, /* Nj NJ */ - 0x01cc, 498, /* nj NJ */ - 0x01ce, 499, /* ǎ Ǎ */ - 0x01d0, 499, /* ǐ Ǐ */ - 0x01d2, 499, /* ǒ Ǒ */ - 0x01d4, 499, /* ǔ Ǔ */ - 0x01d6, 499, /* ǖ Ǖ */ - 0x01d8, 499, /* ǘ Ǘ */ - 0x01da, 499, /* ǚ Ǚ */ - 0x01dc, 499, /* ǜ Ǜ */ - 0x01df, 499, /* ǟ Ǟ */ - 0x01e1, 499, /* ǡ Ǡ */ - 0x01e3, 499, /* ǣ Ǣ */ - 0x01e5, 499, /* ǥ Ǥ */ - 0x01e7, 499, /* ǧ Ǧ */ - 0x01e9, 499, /* ǩ Ǩ */ - 0x01eb, 499, /* ǫ Ǫ */ - 0x01ed, 499, /* ǭ Ǭ */ - 0x01ef, 499, /* ǯ Ǯ */ - 0x01f2, 499, /* Dz DZ */ - 0x01f3, 498, /* dz DZ */ - 0x01f5, 499, /* ǵ Ǵ */ - 0x01fb, 499, /* ǻ Ǻ */ - 0x01fd, 499, /* ǽ Ǽ */ - 0x01ff, 499, /* ǿ Ǿ */ - 0x0201, 499, /* ȁ Ȁ */ - 0x0203, 499, /* ȃ Ȃ */ - 0x0205, 499, /* ȅ Ȅ */ - 0x0207, 499, /* ȇ Ȇ */ - 0x0209, 499, /* ȉ Ȉ */ - 0x020b, 499, /* ȋ Ȋ */ - 0x020d, 499, /* ȍ Ȍ */ - 0x020f, 499, /* ȏ Ȏ */ - 0x0211, 499, /* ȑ Ȑ */ - 0x0213, 499, /* ȓ Ȓ */ - 0x0215, 499, /* ȕ Ȕ */ - 0x0217, 499, /* ȗ Ȗ */ - 0x0253, 290, /* ɓ Ɓ */ - 0x0254, 294, /* ɔ Ɔ */ - 0x025b, 297, /* ɛ Ɛ */ - 0x0260, 295, /* ɠ Ɠ */ - 0x0263, 293, /* ɣ Ɣ */ - 0x0268, 291, /* ɨ Ɨ */ - 0x0269, 289, /* ɩ Ɩ */ - 0x026f, 289, /* ɯ Ɯ */ - 0x0272, 287, /* ɲ Ɲ */ - 0x0283, 282, /* ʃ Ʃ */ - 0x0288, 282, /* ʈ Ʈ */ - 0x0292, 281, /* ʒ Ʒ */ - 0x03ac, 462, /* ά Ά */ - 0x03cc, 436, /* ό Ό */ - 0x03d0, 438, /* ϐ Β */ - 0x03d1, 443, /* ϑ Θ */ - 0x03d5, 453, /* ϕ Φ */ - 0x03d6, 446, /* ϖ Π */ - 0x03e3, 499, /* ϣ Ϣ */ - 0x03e5, 499, /* ϥ Ϥ */ - 0x03e7, 499, /* ϧ Ϧ */ - 0x03e9, 499, /* ϩ Ϩ */ - 0x03eb, 499, /* ϫ Ϫ */ - 0x03ed, 499, /* ϭ Ϭ */ - 0x03ef, 499, /* ϯ Ϯ */ - 0x03f0, 414, /* ϰ Κ */ - 0x03f1, 420, /* ϱ Ρ */ - 0x0461, 499, /* ѡ Ѡ */ - 0x0463, 499, /* ѣ Ѣ */ - 0x0465, 499, /* ѥ Ѥ */ - 0x0467, 499, /* ѧ Ѧ */ - 0x0469, 499, /* ѩ Ѩ */ - 0x046b, 499, /* ѫ Ѫ */ - 0x046d, 499, /* ѭ Ѭ */ - 0x046f, 499, /* ѯ Ѯ */ - 0x0471, 499, /* ѱ Ѱ */ - 0x0473, 499, /* ѳ Ѳ */ - 0x0475, 499, /* ѵ Ѵ */ - 0x0477, 499, /* ѷ Ѷ */ - 0x0479, 499, /* ѹ Ѹ */ - 0x047b, 499, /* ѻ Ѻ */ - 0x047d, 499, /* ѽ Ѽ */ - 0x047f, 499, /* ѿ Ѿ */ - 0x0481, 499, /* ҁ Ҁ */ - 0x0491, 499, /* ґ Ґ */ - 0x0493, 499, /* ғ Ғ */ - 0x0495, 499, /* ҕ Ҕ */ - 0x0497, 499, /* җ Җ */ - 0x0499, 499, /* ҙ Ҙ */ - 0x049b, 499, /* қ Қ */ - 0x049d, 499, /* ҝ Ҝ */ - 0x049f, 499, /* ҟ Ҟ */ - 0x04a1, 499, /* ҡ Ҡ */ - 0x04a3, 499, /* ң Ң */ - 0x04a5, 499, /* ҥ Ҥ */ - 0x04a7, 499, /* ҧ Ҧ */ - 0x04a9, 499, /* ҩ Ҩ */ - 0x04ab, 499, /* ҫ Ҫ */ - 0x04ad, 499, /* ҭ Ҭ */ - 0x04af, 499, /* ү Ү */ - 0x04b1, 499, /* ұ Ұ */ - 0x04b3, 499, /* ҳ Ҳ */ - 0x04b5, 499, /* ҵ Ҵ */ - 0x04b7, 499, /* ҷ Ҷ */ - 0x04b9, 499, /* ҹ Ҹ */ - 0x04bb, 499, /* һ Һ */ - 0x04bd, 499, /* ҽ Ҽ */ - 0x04bf, 499, /* ҿ Ҿ */ - 0x04c2, 499, /* ӂ Ӂ */ - 0x04c4, 499, /* ӄ Ӄ */ - 0x04c8, 499, /* ӈ Ӈ */ - 0x04cc, 499, /* ӌ Ӌ */ - 0x04d1, 499, /* ӑ Ӑ */ - 0x04d3, 499, /* ӓ Ӓ */ - 0x04d5, 499, /* ӕ Ӕ */ - 0x04d7, 499, /* ӗ Ӗ */ - 0x04d9, 499, /* ә Ә */ - 0x04db, 499, /* ӛ Ӛ */ - 0x04dd, 499, /* ӝ Ӝ */ - 0x04df, 499, /* ӟ Ӟ */ - 0x04e1, 499, /* ӡ Ӡ */ - 0x04e3, 499, /* ӣ Ӣ */ - 0x04e5, 499, /* ӥ Ӥ */ - 0x04e7, 499, /* ӧ Ӧ */ - 0x04e9, 499, /* ө Ө */ - 0x04eb, 499, /* ӫ Ӫ */ - 0x04ef, 499, /* ӯ Ӯ */ - 0x04f1, 499, /* ӱ Ӱ */ - 0x04f3, 499, /* ӳ Ӳ */ - 0x04f5, 499, /* ӵ Ӵ */ - 0x04f9, 499, /* ӹ Ӹ */ - 0x1e01, 499, /* ḁ Ḁ */ - 0x1e03, 499, /* ḃ Ḃ */ - 0x1e05, 499, /* ḅ Ḅ */ - 0x1e07, 499, /* ḇ Ḇ */ - 0x1e09, 499, /* ḉ Ḉ */ - 0x1e0b, 499, /* ḋ Ḋ */ - 0x1e0d, 499, /* ḍ Ḍ */ - 0x1e0f, 499, /* ḏ Ḏ */ - 0x1e11, 499, /* ḑ Ḑ */ - 0x1e13, 499, /* ḓ Ḓ */ - 0x1e15, 499, /* ḕ Ḕ */ - 0x1e17, 499, /* ḗ Ḗ */ - 0x1e19, 499, /* ḙ Ḙ */ - 0x1e1b, 499, /* ḛ Ḛ */ - 0x1e1d, 499, /* ḝ Ḝ */ - 0x1e1f, 499, /* ḟ Ḟ */ - 0x1e21, 499, /* ḡ Ḡ */ - 0x1e23, 499, /* ḣ Ḣ */ - 0x1e25, 499, /* ḥ Ḥ */ - 0x1e27, 499, /* ḧ Ḧ */ - 0x1e29, 499, /* ḩ Ḩ */ - 0x1e2b, 499, /* ḫ Ḫ */ - 0x1e2d, 499, /* ḭ Ḭ */ - 0x1e2f, 499, /* ḯ Ḯ */ - 0x1e31, 499, /* ḱ Ḱ */ - 0x1e33, 499, /* ḳ Ḳ */ - 0x1e35, 499, /* ḵ Ḵ */ - 0x1e37, 499, /* ḷ Ḷ */ - 0x1e39, 499, /* ḹ Ḹ */ - 0x1e3b, 499, /* ḻ Ḻ */ - 0x1e3d, 499, /* ḽ Ḽ */ - 0x1e3f, 499, /* ḿ Ḿ */ - 0x1e41, 499, /* ṁ Ṁ */ - 0x1e43, 499, /* ṃ Ṃ */ - 0x1e45, 499, /* ṅ Ṅ */ - 0x1e47, 499, /* ṇ Ṇ */ - 0x1e49, 499, /* ṉ Ṉ */ - 0x1e4b, 499, /* ṋ Ṋ */ - 0x1e4d, 499, /* ṍ Ṍ */ - 0x1e4f, 499, /* ṏ Ṏ */ - 0x1e51, 499, /* ṑ Ṑ */ - 0x1e53, 499, /* ṓ Ṓ */ - 0x1e55, 499, /* ṕ Ṕ */ - 0x1e57, 499, /* ṗ Ṗ */ - 0x1e59, 499, /* ṙ Ṙ */ - 0x1e5b, 499, /* ṛ Ṛ */ - 0x1e5d, 499, /* ṝ Ṝ */ - 0x1e5f, 499, /* ṟ Ṟ */ - 0x1e61, 499, /* ṡ Ṡ */ - 0x1e63, 499, /* ṣ Ṣ */ - 0x1e65, 499, /* ṥ Ṥ */ - 0x1e67, 499, /* ṧ Ṧ */ - 0x1e69, 499, /* ṩ Ṩ */ - 0x1e6b, 499, /* ṫ Ṫ */ - 0x1e6d, 499, /* ṭ Ṭ */ - 0x1e6f, 499, /* ṯ Ṯ */ - 0x1e71, 499, /* ṱ Ṱ */ - 0x1e73, 499, /* ṳ Ṳ */ - 0x1e75, 499, /* ṵ Ṵ */ - 0x1e77, 499, /* ṷ Ṷ */ - 0x1e79, 499, /* ṹ Ṹ */ - 0x1e7b, 499, /* ṻ Ṻ */ - 0x1e7d, 499, /* ṽ Ṽ */ - 0x1e7f, 499, /* ṿ Ṿ */ - 0x1e81, 499, /* ẁ Ẁ */ - 0x1e83, 499, /* ẃ Ẃ */ - 0x1e85, 499, /* ẅ Ẅ */ - 0x1e87, 499, /* ẇ Ẇ */ - 0x1e89, 499, /* ẉ Ẉ */ - 0x1e8b, 499, /* ẋ Ẋ */ - 0x1e8d, 499, /* ẍ Ẍ */ - 0x1e8f, 499, /* ẏ Ẏ */ - 0x1e91, 499, /* ẑ Ẑ */ - 0x1e93, 499, /* ẓ Ẓ */ - 0x1e95, 499, /* ẕ Ẕ */ - 0x1ea1, 499, /* ạ Ạ */ - 0x1ea3, 499, /* ả Ả */ - 0x1ea5, 499, /* ấ Ấ */ - 0x1ea7, 499, /* ầ Ầ */ - 0x1ea9, 499, /* ẩ Ẩ */ - 0x1eab, 499, /* ẫ Ẫ */ - 0x1ead, 499, /* ậ Ậ */ - 0x1eaf, 499, /* ắ Ắ */ - 0x1eb1, 499, /* ằ Ằ */ - 0x1eb3, 499, /* ẳ Ẳ */ - 0x1eb5, 499, /* ẵ Ẵ */ - 0x1eb7, 499, /* ặ Ặ */ - 0x1eb9, 499, /* ẹ Ẹ */ - 0x1ebb, 499, /* ẻ Ẻ */ - 0x1ebd, 499, /* ẽ Ẽ */ - 0x1ebf, 499, /* ế Ế */ - 0x1ec1, 499, /* ề Ề */ - 0x1ec3, 499, /* ể Ể */ - 0x1ec5, 499, /* ễ Ễ */ - 0x1ec7, 499, /* ệ Ệ */ - 0x1ec9, 499, /* ỉ Ỉ */ - 0x1ecb, 499, /* ị Ị */ - 0x1ecd, 499, /* ọ Ọ */ - 0x1ecf, 499, /* ỏ Ỏ */ - 0x1ed1, 499, /* ố Ố */ - 0x1ed3, 499, /* ồ Ồ */ - 0x1ed5, 499, /* ổ Ổ */ - 0x1ed7, 499, /* ỗ Ỗ */ - 0x1ed9, 499, /* ộ Ộ */ - 0x1edb, 499, /* ớ Ớ */ - 0x1edd, 499, /* ờ Ờ */ - 0x1edf, 499, /* ở Ở */ - 0x1ee1, 499, /* ỡ Ỡ */ - 0x1ee3, 499, /* ợ Ợ */ - 0x1ee5, 499, /* ụ Ụ */ - 0x1ee7, 499, /* ủ Ủ */ - 0x1ee9, 499, /* ứ Ứ */ - 0x1eeb, 499, /* ừ Ừ */ - 0x1eed, 499, /* ử Ử */ - 0x1eef, 499, /* ữ Ữ */ - 0x1ef1, 499, /* ự Ự */ - 0x1ef3, 499, /* ỳ Ỳ */ - 0x1ef5, 499, /* ỵ Ỵ */ - 0x1ef7, 499, /* ỷ Ỷ */ - 0x1ef9, 499, /* ỹ Ỹ */ - 0x1f51, 508, /* ὑ Ὑ */ - 0x1f53, 508, /* ὓ Ὓ */ - 0x1f55, 508, /* ὕ Ὕ */ - 0x1f57, 508, /* ὗ Ὗ */ - 0x1fb3, 509, /* ᾳ ᾼ */ - 0x1fc3, 509, /* ῃ ῌ */ - 0x1fe5, 507, /* ῥ Ῥ */ - 0x1ff3, 509, /* ῳ ῼ */ -}; - -static Rune __isdigitr[] = { - 0x0030, 0x0039, - 0x0660, 0x0669, - 0x06f0, 0x06f9, - 0x07c0, 0x07c9, - 0x0966, 0x096f, - 0x09e6, 0x09ef, - 0x0a66, 0x0a6f, - 0x0ae6, 0x0aef, - 0x0b66, 0x0b6f, - 0x0be6, 0x0bef, - 0x0c66, 0x0c6f, - 0x0ce6, 0x0cef, - 0x0d66, 0x0d6f, - 0x0e50, 0x0e59, - 0x0ed0, 0x0ed9, - 0x0f20, 0x0f29, - 0x1040, 0x1049, - 0x17e0, 0x17e9, - 0x1810, 0x1819, - 0x1946, 0x194f, - 0x19d0, 0x19d9, - 0x1b50, 0x1b59, - 0xff10, 0xff19, - 0x104a0, 0x104a9, - 0x1d7ce, 0x1d7ff, -}; - -/* - * upper case ranges - * 3rd col is conversion excess 500 - */ -static -Rune _tolower2[] = -{ - 0x0041, 0x005a, 532, /* A-Z a-z */ - 0x00c0, 0x00d6, 532, /* À-Ö à-ö */ - 0x00d8, 0x00de, 532, /* Ø-Þ ø-þ */ - 0x0189, 0x018a, 705, /* Ɖ-Ɗ ɖ-ɗ */ - 0x018e, 0x018f, 702, /* Ǝ-Ə ɘ-ə */ - 0x01b1, 0x01b2, 717, /* Ʊ-Ʋ ʊ-ʋ */ - 0x0388, 0x038a, 537, /* Έ-Ί έ-ί */ - 0x038e, 0x038f, 563, /* Ύ-Ώ ύ-ώ */ - 0x0391, 0x03a1, 532, /* Α-Ρ α-ρ */ - 0x03a3, 0x03ab, 532, /* Σ-Ϋ σ-ϋ */ - 0x0401, 0x040c, 580, /* Ё-Ќ ё-ќ */ - 0x040e, 0x040f, 580, /* Ў-Џ ў-џ */ - 0x0410, 0x042f, 532, /* А-Я а-я */ - 0x0531, 0x0556, 548, /* Ա-Ֆ ա-ֆ */ - 0x10a0, 0x10c5, 548, /* Ⴀ-Ⴥ ა-ჵ */ - 0x1f08, 0x1f0f, 492, /* Ἀ-Ἇ ἀ-ἇ */ - 0x1f18, 0x1f1d, 492, /* Ἐ-Ἕ ἐ-ἕ */ - 0x1f28, 0x1f2f, 492, /* Ἠ-Ἧ ἠ-ἧ */ - 0x1f38, 0x1f3f, 492, /* Ἰ-Ἷ ἰ-ἷ */ - 0x1f48, 0x1f4d, 492, /* Ὀ-Ὅ ὀ-ὅ */ - 0x1f68, 0x1f6f, 492, /* Ὠ-Ὧ ὠ-ὧ */ - 0x1f88, 0x1f8f, 492, /* ᾈ-ᾏ ᾀ-ᾇ */ - 0x1f98, 0x1f9f, 492, /* ᾘ-ᾟ ᾐ-ᾗ */ - 0x1fa8, 0x1faf, 492, /* ᾨ-ᾯ ᾠ-ᾧ */ - 0x1fb8, 0x1fb9, 492, /* Ᾰ-Ᾱ ᾰ-ᾱ */ - 0x1fba, 0x1fbb, 426, /* Ὰ-Ά ὰ-ά */ - 0x1fc8, 0x1fcb, 414, /* Ὲ-Ή ὲ-ή */ - 0x1fd8, 0x1fd9, 492, /* Ῐ-Ῑ ῐ-ῑ */ - 0x1fda, 0x1fdb, 400, /* Ὶ-Ί ὶ-ί */ - 0x1fe8, 0x1fe9, 492, /* Ῠ-Ῡ ῠ-ῡ */ - 0x1fea, 0x1feb, 388, /* Ὺ-Ύ ὺ-ύ */ - 0x1ff8, 0x1ff9, 372, /* Ὸ-Ό ὸ-ό */ - 0x1ffa, 0x1ffb, 374, /* Ὼ-Ώ ὼ-ώ */ - 0x2160, 0x216f, 516, /* Ⅰ-Ⅿ ⅰ-ⅿ */ - 0x24b6, 0x24cf, 526, /* Ⓐ-Ⓩ ⓐ-ⓩ */ - 0xff21, 0xff3a, 532, /* A-Z a-z */ -}; - -/* - * upper case singlets - * 2nd col is conversion excess 500 - */ -static -Rune _tolower1[] = -{ - 0x0100, 501, /* Ā ā */ - 0x0102, 501, /* Ă ă */ - 0x0104, 501, /* Ą ą */ - 0x0106, 501, /* Ć ć */ - 0x0108, 501, /* Ĉ ĉ */ - 0x010a, 501, /* Ċ ċ */ - 0x010c, 501, /* Č č */ - 0x010e, 501, /* Ď ď */ - 0x0110, 501, /* Đ đ */ - 0x0112, 501, /* Ē ē */ - 0x0114, 501, /* Ĕ ĕ */ - 0x0116, 501, /* Ė ė */ - 0x0118, 501, /* Ę ę */ - 0x011a, 501, /* Ě ě */ - 0x011c, 501, /* Ĝ ĝ */ - 0x011e, 501, /* Ğ ğ */ - 0x0120, 501, /* Ġ ġ */ - 0x0122, 501, /* Ģ ģ */ - 0x0124, 501, /* Ĥ ĥ */ - 0x0126, 501, /* Ħ ħ */ - 0x0128, 501, /* Ĩ ĩ */ - 0x012a, 501, /* Ī ī */ - 0x012c, 501, /* Ĭ ĭ */ - 0x012e, 501, /* Į į */ - 0x0130, 301, /* İ i */ - 0x0132, 501, /* IJ ij */ - 0x0134, 501, /* Ĵ ĵ */ - 0x0136, 501, /* Ķ ķ */ - 0x0139, 501, /* Ĺ ĺ */ - 0x013b, 501, /* Ļ ļ */ - 0x013d, 501, /* Ľ ľ */ - 0x013f, 501, /* Ŀ ŀ */ - 0x0141, 501, /* Ł ł */ - 0x0143, 501, /* Ń ń */ - 0x0145, 501, /* Ņ ņ */ - 0x0147, 501, /* Ň ň */ - 0x014a, 501, /* Ŋ ŋ */ - 0x014c, 501, /* Ō ō */ - 0x014e, 501, /* Ŏ ŏ */ - 0x0150, 501, /* Ő ő */ - 0x0152, 501, /* Œ œ */ - 0x0154, 501, /* Ŕ ŕ */ - 0x0156, 501, /* Ŗ ŗ */ - 0x0158, 501, /* Ř ř */ - 0x015a, 501, /* Ś ś */ - 0x015c, 501, /* Ŝ ŝ */ - 0x015e, 501, /* Ş ş */ - 0x0160, 501, /* Š š */ - 0x0162, 501, /* Ţ ţ */ - 0x0164, 501, /* Ť ť */ - 0x0166, 501, /* Ŧ ŧ */ - 0x0168, 501, /* Ũ ũ */ - 0x016a, 501, /* Ū ū */ - 0x016c, 501, /* Ŭ ŭ */ - 0x016e, 501, /* Ů ů */ - 0x0170, 501, /* Ű ű */ - 0x0172, 501, /* Ų ų */ - 0x0174, 501, /* Ŵ ŵ */ - 0x0176, 501, /* Ŷ ŷ */ - 0x0178, 379, /* Ÿ ÿ */ - 0x0179, 501, /* Ź ź */ - 0x017b, 501, /* Ż ż */ - 0x017d, 501, /* Ž ž */ - 0x0181, 710, /* Ɓ ɓ */ - 0x0182, 501, /* Ƃ ƃ */ - 0x0184, 501, /* Ƅ ƅ */ - 0x0186, 706, /* Ɔ ɔ */ - 0x0187, 501, /* Ƈ ƈ */ - 0x018b, 501, /* Ƌ ƌ */ - 0x0190, 703, /* Ɛ ɛ */ - 0x0191, 501, /* Ƒ ƒ */ - 0x0193, 705, /* Ɠ ɠ */ - 0x0194, 707, /* Ɣ ɣ */ - 0x0196, 711, /* Ɩ ɩ */ - 0x0197, 709, /* Ɨ ɨ */ - 0x0198, 501, /* Ƙ ƙ */ - 0x019c, 711, /* Ɯ ɯ */ - 0x019d, 713, /* Ɲ ɲ */ - 0x01a0, 501, /* Ơ ơ */ - 0x01a2, 501, /* Ƣ ƣ */ - 0x01a4, 501, /* Ƥ ƥ */ - 0x01a7, 501, /* Ƨ ƨ */ - 0x01a9, 718, /* Ʃ ʃ */ - 0x01ac, 501, /* Ƭ ƭ */ - 0x01ae, 718, /* Ʈ ʈ */ - 0x01af, 501, /* Ư ư */ - 0x01b3, 501, /* Ƴ ƴ */ - 0x01b5, 501, /* Ƶ ƶ */ - 0x01b7, 719, /* Ʒ ʒ */ - 0x01b8, 501, /* Ƹ ƹ */ - 0x01bc, 501, /* Ƽ ƽ */ - 0x01c4, 502, /* DŽ dž */ - 0x01c5, 501, /* Dž dž */ - 0x01c7, 502, /* LJ lj */ - 0x01c8, 501, /* Lj lj */ - 0x01ca, 502, /* NJ nj */ - 0x01cb, 501, /* Nj nj */ - 0x01cd, 501, /* Ǎ ǎ */ - 0x01cf, 501, /* Ǐ ǐ */ - 0x01d1, 501, /* Ǒ ǒ */ - 0x01d3, 501, /* Ǔ ǔ */ - 0x01d5, 501, /* Ǖ ǖ */ - 0x01d7, 501, /* Ǘ ǘ */ - 0x01d9, 501, /* Ǚ ǚ */ - 0x01db, 501, /* Ǜ ǜ */ - 0x01de, 501, /* Ǟ ǟ */ - 0x01e0, 501, /* Ǡ ǡ */ - 0x01e2, 501, /* Ǣ ǣ */ - 0x01e4, 501, /* Ǥ ǥ */ - 0x01e6, 501, /* Ǧ ǧ */ - 0x01e8, 501, /* Ǩ ǩ */ - 0x01ea, 501, /* Ǫ ǫ */ - 0x01ec, 501, /* Ǭ ǭ */ - 0x01ee, 501, /* Ǯ ǯ */ - 0x01f1, 502, /* DZ dz */ - 0x01f2, 501, /* Dz dz */ - 0x01f4, 501, /* Ǵ ǵ */ - 0x01fa, 501, /* Ǻ ǻ */ - 0x01fc, 501, /* Ǽ ǽ */ - 0x01fe, 501, /* Ǿ ǿ */ - 0x0200, 501, /* Ȁ ȁ */ - 0x0202, 501, /* Ȃ ȃ */ - 0x0204, 501, /* Ȅ ȅ */ - 0x0206, 501, /* Ȇ ȇ */ - 0x0208, 501, /* Ȉ ȉ */ - 0x020a, 501, /* Ȋ ȋ */ - 0x020c, 501, /* Ȍ ȍ */ - 0x020e, 501, /* Ȏ ȏ */ - 0x0210, 501, /* Ȑ ȑ */ - 0x0212, 501, /* Ȓ ȓ */ - 0x0214, 501, /* Ȕ ȕ */ - 0x0216, 501, /* Ȗ ȗ */ - 0x0386, 538, /* Ά ά */ - 0x038c, 564, /* Ό ό */ - 0x03e2, 501, /* Ϣ ϣ */ - 0x03e4, 501, /* Ϥ ϥ */ - 0x03e6, 501, /* Ϧ ϧ */ - 0x03e8, 501, /* Ϩ ϩ */ - 0x03ea, 501, /* Ϫ ϫ */ - 0x03ec, 501, /* Ϭ ϭ */ - 0x03ee, 501, /* Ϯ ϯ */ - 0x0460, 501, /* Ѡ ѡ */ - 0x0462, 501, /* Ѣ ѣ */ - 0x0464, 501, /* Ѥ ѥ */ - 0x0466, 501, /* Ѧ ѧ */ - 0x0468, 501, /* Ѩ ѩ */ - 0x046a, 501, /* Ѫ ѫ */ - 0x046c, 501, /* Ѭ ѭ */ - 0x046e, 501, /* Ѯ ѯ */ - 0x0470, 501, /* Ѱ ѱ */ - 0x0472, 501, /* Ѳ ѳ */ - 0x0474, 501, /* Ѵ ѵ */ - 0x0476, 501, /* Ѷ ѷ */ - 0x0478, 501, /* Ѹ ѹ */ - 0x047a, 501, /* Ѻ ѻ */ - 0x047c, 501, /* Ѽ ѽ */ - 0x047e, 501, /* Ѿ ѿ */ - 0x0480, 501, /* Ҁ ҁ */ - 0x0490, 501, /* Ґ ґ */ - 0x0492, 501, /* Ғ ғ */ - 0x0494, 501, /* Ҕ ҕ */ - 0x0496, 501, /* Җ җ */ - 0x0498, 501, /* Ҙ ҙ */ - 0x049a, 501, /* Қ қ */ - 0x049c, 501, /* Ҝ ҝ */ - 0x049e, 501, /* Ҟ ҟ */ - 0x04a0, 501, /* Ҡ ҡ */ - 0x04a2, 501, /* Ң ң */ - 0x04a4, 501, /* Ҥ ҥ */ - 0x04a6, 501, /* Ҧ ҧ */ - 0x04a8, 501, /* Ҩ ҩ */ - 0x04aa, 501, /* Ҫ ҫ */ - 0x04ac, 501, /* Ҭ ҭ */ - 0x04ae, 501, /* Ү ү */ - 0x04b0, 501, /* Ұ ұ */ - 0x04b2, 501, /* Ҳ ҳ */ - 0x04b4, 501, /* Ҵ ҵ */ - 0x04b6, 501, /* Ҷ ҷ */ - 0x04b8, 501, /* Ҹ ҹ */ - 0x04ba, 501, /* Һ һ */ - 0x04bc, 501, /* Ҽ ҽ */ - 0x04be, 501, /* Ҿ ҿ */ - 0x04c1, 501, /* Ӂ ӂ */ - 0x04c3, 501, /* Ӄ ӄ */ - 0x04c7, 501, /* Ӈ ӈ */ - 0x04cb, 501, /* Ӌ ӌ */ - 0x04d0, 501, /* Ӑ ӑ */ - 0x04d2, 501, /* Ӓ ӓ */ - 0x04d4, 501, /* Ӕ ӕ */ - 0x04d6, 501, /* Ӗ ӗ */ - 0x04d8, 501, /* Ә ә */ - 0x04da, 501, /* Ӛ ӛ */ - 0x04dc, 501, /* Ӝ ӝ */ - 0x04de, 501, /* Ӟ ӟ */ - 0x04e0, 501, /* Ӡ ӡ */ - 0x04e2, 501, /* Ӣ ӣ */ - 0x04e4, 501, /* Ӥ ӥ */ - 0x04e6, 501, /* Ӧ ӧ */ - 0x04e8, 501, /* Ө ө */ - 0x04ea, 501, /* Ӫ ӫ */ - 0x04ee, 501, /* Ӯ ӯ */ - 0x04f0, 501, /* Ӱ ӱ */ - 0x04f2, 501, /* Ӳ ӳ */ - 0x04f4, 501, /* Ӵ ӵ */ - 0x04f8, 501, /* Ӹ ӹ */ - 0x1e00, 501, /* Ḁ ḁ */ - 0x1e02, 501, /* Ḃ ḃ */ - 0x1e04, 501, /* Ḅ ḅ */ - 0x1e06, 501, /* Ḇ ḇ */ - 0x1e08, 501, /* Ḉ ḉ */ - 0x1e0a, 501, /* Ḋ ḋ */ - 0x1e0c, 501, /* Ḍ ḍ */ - 0x1e0e, 501, /* Ḏ ḏ */ - 0x1e10, 501, /* Ḑ ḑ */ - 0x1e12, 501, /* Ḓ ḓ */ - 0x1e14, 501, /* Ḕ ḕ */ - 0x1e16, 501, /* Ḗ ḗ */ - 0x1e18, 501, /* Ḙ ḙ */ - 0x1e1a, 501, /* Ḛ ḛ */ - 0x1e1c, 501, /* Ḝ ḝ */ - 0x1e1e, 501, /* Ḟ ḟ */ - 0x1e20, 501, /* Ḡ ḡ */ - 0x1e22, 501, /* Ḣ ḣ */ - 0x1e24, 501, /* Ḥ ḥ */ - 0x1e26, 501, /* Ḧ ḧ */ - 0x1e28, 501, /* Ḩ ḩ */ - 0x1e2a, 501, /* Ḫ ḫ */ - 0x1e2c, 501, /* Ḭ ḭ */ - 0x1e2e, 501, /* Ḯ ḯ */ - 0x1e30, 501, /* Ḱ ḱ */ - 0x1e32, 501, /* Ḳ ḳ */ - 0x1e34, 501, /* Ḵ ḵ */ - 0x1e36, 501, /* Ḷ ḷ */ - 0x1e38, 501, /* Ḹ ḹ */ - 0x1e3a, 501, /* Ḻ ḻ */ - 0x1e3c, 501, /* Ḽ ḽ */ - 0x1e3e, 501, /* Ḿ ḿ */ - 0x1e40, 501, /* Ṁ ṁ */ - 0x1e42, 501, /* Ṃ ṃ */ - 0x1e44, 501, /* Ṅ ṅ */ - 0x1e46, 501, /* Ṇ ṇ */ - 0x1e48, 501, /* Ṉ ṉ */ - 0x1e4a, 501, /* Ṋ ṋ */ - 0x1e4c, 501, /* Ṍ ṍ */ - 0x1e4e, 501, /* Ṏ ṏ */ - 0x1e50, 501, /* Ṑ ṑ */ - 0x1e52, 501, /* Ṓ ṓ */ - 0x1e54, 501, /* Ṕ ṕ */ - 0x1e56, 501, /* Ṗ ṗ */ - 0x1e58, 501, /* Ṙ ṙ */ - 0x1e5a, 501, /* Ṛ ṛ */ - 0x1e5c, 501, /* Ṝ ṝ */ - 0x1e5e, 501, /* Ṟ ṟ */ - 0x1e60, 501, /* Ṡ ṡ */ - 0x1e62, 501, /* Ṣ ṣ */ - 0x1e64, 501, /* Ṥ ṥ */ - 0x1e66, 501, /* Ṧ ṧ */ - 0x1e68, 501, /* Ṩ ṩ */ - 0x1e6a, 501, /* Ṫ ṫ */ - 0x1e6c, 501, /* Ṭ ṭ */ - 0x1e6e, 501, /* Ṯ ṯ */ - 0x1e70, 501, /* Ṱ ṱ */ - 0x1e72, 501, /* Ṳ ṳ */ - 0x1e74, 501, /* Ṵ ṵ */ - 0x1e76, 501, /* Ṷ ṷ */ - 0x1e78, 501, /* Ṹ ṹ */ - 0x1e7a, 501, /* Ṻ ṻ */ - 0x1e7c, 501, /* Ṽ ṽ */ - 0x1e7e, 501, /* Ṿ ṿ */ - 0x1e80, 501, /* Ẁ ẁ */ - 0x1e82, 501, /* Ẃ ẃ */ - 0x1e84, 501, /* Ẅ ẅ */ - 0x1e86, 501, /* Ẇ ẇ */ - 0x1e88, 501, /* Ẉ ẉ */ - 0x1e8a, 501, /* Ẋ ẋ */ - 0x1e8c, 501, /* Ẍ ẍ */ - 0x1e8e, 501, /* Ẏ ẏ */ - 0x1e90, 501, /* Ẑ ẑ */ - 0x1e92, 501, /* Ẓ ẓ */ - 0x1e94, 501, /* Ẕ ẕ */ - 0x1ea0, 501, /* Ạ ạ */ - 0x1ea2, 501, /* Ả ả */ - 0x1ea4, 501, /* Ấ ấ */ - 0x1ea6, 501, /* Ầ ầ */ - 0x1ea8, 501, /* Ẩ ẩ */ - 0x1eaa, 501, /* Ẫ ẫ */ - 0x1eac, 501, /* Ậ ậ */ - 0x1eae, 501, /* Ắ ắ */ - 0x1eb0, 501, /* Ằ ằ */ - 0x1eb2, 501, /* Ẳ ẳ */ - 0x1eb4, 501, /* Ẵ ẵ */ - 0x1eb6, 501, /* Ặ ặ */ - 0x1eb8, 501, /* Ẹ ẹ */ - 0x1eba, 501, /* Ẻ ẻ */ - 0x1ebc, 501, /* Ẽ ẽ */ - 0x1ebe, 501, /* Ế ế */ - 0x1ec0, 501, /* Ề ề */ - 0x1ec2, 501, /* Ể ể */ - 0x1ec4, 501, /* Ễ ễ */ - 0x1ec6, 501, /* Ệ ệ */ - 0x1ec8, 501, /* Ỉ ỉ */ - 0x1eca, 501, /* Ị ị */ - 0x1ecc, 501, /* Ọ ọ */ - 0x1ece, 501, /* Ỏ ỏ */ - 0x1ed0, 501, /* Ố ố */ - 0x1ed2, 501, /* Ồ ồ */ - 0x1ed4, 501, /* Ổ ổ */ - 0x1ed6, 501, /* Ỗ ỗ */ - 0x1ed8, 501, /* Ộ ộ */ - 0x1eda, 501, /* Ớ ớ */ - 0x1edc, 501, /* Ờ ờ */ - 0x1ede, 501, /* Ở ở */ - 0x1ee0, 501, /* Ỡ ỡ */ - 0x1ee2, 501, /* Ợ ợ */ - 0x1ee4, 501, /* Ụ ụ */ - 0x1ee6, 501, /* Ủ ủ */ - 0x1ee8, 501, /* Ứ ứ */ - 0x1eea, 501, /* Ừ ừ */ - 0x1eec, 501, /* Ử ử */ - 0x1eee, 501, /* Ữ ữ */ - 0x1ef0, 501, /* Ự ự */ - 0x1ef2, 501, /* Ỳ ỳ */ - 0x1ef4, 501, /* Ỵ ỵ */ - 0x1ef6, 501, /* Ỷ ỷ */ - 0x1ef8, 501, /* Ỹ ỹ */ - 0x1f59, 492, /* Ὑ ὑ */ - 0x1f5b, 492, /* Ὓ ὓ */ - 0x1f5d, 492, /* Ὕ ὕ */ - 0x1f5f, 492, /* Ὗ ὗ */ - 0x1fbc, 491, /* ᾼ ᾳ */ - 0x1fcc, 491, /* ῌ ῃ */ - 0x1fec, 493, /* Ῥ ῥ */ - 0x1ffc, 491, /* ῼ ῳ */ -}; - -/* - * title characters are those between - * upper and lower case. ie DZ Dz dz - */ -static -Rune _totitle1[] = -{ - 0x01c4, 501, /* DŽ Dž */ - 0x01c6, 499, /* dž Dž */ - 0x01c7, 501, /* LJ Lj */ - 0x01c9, 499, /* lj Lj */ - 0x01ca, 501, /* NJ Nj */ - 0x01cc, 499, /* nj Nj */ - 0x01f1, 501, /* DZ Dz */ - 0x01f3, 499, /* dz Dz */ -}; - -static -Rune* -bsearch(Rune c, Rune *t, int n, int ne) -{ - Rune *p; - int m; - - while(n > 1) { - m = n/2; - p = t + m*ne; - if(c >= p[0]) { - t = p; - n = n-m; - } else - n = m; - } - if(n && c >= t[0]) - return t; - return 0; -} - -Rune -tolowerrune(Rune c) -{ - Rune *p; - - p = bsearch(c, _tolower2, nelem(_tolower2)/3, 3); - if(p && c >= p[0] && c <= p[1]) - return c + p[2] - 500; - p = bsearch(c, _tolower1, nelem(_tolower1)/2, 2); - if(p && c == p[0]) - return c + p[1] - 500; - return c; -} - -Rune -toupperrune(Rune c) -{ - Rune *p; - - p = bsearch(c, _toupper2, nelem(_toupper2)/3, 3); - if(p && c >= p[0] && c <= p[1]) - return c + p[2] - 500; - p = bsearch(c, _toupper1, nelem(_toupper1)/2, 2); - if(p && c == p[0]) - return c + p[1] - 500; - return c; -} - -Rune -totitlerune(Rune c) -{ - Rune *p; - - p = bsearch(c, _totitle1, nelem(_totitle1)/2, 2); - if(p && c == p[0]) - return c + p[1] - 500; - return c; -} - -int -islowerrune(Rune c) -{ - Rune *p; - - p = bsearch(c, _toupper2, nelem(_toupper2)/3, 3); - if(p && c >= p[0] && c <= p[1]) - return 1; - p = bsearch(c, _toupper1, nelem(_toupper1)/2, 2); - if(p && c == p[0]) - return 1; - return 0; -} - -int -isupperrune(Rune c) -{ - Rune *p; - - p = bsearch(c, _tolower2, nelem(_tolower2)/3, 3); - if(p && c >= p[0] && c <= p[1]) - return 1; - p = bsearch(c, _tolower1, nelem(_tolower1)/2, 2); - if(p && c == p[0]) - return 1; - return 0; -} - -int -isalpharune(Rune c) -{ - Rune *p; - - if(isupperrune(c) || islowerrune(c)) - return 1; - p = bsearch(c, _alpha2, nelem(_alpha2)/2, 2); - if(p && c >= p[0] && c <= p[1]) - return 1; - p = bsearch(c, _alpha1, nelem(_alpha1), 1); - if(p && c == p[0]) - return 1; - return 0; -} - -int -istitlerune(Rune c) -{ - return isupperrune(c) && islowerrune(c); -} - -int -isspacerune(Rune c) -{ - Rune *p; - - p = bsearch(c, _space2, nelem(_space2)/2, 2); - if(p && c >= p[0] && c <= p[1]) - return 1; - return 0; -} - -int -isdigitrune(Rune c) -{ - Rune *p; - - p = bsearch(c, __isdigitr, nelem(__isdigitr)/2, 2); - if(p && c >= p[0] && c <= p[1]) - return 1; - return 0; -} +#include "runetypebody-6.2.0.h" --- /sys/src/libc/port/runetypebody-6.2.0.h Thu Jan 1 01:00:00 1970 +++ /sys/src/libc/port/runetypebody-6.2.0.h Tue Apr 30 23:05:20 2013 @@ -0,0 +1,1641 @@ +/* generated automatically by mkrunetype.c in Go from UnicodeData-6.2.0.txt + * with s/rbsearch/_runebsearch/g + */ + +static Rune __isspacer[] = { + 0x0009, 0x000d, + 0x0020, 0x0020, + 0x0085, 0x0085, + 0x00a0, 0x00a0, + 0x1680, 0x1680, + 0x180e, 0x180e, + 0x2000, 0x200a, + 0x2028, 0x2029, + 0x202f, 0x202f, + 0x205f, 0x205f, + 0x3000, 0x3000, + 0xfeff, 0xfeff, +}; + +int +isspacerune(Rune c) +{ + Rune *p; + + p = _runebsearch(c, __isspacer, nelem(__isspacer)/2, 2); + if(p && c >= p[0] && c <= p[1]) + return 1; + return 0; +} + +static Rune __isdigitr[] = { + 0x0030, 0x0039, + 0x0660, 0x0669, + 0x06f0, 0x06f9, + 0x07c0, 0x07c9, + 0x0966, 0x096f, + 0x09e6, 0x09ef, + 0x0a66, 0x0a6f, + 0x0ae6, 0x0aef, + 0x0b66, 0x0b6f, + 0x0be6, 0x0bef, + 0x0c66, 0x0c6f, + 0x0ce6, 0x0cef, + 0x0d66, 0x0d6f, + 0x0e50, 0x0e59, + 0x0ed0, 0x0ed9, + 0x0f20, 0x0f29, + 0x1040, 0x1049, + 0x1090, 0x1099, + 0x17e0, 0x17e9, + 0x1810, 0x1819, + 0x1946, 0x194f, + 0x19d0, 0x19d9, + 0x1a80, 0x1a89, + 0x1a90, 0x1a99, + 0x1b50, 0x1b59, + 0x1bb0, 0x1bb9, + 0x1c40, 0x1c49, + 0x1c50, 0x1c59, + 0xa620, 0xa629, + 0xa8d0, 0xa8d9, + 0xa900, 0xa909, + 0xa9d0, 0xa9d9, + 0xaa50, 0xaa59, + 0xabf0, 0xabf9, + 0xff10, 0xff19, + 0x104a0, 0x104a9, + 0x11066, 0x1106f, + 0x110f0, 0x110f9, + 0x11136, 0x1113f, + 0x111d0, 0x111d9, + 0x116c0, 0x116c9, + 0x1d7ce, 0x1d7ff, +}; + +int +isdigitrune(Rune c) +{ + Rune *p; + + p = _runebsearch(c, __isdigitr, nelem(__isdigitr)/2, 2); + if(p && c >= p[0] && c <= p[1]) + return 1; + return 0; +} + +static Rune __isalphar[] = { + 0x0041, 0x005a, + 0x0061, 0x007a, + 0x00c0, 0x00d6, + 0x00d8, 0x00f6, + 0x00f8, 0x02c1, + 0x02c6, 0x02d1, + 0x02e0, 0x02e4, + 0x0370, 0x0374, + 0x0376, 0x0377, + 0x037a, 0x037d, + 0x0388, 0x038a, + 0x038e, 0x03a1, + 0x03a3, 0x03f5, + 0x03f7, 0x0481, + 0x048a, 0x0527, + 0x0531, 0x0556, + 0x0561, 0x0587, + 0x05d0, 0x05ea, + 0x05f0, 0x05f2, + 0x0620, 0x064a, + 0x066e, 0x066f, + 0x0671, 0x06d3, + 0x06e5, 0x06e6, + 0x06ee, 0x06ef, + 0x06fa, 0x06fc, + 0x0712, 0x072f, + 0x074d, 0x07a5, + 0x07ca, 0x07ea, + 0x07f4, 0x07f5, + 0x0800, 0x0815, + 0x0840, 0x0858, + 0x08a2, 0x08ac, + 0x0904, 0x0939, + 0x0958, 0x0961, + 0x0971, 0x0977, + 0x0979, 0x097f, + 0x0985, 0x098c, + 0x098f, 0x0990, + 0x0993, 0x09a8, + 0x09aa, 0x09b0, + 0x09b6, 0x09b9, + 0x09dc, 0x09dd, + 0x09df, 0x09e1, + 0x09f0, 0x09f1, + 0x0a05, 0x0a0a, + 0x0a0f, 0x0a10, + 0x0a13, 0x0a28, + 0x0a2a, 0x0a30, + 0x0a32, 0x0a33, + 0x0a35, 0x0a36, + 0x0a38, 0x0a39, + 0x0a59, 0x0a5c, + 0x0a72, 0x0a74, + 0x0a85, 0x0a8d, + 0x0a8f, 0x0a91, + 0x0a93, 0x0aa8, + 0x0aaa, 0x0ab0, + 0x0ab2, 0x0ab3, + 0x0ab5, 0x0ab9, + 0x0ae0, 0x0ae1, + 0x0b05, 0x0b0c, + 0x0b0f, 0x0b10, + 0x0b13, 0x0b28, + 0x0b2a, 0x0b30, + 0x0b32, 0x0b33, + 0x0b35, 0x0b39, + 0x0b5c, 0x0b5d, + 0x0b5f, 0x0b61, + 0x0b85, 0x0b8a, + 0x0b8e, 0x0b90, + 0x0b92, 0x0b95, + 0x0b99, 0x0b9a, + 0x0b9e, 0x0b9f, + 0x0ba3, 0x0ba4, + 0x0ba8, 0x0baa, + 0x0bae, 0x0bb9, + 0x0c05, 0x0c0c, + 0x0c0e, 0x0c10, + 0x0c12, 0x0c28, + 0x0c2a, 0x0c33, + 0x0c35, 0x0c39, + 0x0c58, 0x0c59, + 0x0c60, 0x0c61, + 0x0c85, 0x0c8c, + 0x0c8e, 0x0c90, + 0x0c92, 0x0ca8, + 0x0caa, 0x0cb3, + 0x0cb5, 0x0cb9, + 0x0ce0, 0x0ce1, + 0x0cf1, 0x0cf2, + 0x0d05, 0x0d0c, + 0x0d0e, 0x0d10, + 0x0d12, 0x0d3a, + 0x0d60, 0x0d61, + 0x0d7a, 0x0d7f, + 0x0d85, 0x0d96, + 0x0d9a, 0x0db1, + 0x0db3, 0x0dbb, + 0x0dc0, 0x0dc6, + 0x0e01, 0x0e30, + 0x0e32, 0x0e33, + 0x0e40, 0x0e46, + 0x0e81, 0x0e82, + 0x0e87, 0x0e88, + 0x0e94, 0x0e97, + 0x0e99, 0x0e9f, + 0x0ea1, 0x0ea3, + 0x0eaa, 0x0eab, + 0x0ead, 0x0eb0, + 0x0eb2, 0x0eb3, + 0x0ec0, 0x0ec4, + 0x0edc, 0x0edf, + 0x0f40, 0x0f47, + 0x0f49, 0x0f6c, + 0x0f88, 0x0f8c, + 0x1000, 0x102a, + 0x1050, 0x1055, + 0x105a, 0x105d, + 0x1065, 0x1066, + 0x106e, 0x1070, + 0x1075, 0x1081, + 0x10a0, 0x10c5, + 0x10d0, 0x10fa, + 0x10fc, 0x1248, + 0x124a, 0x124d, + 0x1250, 0x1256, + 0x125a, 0x125d, + 0x1260, 0x1288, + 0x128a, 0x128d, + 0x1290, 0x12b0, + 0x12b2, 0x12b5, + 0x12b8, 0x12be, + 0x12c2, 0x12c5, + 0x12c8, 0x12d6, + 0x12d8, 0x1310, + 0x1312, 0x1315, + 0x1318, 0x135a, + 0x1380, 0x138f, + 0x13a0, 0x13f4, + 0x1401, 0x166c, + 0x166f, 0x167f, + 0x1681, 0x169a, + 0x16a0, 0x16ea, + 0x1700, 0x170c, + 0x170e, 0x1711, + 0x1720, 0x1731, + 0x1740, 0x1751, + 0x1760, 0x176c, + 0x176e, 0x1770, + 0x1780, 0x17b3, + 0x1820, 0x1877, + 0x1880, 0x18a8, + 0x18b0, 0x18f5, + 0x1900, 0x191c, + 0x1950, 0x196d, + 0x1970, 0x1974, + 0x1980, 0x19ab, + 0x19c1, 0x19c7, + 0x1a00, 0x1a16, + 0x1a20, 0x1a54, + 0x1b05, 0x1b33, + 0x1b45, 0x1b4b, + 0x1b83, 0x1ba0, + 0x1bae, 0x1baf, + 0x1bba, 0x1be5, + 0x1c00, 0x1c23, + 0x1c4d, 0x1c4f, + 0x1c5a, 0x1c7d, + 0x1ce9, 0x1cec, + 0x1cee, 0x1cf1, + 0x1cf5, 0x1cf6, + 0x1d00, 0x1dbf, + 0x1e00, 0x1f15, + 0x1f18, 0x1f1d, + 0x1f20, 0x1f45, + 0x1f48, 0x1f4d, + 0x1f50, 0x1f57, + 0x1f5f, 0x1f7d, + 0x1f80, 0x1fb4, + 0x1fb6, 0x1fbc, + 0x1fc2, 0x1fc4, + 0x1fc6, 0x1fcc, + 0x1fd0, 0x1fd3, + 0x1fd6, 0x1fdb, + 0x1fe0, 0x1fec, + 0x1ff2, 0x1ff4, + 0x1ff6, 0x1ffc, + 0x2090, 0x209c, + 0x210a, 0x2113, + 0x2119, 0x211d, + 0x212a, 0x212d, + 0x212f, 0x2139, + 0x213c, 0x213f, + 0x2145, 0x2149, + 0x2183, 0x2184, + 0x2c00, 0x2c2e, + 0x2c30, 0x2c5e, + 0x2c60, 0x2ce4, + 0x2ceb, 0x2cee, + 0x2cf2, 0x2cf3, + 0x2d00, 0x2d25, + 0x2d30, 0x2d67, + 0x2d80, 0x2d96, + 0x2da0, 0x2da6, + 0x2da8, 0x2dae, + 0x2db0, 0x2db6, + 0x2db8, 0x2dbe, + 0x2dc0, 0x2dc6, + 0x2dc8, 0x2dce, + 0x2dd0, 0x2dd6, + 0x2dd8, 0x2dde, + 0x3005, 0x3006, + 0x3031, 0x3035, + 0x303b, 0x303c, + 0x3041, 0x3096, + 0x309d, 0x309f, + 0x30a1, 0x30fa, + 0x30fc, 0x30ff, + 0x3105, 0x312d, + 0x3131, 0x318e, + 0x31a0, 0x31ba, + 0x31f0, 0x31ff, + 0x3400, 0x4db5, + 0x4e00, 0x9fcc, + 0xa000, 0xa48c, + 0xa4d0, 0xa4fd, + 0xa500, 0xa60c, + 0xa610, 0xa61f, + 0xa62a, 0xa62b, + 0xa640, 0xa66e, + 0xa67f, 0xa697, + 0xa6a0, 0xa6e5, + 0xa717, 0xa71f, + 0xa722, 0xa788, + 0xa78b, 0xa78e, + 0xa790, 0xa793, + 0xa7a0, 0xa7aa, + 0xa7f8, 0xa801, + 0xa803, 0xa805, + 0xa807, 0xa80a, + 0xa80c, 0xa822, + 0xa840, 0xa873, + 0xa882, 0xa8b3, + 0xa8f2, 0xa8f7, + 0xa90a, 0xa925, + 0xa930, 0xa946, + 0xa960, 0xa97c, + 0xa984, 0xa9b2, + 0xaa00, 0xaa28, + 0xaa40, 0xaa42, + 0xaa44, 0xaa4b, + 0xaa60, 0xaa76, + 0xaa80, 0xaaaf, + 0xaab5, 0xaab6, + 0xaab9, 0xaabd, + 0xaadb, 0xaadd, + 0xaae0, 0xaaea, + 0xaaf2, 0xaaf4, + 0xab01, 0xab06, + 0xab09, 0xab0e, + 0xab11, 0xab16, + 0xab20, 0xab26, + 0xab28, 0xab2e, + 0xabc0, 0xabe2, + 0xac00, 0xd7a3, + 0xd7b0, 0xd7c6, + 0xd7cb, 0xd7fb, + 0xf900, 0xfa6d, + 0xfa70, 0xfad9, + 0xfb00, 0xfb06, + 0xfb13, 0xfb17, + 0xfb1f, 0xfb28, + 0xfb2a, 0xfb36, + 0xfb38, 0xfb3c, + 0xfb40, 0xfb41, + 0xfb43, 0xfb44, + 0xfb46, 0xfbb1, + 0xfbd3, 0xfd3d, + 0xfd50, 0xfd8f, + 0xfd92, 0xfdc7, + 0xfdf0, 0xfdfb, + 0xfe70, 0xfe74, + 0xfe76, 0xfefc, + 0xff21, 0xff3a, + 0xff41, 0xff5a, + 0xff66, 0xffbe, + 0xffc2, 0xffc7, + 0xffca, 0xffcf, + 0xffd2, 0xffd7, + 0xffda, 0xffdc, + 0x10000, 0x1000b, + 0x1000d, 0x10026, + 0x10028, 0x1003a, + 0x1003c, 0x1003d, + 0x1003f, 0x1004d, + 0x10050, 0x1005d, + 0x10080, 0x100fa, + 0x10280, 0x1029c, + 0x102a0, 0x102d0, + 0x10300, 0x1031e, + 0x10330, 0x10340, + 0x10342, 0x10349, + 0x10380, 0x1039d, + 0x103a0, 0x103c3, + 0x103c8, 0x103cf, + 0x10400, 0x1049d, + 0x10800, 0x10805, + 0x1080a, 0x10835, + 0x10837, 0x10838, + 0x1083f, 0x10855, + 0x10900, 0x10915, + 0x10920, 0x10939, + 0x10980, 0x109b7, + 0x109be, 0x109bf, + 0x10a10, 0x10a13, + 0x10a15, 0x10a17, + 0x10a19, 0x10a33, + 0x10a60, 0x10a7c, + 0x10b00, 0x10b35, + 0x10b40, 0x10b55, + 0x10b60, 0x10b72, + 0x10c00, 0x10c48, + 0x11003, 0x11037, + 0x11083, 0x110af, + 0x110d0, 0x110e8, + 0x11103, 0x11126, + 0x11183, 0x111b2, + 0x111c1, 0x111c4, + 0x11680, 0x116aa, + 0x12000, 0x1236e, + 0x13000, 0x1342e, + 0x16800, 0x16a38, + 0x16f00, 0x16f44, + 0x16f93, 0x16f9f, + 0x1b000, 0x1b001, + 0x1d400, 0x1d454, + 0x1d456, 0x1d49c, + 0x1d49e, 0x1d49f, + 0x1d4a5, 0x1d4a6, + 0x1d4a9, 0x1d4ac, + 0x1d4ae, 0x1d4b9, + 0x1d4bd, 0x1d4c3, + 0x1d4c5, 0x1d505, + 0x1d507, 0x1d50a, + 0x1d50d, 0x1d514, + 0x1d516, 0x1d51c, + 0x1d51e, 0x1d539, + 0x1d53b, 0x1d53e, + 0x1d540, 0x1d544, + 0x1d54a, 0x1d550, + 0x1d552, 0x1d6a5, + 0x1d6a8, 0x1d6c0, + 0x1d6c2, 0x1d6da, + 0x1d6dc, 0x1d6fa, + 0x1d6fc, 0x1d714, + 0x1d716, 0x1d734, + 0x1d736, 0x1d74e, + 0x1d750, 0x1d76e, + 0x1d770, 0x1d788, + 0x1d78a, 0x1d7a8, + 0x1d7aa, 0x1d7c2, + 0x1d7c4, 0x1d7cb, + 0x1ee00, 0x1ee03, + 0x1ee05, 0x1ee1f, + 0x1ee21, 0x1ee22, + 0x1ee29, 0x1ee32, + 0x1ee34, 0x1ee37, + 0x1ee4d, 0x1ee4f, + 0x1ee51, 0x1ee52, + 0x1ee61, 0x1ee62, + 0x1ee67, 0x1ee6a, + 0x1ee6c, 0x1ee72, + 0x1ee74, 0x1ee77, + 0x1ee79, 0x1ee7c, + 0x1ee80, 0x1ee89, + 0x1ee8b, 0x1ee9b, + 0x1eea1, 0x1eea3, + 0x1eea5, 0x1eea9, + 0x1eeab, 0x1eebb, + 0x20000, 0x2a6d6, + 0x2a700, 0x2b734, + 0x2b740, 0x2b81d, + 0x2f800, 0x2fa1d, +}; + +static Rune __isalphas[] = { + 0x00aa, + 0x00b5, + 0x00ba, + 0x02ec, + 0x02ee, + 0x0386, + 0x038c, + 0x0559, + 0x06d5, + 0x06ff, + 0x0710, + 0x07b1, + 0x07fa, + 0x081a, + 0x0824, + 0x0828, + 0x08a0, + 0x093d, + 0x0950, + 0x09b2, + 0x09bd, + 0x09ce, + 0x0a5e, + 0x0abd, + 0x0ad0, + 0x0b3d, + 0x0b71, + 0x0b83, + 0x0b9c, + 0x0bd0, + 0x0c3d, + 0x0cbd, + 0x0cde, + 0x0d3d, + 0x0d4e, + 0x0dbd, + 0x0e84, + 0x0e8a, + 0x0e8d, + 0x0ea5, + 0x0ea7, + 0x0ebd, + 0x0ec6, + 0x0f00, + 0x103f, + 0x1061, + 0x108e, + 0x10c7, + 0x10cd, + 0x1258, + 0x12c0, + 0x17d7, + 0x17dc, + 0x18aa, + 0x1aa7, + 0x1f59, + 0x1f5b, + 0x1f5d, + 0x1fbe, + 0x2071, + 0x207f, + 0x2102, + 0x2107, + 0x2115, + 0x2124, + 0x2126, + 0x2128, + 0x214e, + 0x2d27, + 0x2d2d, + 0x2d6f, + 0x2e2f, + 0xa8fb, + 0xa9cf, + 0xaa7a, + 0xaab1, + 0xaac0, + 0xaac2, + 0xfb1d, + 0xfb3e, + 0x10808, + 0x1083c, + 0x10a00, + 0x16f50, + 0x1d4a2, + 0x1d4bb, + 0x1d546, + 0x1ee24, + 0x1ee27, + 0x1ee39, + 0x1ee3b, + 0x1ee42, + 0x1ee47, + 0x1ee49, + 0x1ee4b, + 0x1ee54, + 0x1ee57, + 0x1ee59, + 0x1ee5b, + 0x1ee5d, + 0x1ee5f, + 0x1ee64, + 0x1ee7e, +}; + +int +isalpharune(Rune c) +{ + Rune *p; + + p = _runebsearch(c, __isalphar, nelem(__isalphar)/2, 2); + if(p && c >= p[0] && c <= p[1]) + return 1; + p = _runebsearch(c, __isalphas, nelem(__isalphas), 1); + if(p && c == p[0]) + return 1; + return 0; +} + +static Rune __isupperr[] = { + 0x0041, 0x005a, + 0x00c0, 0x00d6, + 0x00d8, 0x00de, + 0x0178, 0x0179, + 0x0181, 0x0182, + 0x0186, 0x0187, + 0x0189, 0x018b, + 0x018e, 0x0191, + 0x0193, 0x0194, + 0x0196, 0x0198, + 0x019c, 0x019d, + 0x019f, 0x01a0, + 0x01a6, 0x01a7, + 0x01ae, 0x01af, + 0x01b1, 0x01b3, + 0x01b7, 0x01b8, + 0x01f6, 0x01f8, + 0x023a, 0x023b, + 0x023d, 0x023e, + 0x0243, 0x0246, + 0x0388, 0x038a, + 0x038e, 0x038f, + 0x0391, 0x03a1, + 0x03a3, 0x03ab, + 0x03d2, 0x03d4, + 0x03f9, 0x03fa, + 0x03fd, 0x042f, + 0x04c0, 0x04c1, + 0x0531, 0x0556, + 0x10a0, 0x10c5, + 0x1f08, 0x1f0f, + 0x1f18, 0x1f1d, + 0x1f28, 0x1f2f, + 0x1f38, 0x1f3f, + 0x1f48, 0x1f4d, + 0x1f68, 0x1f6f, + 0x1f88, 0x1f8f, + 0x1f98, 0x1f9f, + 0x1fa8, 0x1faf, + 0x1fb8, 0x1fbc, + 0x1fc8, 0x1fcc, + 0x1fd8, 0x1fdb, + 0x1fe8, 0x1fec, + 0x1ff8, 0x1ffc, + 0x210b, 0x210d, + 0x2110, 0x2112, + 0x2119, 0x211d, + 0x212a, 0x212d, + 0x2130, 0x2133, + 0x213e, 0x213f, + 0x2160, 0x216f, + 0x24b6, 0x24cf, + 0x2c00, 0x2c2e, + 0x2c62, 0x2c64, + 0x2c6d, 0x2c70, + 0x2c7e, 0x2c80, + 0xa77d, 0xa77e, + 0xff21, 0xff3a, + 0x10400, 0x10427, + 0x1d400, 0x1d419, + 0x1d434, 0x1d44d, + 0x1d468, 0x1d481, + 0x1d49e, 0x1d49f, + 0x1d4a5, 0x1d4a6, + 0x1d4a9, 0x1d4ac, + 0x1d4ae, 0x1d4b5, + 0x1d4d0, 0x1d4e9, + 0x1d504, 0x1d505, + 0x1d507, 0x1d50a, + 0x1d50d, 0x1d514, + 0x1d516, 0x1d51c, + 0x1d538, 0x1d539, + 0x1d53b, 0x1d53e, + 0x1d540, 0x1d544, + 0x1d54a, 0x1d550, + 0x1d56c, 0x1d585, + 0x1d5a0, 0x1d5b9, + 0x1d5d4, 0x1d5ed, + 0x1d608, 0x1d621, + 0x1d63c, 0x1d655, + 0x1d670, 0x1d689, + 0x1d6a8, 0x1d6c0, + 0x1d6e2, 0x1d6fa, + 0x1d71c, 0x1d734, + 0x1d756, 0x1d76e, + 0x1d790, 0x1d7a8, +}; + +static Rune __isupperp[] = { + 0x0100, 0x0136, + 0x0139, 0x0147, + 0x014a, 0x0176, + 0x017b, 0x017d, + 0x01a2, 0x01a4, + 0x01cd, 0x01db, + 0x01de, 0x01ee, + 0x01fa, 0x0232, + 0x0248, 0x024e, + 0x0370, 0x0372, + 0x03d8, 0x03ee, + 0x0460, 0x0480, + 0x048a, 0x04be, + 0x04c3, 0x04cd, + 0x04d0, 0x0526, + 0x1e00, 0x1e94, + 0x1e9e, 0x1efe, + 0x1f59, 0x1f5f, + 0x2124, 0x2128, + 0x2c67, 0x2c6b, + 0x2c82, 0x2ce2, + 0x2ceb, 0x2ced, + 0xa640, 0xa66c, + 0xa680, 0xa696, + 0xa722, 0xa72e, + 0xa732, 0xa76e, + 0xa779, 0xa77b, + 0xa780, 0xa786, + 0xa78b, 0xa78d, + 0xa790, 0xa792, + 0xa7a0, 0xa7aa, +}; + +static Rune __isuppers[] = { + 0x0184, + 0x01a9, + 0x01ac, + 0x01b5, + 0x01bc, + 0x01c4, + 0x01c7, + 0x01ca, + 0x01f1, + 0x01f4, + 0x0241, + 0x0376, + 0x0386, + 0x038c, + 0x03cf, + 0x03f4, + 0x03f7, + 0x10c7, + 0x10cd, + 0x2102, + 0x2107, + 0x2115, + 0x2145, + 0x2183, + 0x2c60, + 0x2c72, + 0x2c75, + 0x2cf2, + 0x1d49c, + 0x1d4a2, + 0x1d546, + 0x1d7ca, +}; + +int +isupperrune(Rune c) +{ + Rune *p; + + p = _runebsearch(c, __isupperr, nelem(__isupperr)/2, 2); + if(p && c >= p[0] && c <= p[1]) + return 1; + p = _runebsearch(c, __isupperp, nelem(__isupperp)/2, 2); + if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1)) + return 1; + p = _runebsearch(c, __isuppers, nelem(__isuppers), 1); + if(p && c == p[0]) + return 1; + return 0; +} + +static Rune __islowerr[] = { + 0x0061, 0x007a, + 0x00df, 0x00f6, + 0x00f8, 0x00ff, + 0x0137, 0x0138, + 0x0148, 0x0149, + 0x017e, 0x0180, + 0x018c, 0x018d, + 0x0199, 0x019b, + 0x01aa, 0x01ab, + 0x01b9, 0x01ba, + 0x01bd, 0x01bf, + 0x01dc, 0x01dd, + 0x01ef, 0x01f0, + 0x0233, 0x0239, + 0x023f, 0x0240, + 0x024f, 0x0293, + 0x0295, 0x02af, + 0x037b, 0x037d, + 0x03ac, 0x03ce, + 0x03d0, 0x03d1, + 0x03d5, 0x03d7, + 0x03ef, 0x03f3, + 0x03fb, 0x03fc, + 0x0430, 0x045f, + 0x04ce, 0x04cf, + 0x0561, 0x0587, + 0x1d00, 0x1d2b, + 0x1d6b, 0x1d77, + 0x1d79, 0x1d9a, + 0x1e95, 0x1e9d, + 0x1eff, 0x1f07, + 0x1f10, 0x1f15, + 0x1f20, 0x1f27, + 0x1f30, 0x1f37, + 0x1f40, 0x1f45, + 0x1f50, 0x1f57, + 0x1f60, 0x1f67, + 0x1f70, 0x1f7d, + 0x1f80, 0x1f87, + 0x1f90, 0x1f97, + 0x1fa0, 0x1fa7, + 0x1fb0, 0x1fb4, + 0x1fb6, 0x1fb7, + 0x1fc2, 0x1fc4, + 0x1fc6, 0x1fc7, + 0x1fd0, 0x1fd3, + 0x1fd6, 0x1fd7, + 0x1fe0, 0x1fe7, + 0x1ff2, 0x1ff4, + 0x1ff6, 0x1ff7, + 0x210e, 0x210f, + 0x213c, 0x213d, + 0x2146, 0x2149, + 0x2170, 0x217f, + 0x24d0, 0x24e9, + 0x2c30, 0x2c5e, + 0x2c65, 0x2c66, + 0x2c73, 0x2c74, + 0x2c76, 0x2c7b, + 0x2ce3, 0x2ce4, + 0x2d00, 0x2d25, + 0xa72f, 0xa731, + 0xa771, 0xa778, + 0xfb00, 0xfb06, + 0xfb13, 0xfb17, + 0xff41, 0xff5a, + 0x10428, 0x1044f, + 0x1d41a, 0x1d433, + 0x1d44e, 0x1d454, + 0x1d456, 0x1d467, + 0x1d482, 0x1d49b, + 0x1d4b6, 0x1d4b9, + 0x1d4bd, 0x1d4c3, + 0x1d4c5, 0x1d4cf, + 0x1d4ea, 0x1d503, + 0x1d51e, 0x1d537, + 0x1d552, 0x1d56b, + 0x1d586, 0x1d59f, + 0x1d5ba, 0x1d5d3, + 0x1d5ee, 0x1d607, + 0x1d622, 0x1d63b, + 0x1d656, 0x1d66f, + 0x1d68a, 0x1d6a5, + 0x1d6c2, 0x1d6da, + 0x1d6dc, 0x1d6e1, + 0x1d6fc, 0x1d714, + 0x1d716, 0x1d71b, + 0x1d736, 0x1d74e, + 0x1d750, 0x1d755, + 0x1d770, 0x1d788, + 0x1d78a, 0x1d78f, + 0x1d7aa, 0x1d7c2, + 0x1d7c4, 0x1d7c9, +}; + +static Rune __islowerp[] = { + 0x0101, 0x0135, + 0x013a, 0x0146, + 0x014b, 0x0177, + 0x017a, 0x017c, + 0x0183, 0x0185, + 0x01a1, 0x01a5, + 0x01b4, 0x01b6, + 0x01cc, 0x01da, + 0x01df, 0x01ed, + 0x01f3, 0x01f5, + 0x01f9, 0x0231, + 0x0247, 0x024d, + 0x0371, 0x0373, + 0x03d9, 0x03ed, + 0x0461, 0x0481, + 0x048b, 0x04bf, + 0x04c2, 0x04cc, + 0x04d1, 0x0527, + 0x1e01, 0x1e93, + 0x1e9f, 0x1efd, + 0x2c68, 0x2c6c, + 0x2c81, 0x2ce1, + 0x2cec, 0x2cee, + 0xa641, 0xa66d, + 0xa681, 0xa697, + 0xa723, 0xa72d, + 0xa733, 0xa76f, + 0xa77a, 0xa77c, + 0xa77f, 0xa787, + 0xa78c, 0xa78e, + 0xa791, 0xa793, + 0xa7a1, 0xa7a9, +}; + +static Rune __islowers[] = { + 0x00b5, + 0x0188, + 0x0192, + 0x0195, + 0x019e, + 0x01a8, + 0x01ad, + 0x01b0, + 0x01c6, + 0x01c9, + 0x023c, + 0x0242, + 0x0377, + 0x0390, + 0x03f5, + 0x03f8, + 0x1fbe, + 0x210a, + 0x2113, + 0x212f, + 0x2134, + 0x2139, + 0x214e, + 0x2184, + 0x2c61, + 0x2c71, + 0x2cf3, + 0x2d27, + 0x2d2d, + 0xa7fa, + 0x1d4bb, + 0x1d7cb, +}; + +int +islowerrune(Rune c) +{ + Rune *p; + + p = _runebsearch(c, __islowerr, nelem(__islowerr)/2, 2); + if(p && c >= p[0] && c <= p[1]) + return 1; + p = _runebsearch(c, __islowerp, nelem(__islowerp)/2, 2); + if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1)) + return 1; + p = _runebsearch(c, __islowers, nelem(__islowers), 1); + if(p && c == p[0]) + return 1; + return 0; +} + +static Rune __istitler[] = { + 0x0041, 0x005a, + 0x00c0, 0x00d6, + 0x00d8, 0x00de, + 0x0178, 0x0179, + 0x0181, 0x0182, + 0x0186, 0x0187, + 0x0189, 0x018b, + 0x018e, 0x0191, + 0x0193, 0x0194, + 0x0196, 0x0198, + 0x019c, 0x019d, + 0x019f, 0x01a0, + 0x01a6, 0x01a7, + 0x01ae, 0x01af, + 0x01b1, 0x01b3, + 0x01b7, 0x01b8, + 0x01f6, 0x01f8, + 0x023a, 0x023b, + 0x023d, 0x023e, + 0x0243, 0x0246, + 0x0388, 0x038a, + 0x038e, 0x038f, + 0x0391, 0x03a1, + 0x03a3, 0x03ab, + 0x03f9, 0x03fa, + 0x03fd, 0x042f, + 0x04c0, 0x04c1, + 0x0531, 0x0556, + 0x10a0, 0x10c5, + 0x1f08, 0x1f0f, + 0x1f18, 0x1f1d, + 0x1f28, 0x1f2f, + 0x1f38, 0x1f3f, + 0x1f48, 0x1f4d, + 0x1f68, 0x1f6f, + 0x1f88, 0x1f8f, + 0x1f98, 0x1f9f, + 0x1fa8, 0x1faf, + 0x1fb8, 0x1fbc, + 0x1fc8, 0x1fcc, + 0x1fd8, 0x1fdb, + 0x1fe8, 0x1fec, + 0x1ff8, 0x1ffc, + 0x2160, 0x216f, + 0x24b6, 0x24cf, + 0x2c00, 0x2c2e, + 0x2c62, 0x2c64, + 0x2c6d, 0x2c70, + 0x2c7e, 0x2c80, + 0xa77d, 0xa77e, + 0xff21, 0xff3a, + 0x10400, 0x10427, +}; + +static Rune __istitlep[] = { + 0x0100, 0x012e, + 0x0132, 0x0136, + 0x0139, 0x0147, + 0x014a, 0x0176, + 0x017b, 0x017d, + 0x01a2, 0x01a4, + 0x01cb, 0x01db, + 0x01de, 0x01ee, + 0x01f2, 0x01f4, + 0x01fa, 0x0232, + 0x0248, 0x024e, + 0x0370, 0x0372, + 0x03d8, 0x03ee, + 0x0460, 0x0480, + 0x048a, 0x04be, + 0x04c3, 0x04cd, + 0x04d0, 0x0526, + 0x1e00, 0x1e94, + 0x1ea0, 0x1efe, + 0x1f59, 0x1f5f, + 0x2c67, 0x2c6b, + 0x2c82, 0x2ce2, + 0x2ceb, 0x2ced, + 0xa640, 0xa66c, + 0xa680, 0xa696, + 0xa722, 0xa72e, + 0xa732, 0xa76e, + 0xa779, 0xa77b, + 0xa780, 0xa786, + 0xa78b, 0xa78d, + 0xa790, 0xa792, + 0xa7a0, 0xa7aa, +}; + +static Rune __istitles[] = { + 0x0184, + 0x01a9, + 0x01ac, + 0x01b5, + 0x01bc, + 0x01c5, + 0x01c8, + 0x0241, + 0x0376, + 0x0386, + 0x038c, + 0x03cf, + 0x03f7, + 0x10c7, + 0x10cd, + 0x2132, + 0x2183, + 0x2c60, + 0x2c72, + 0x2c75, + 0x2cf2, +}; + +int +istitlerune(Rune c) +{ + Rune *p; + + p = _runebsearch(c, __istitler, nelem(__istitler)/2, 2); + if(p && c >= p[0] && c <= p[1]) + return 1; + p = _runebsearch(c, __istitlep, nelem(__istitlep)/2, 2); + if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1)) + return 1; + p = _runebsearch(c, __istitles, nelem(__istitles), 1); + if(p && c == p[0]) + return 1; + return 0; +} + +static Rune __toupperr[] = { + 0x0061, 0x007a, 1048544, + 0x00e0, 0x00f6, 1048544, + 0x00f8, 0x00fe, 1048544, + 0x023f, 0x0240, 1059391, + 0x0256, 0x0257, 1048371, + 0x028a, 0x028b, 1048359, + 0x037b, 0x037d, 1048706, + 0x03ad, 0x03af, 1048539, + 0x03b1, 0x03c1, 1048544, + 0x03c3, 0x03cb, 1048544, + 0x03cd, 0x03ce, 1048513, + 0x0430, 0x044f, 1048544, + 0x0450, 0x045f, 1048496, + 0x0561, 0x0586, 1048528, + 0x1f00, 0x1f07, 1048584, + 0x1f10, 0x1f15, 1048584, + 0x1f20, 0x1f27, 1048584, + 0x1f30, 0x1f37, 1048584, + 0x1f40, 0x1f45, 1048584, + 0x1f60, 0x1f67, 1048584, + 0x1f70, 0x1f71, 1048650, + 0x1f72, 0x1f75, 1048662, + 0x1f76, 0x1f77, 1048676, + 0x1f78, 0x1f79, 1048704, + 0x1f7a, 0x1f7b, 1048688, + 0x1f7c, 0x1f7d, 1048702, + 0x1f80, 0x1f87, 1048584, + 0x1f90, 0x1f97, 1048584, + 0x1fa0, 0x1fa7, 1048584, + 0x1fb0, 0x1fb1, 1048584, + 0x1fd0, 0x1fd1, 1048584, + 0x1fe0, 0x1fe1, 1048584, + 0x2170, 0x217f, 1048560, + 0x24d0, 0x24e9, 1048550, + 0x2c30, 0x2c5e, 1048528, + 0x2d00, 0x2d25, 1041312, + 0xff41, 0xff5a, 1048544, + 0x10428, 0x1044f, 1048536, +}; + +static Rune __toupperp[] = { + 0x0101, 0x012f, 1048575, + 0x0133, 0x0137, 1048575, + 0x013a, 0x0148, 1048575, + 0x014b, 0x0177, 1048575, + 0x017a, 0x017e, 1048575, + 0x0183, 0x0185, 1048575, + 0x01a1, 0x01a5, 1048575, + 0x01b4, 0x01b6, 1048575, + 0x01ce, 0x01dc, 1048575, + 0x01df, 0x01ef, 1048575, + 0x01f9, 0x021f, 1048575, + 0x0223, 0x0233, 1048575, + 0x0247, 0x024f, 1048575, + 0x0371, 0x0373, 1048575, + 0x03d9, 0x03ef, 1048575, + 0x0461, 0x0481, 1048575, + 0x048b, 0x04bf, 1048575, + 0x04c2, 0x04ce, 1048575, + 0x04d1, 0x0527, 1048575, + 0x1e01, 0x1e95, 1048575, + 0x1ea1, 0x1eff, 1048575, + 0x1f51, 0x1f57, 1048584, + 0x2c68, 0x2c6c, 1048575, + 0x2c81, 0x2ce3, 1048575, + 0x2cec, 0x2cee, 1048575, + 0xa641, 0xa66d, 1048575, + 0xa681, 0xa697, 1048575, + 0xa723, 0xa72f, 1048575, + 0xa733, 0xa76f, 1048575, + 0xa77a, 0xa77c, 1048575, + 0xa77f, 0xa787, 1048575, + 0xa791, 0xa793, 1048575, + 0xa7a1, 0xa7a9, 1048575, +}; + +static Rune __touppers[] = { + 0x00b5, 1049319, + 0x00ff, 1048697, + 0x0131, 1048344, + 0x017f, 1048276, + 0x0180, 1048771, + 0x0188, 1048575, + 0x018c, 1048575, + 0x0192, 1048575, + 0x0195, 1048673, + 0x0199, 1048575, + 0x019a, 1048739, + 0x019e, 1048706, + 0x01a8, 1048575, + 0x01ad, 1048575, + 0x01b0, 1048575, + 0x01b9, 1048575, + 0x01bd, 1048575, + 0x01bf, 1048632, + 0x01c5, 1048575, + 0x01c6, 1048574, + 0x01c8, 1048575, + 0x01c9, 1048574, + 0x01cb, 1048575, + 0x01cc, 1048574, + 0x01dd, 1048497, + 0x01f2, 1048575, + 0x01f3, 1048574, + 0x01f5, 1048575, + 0x023c, 1048575, + 0x0242, 1048575, + 0x0250, 1059359, + 0x0251, 1059356, + 0x0252, 1059358, + 0x0253, 1048366, + 0x0254, 1048370, + 0x0259, 1048374, + 0x025b, 1048373, + 0x0260, 1048371, + 0x0263, 1048369, + 0x0265, 1090856, + 0x0266, 1090884, + 0x0268, 1048367, + 0x0269, 1048365, + 0x026b, 1059319, + 0x026f, 1048365, + 0x0271, 1059325, + 0x0272, 1048363, + 0x0275, 1048362, + 0x027d, 1059303, + 0x0280, 1048358, + 0x0283, 1048358, + 0x0288, 1048358, + 0x0289, 1048507, + 0x028c, 1048505, + 0x0292, 1048357, + 0x0345, 1048660, + 0x0377, 1048575, + 0x03ac, 1048538, + 0x03c2, 1048545, + 0x03cc, 1048512, + 0x03d0, 1048514, + 0x03d1, 1048519, + 0x03d5, 1048529, + 0x03d6, 1048522, + 0x03d7, 1048568, + 0x03f0, 1048490, + 0x03f1, 1048496, + 0x03f2, 1048583, + 0x03f5, 1048480, + 0x03f8, 1048575, + 0x03fb, 1048575, + 0x04cf, 1048561, + 0x1d79, 1083908, + 0x1d7d, 1052390, + 0x1e9b, 1048517, + 0x1fb3, 1048585, + 0x1fbe, 1041371, + 0x1fc3, 1048585, + 0x1fe5, 1048583, + 0x1ff3, 1048585, + 0x214e, 1048548, + 0x2184, 1048575, + 0x2c61, 1048575, + 0x2c65, 1037781, + 0x2c66, 1037784, + 0x2c73, 1048575, + 0x2c76, 1048575, + 0x2cf3, 1048575, + 0x2d27, 1041312, + 0x2d2d, 1041312, + 0xa78c, 1048575, +}; + +Rune +toupperrune(Rune c) +{ + Rune *p; + + p = _runebsearch(c, __toupperr, nelem(__toupperr)/3, 3); + if(p && c >= p[0] && c <= p[1]) + return c + p[2] - 1048576; + p = _runebsearch(c, __toupperp, nelem(__toupperp)/3, 3); + if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1)) + return c + p[2] - 1048576; + p = _runebsearch(c, __touppers, nelem(__touppers)/2, 2); + if(p && c == p[0]) + return c + p[1] - 1048576; + return c; +} + +static Rune __tolowerr[] = { + 0x0041, 0x005a, 1048608, + 0x00c0, 0x00d6, 1048608, + 0x00d8, 0x00de, 1048608, + 0x0189, 0x018a, 1048781, + 0x01b1, 0x01b2, 1048793, + 0x0388, 0x038a, 1048613, + 0x038e, 0x038f, 1048639, + 0x0391, 0x03a1, 1048608, + 0x03a3, 0x03ab, 1048608, + 0x03fd, 0x03ff, 1048446, + 0x0400, 0x040f, 1048656, + 0x0410, 0x042f, 1048608, + 0x0531, 0x0556, 1048624, + 0x10a0, 0x10c5, 1055840, + 0x1f08, 0x1f0f, 1048568, + 0x1f18, 0x1f1d, 1048568, + 0x1f28, 0x1f2f, 1048568, + 0x1f38, 0x1f3f, 1048568, + 0x1f48, 0x1f4d, 1048568, + 0x1f68, 0x1f6f, 1048568, + 0x1f88, 0x1f8f, 1048568, + 0x1f98, 0x1f9f, 1048568, + 0x1fa8, 0x1faf, 1048568, + 0x1fb8, 0x1fb9, 1048568, + 0x1fba, 0x1fbb, 1048502, + 0x1fc8, 0x1fcb, 1048490, + 0x1fd8, 0x1fd9, 1048568, + 0x1fda, 0x1fdb, 1048476, + 0x1fe8, 0x1fe9, 1048568, + 0x1fea, 0x1feb, 1048464, + 0x1ff8, 0x1ff9, 1048448, + 0x1ffa, 0x1ffb, 1048450, + 0x2160, 0x216f, 1048592, + 0x24b6, 0x24cf, 1048602, + 0x2c00, 0x2c2e, 1048624, + 0x2c7e, 0x2c7f, 1037761, + 0xff21, 0xff3a, 1048608, + 0x10400, 0x10427, 1048616, +}; + +static Rune __tolowerp[] = { + 0x0100, 0x012e, 1048577, + 0x0132, 0x0136, 1048577, + 0x0139, 0x0147, 1048577, + 0x014a, 0x0176, 1048577, + 0x017b, 0x017d, 1048577, + 0x01a2, 0x01a4, 1048577, + 0x01b3, 0x01b5, 1048577, + 0x01cd, 0x01db, 1048577, + 0x01de, 0x01ee, 1048577, + 0x01f8, 0x021e, 1048577, + 0x0222, 0x0232, 1048577, + 0x0248, 0x024e, 1048577, + 0x0370, 0x0372, 1048577, + 0x03d8, 0x03ee, 1048577, + 0x0460, 0x0480, 1048577, + 0x048a, 0x04be, 1048577, + 0x04c3, 0x04cd, 1048577, + 0x04d0, 0x0526, 1048577, + 0x1e00, 0x1e94, 1048577, + 0x1ea0, 0x1efe, 1048577, + 0x1f59, 0x1f5f, 1048568, + 0x2c67, 0x2c6b, 1048577, + 0x2c80, 0x2ce2, 1048577, + 0x2ceb, 0x2ced, 1048577, + 0xa640, 0xa66c, 1048577, + 0xa680, 0xa696, 1048577, + 0xa722, 0xa72e, 1048577, + 0xa732, 0xa76e, 1048577, + 0xa779, 0xa77b, 1048577, + 0xa780, 0xa786, 1048577, + 0xa790, 0xa792, 1048577, + 0xa7a0, 0xa7a8, 1048577, +}; + +static Rune __tolowers[] = { + 0x0130, 1048377, + 0x0178, 1048455, + 0x0179, 1048577, + 0x0181, 1048786, + 0x0182, 1048577, + 0x0184, 1048577, + 0x0186, 1048782, + 0x0187, 1048577, + 0x018b, 1048577, + 0x018e, 1048655, + 0x018f, 1048778, + 0x0190, 1048779, + 0x0191, 1048577, + 0x0193, 1048781, + 0x0194, 1048783, + 0x0196, 1048787, + 0x0197, 1048785, + 0x0198, 1048577, + 0x019c, 1048787, + 0x019d, 1048789, + 0x019f, 1048790, + 0x01a0, 1048577, + 0x01a6, 1048794, + 0x01a7, 1048577, + 0x01a9, 1048794, + 0x01ac, 1048577, + 0x01ae, 1048794, + 0x01af, 1048577, + 0x01b7, 1048795, + 0x01b8, 1048577, + 0x01bc, 1048577, + 0x01c4, 1048578, + 0x01c5, 1048577, + 0x01c7, 1048578, + 0x01c8, 1048577, + 0x01ca, 1048578, + 0x01cb, 1048577, + 0x01f1, 1048578, + 0x01f2, 1048577, + 0x01f4, 1048577, + 0x01f6, 1048479, + 0x01f7, 1048520, + 0x0220, 1048446, + 0x023a, 1059371, + 0x023b, 1048577, + 0x023d, 1048413, + 0x023e, 1059368, + 0x0241, 1048577, + 0x0243, 1048381, + 0x0244, 1048645, + 0x0245, 1048647, + 0x0246, 1048577, + 0x0376, 1048577, + 0x0386, 1048614, + 0x038c, 1048640, + 0x03cf, 1048584, + 0x03f4, 1048516, + 0x03f7, 1048577, + 0x03f9, 1048569, + 0x03fa, 1048577, + 0x04c0, 1048591, + 0x04c1, 1048577, + 0x10c7, 1055840, + 0x10cd, 1055840, + 0x1e9e, 1040961, + 0x1fbc, 1048567, + 0x1fcc, 1048567, + 0x1fec, 1048569, + 0x1ffc, 1048567, + 0x2126, 1041059, + 0x212a, 1040193, + 0x212b, 1040314, + 0x2132, 1048604, + 0x2183, 1048577, + 0x2c60, 1048577, + 0x2c62, 1037833, + 0x2c63, 1044762, + 0x2c64, 1037849, + 0x2c6d, 1037796, + 0x2c6e, 1037827, + 0x2c6f, 1037793, + 0x2c70, 1037794, + 0x2c72, 1048577, + 0x2c75, 1048577, + 0x2cf2, 1048577, + 0xa77d, 1013244, + 0xa77e, 1048577, + 0xa78b, 1048577, + 0xa78d, 1006296, + 0xa7aa, 1006268, +}; + +Rune +tolowerrune(Rune c) +{ + Rune *p; + + p = _runebsearch(c, __tolowerr, nelem(__tolowerr)/3, 3); + if(p && c >= p[0] && c <= p[1]) + return c + p[2] - 1048576; + p = _runebsearch(c, __tolowerp, nelem(__tolowerp)/3, 3); + if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1)) + return c + p[2] - 1048576; + p = _runebsearch(c, __tolowers, nelem(__tolowers)/2, 2); + if(p && c == p[0]) + return c + p[1] - 1048576; + return c; +} + +static Rune __totitler[] = { + 0x0061, 0x007a, 1048544, + 0x00e0, 0x00f6, 1048544, + 0x00f8, 0x00fe, 1048544, + 0x023f, 0x0240, 1059391, + 0x0256, 0x0257, 1048371, + 0x028a, 0x028b, 1048359, + 0x037b, 0x037d, 1048706, + 0x03ad, 0x03af, 1048539, + 0x03b1, 0x03c1, 1048544, + 0x03c3, 0x03cb, 1048544, + 0x03cd, 0x03ce, 1048513, + 0x0430, 0x044f, 1048544, + 0x0450, 0x045f, 1048496, + 0x0561, 0x0586, 1048528, + 0x1f00, 0x1f07, 1048584, + 0x1f10, 0x1f15, 1048584, + 0x1f20, 0x1f27, 1048584, + 0x1f30, 0x1f37, 1048584, + 0x1f40, 0x1f45, 1048584, + 0x1f60, 0x1f67, 1048584, + 0x1f70, 0x1f71, 1048650, + 0x1f72, 0x1f75, 1048662, + 0x1f76, 0x1f77, 1048676, + 0x1f78, 0x1f79, 1048704, + 0x1f7a, 0x1f7b, 1048688, + 0x1f7c, 0x1f7d, 1048702, + 0x1f80, 0x1f87, 1048584, + 0x1f90, 0x1f97, 1048584, + 0x1fa0, 0x1fa7, 1048584, + 0x1fb0, 0x1fb1, 1048584, + 0x1fd0, 0x1fd1, 1048584, + 0x1fe0, 0x1fe1, 1048584, + 0x2170, 0x217f, 1048560, + 0x24d0, 0x24e9, 1048550, + 0x2c30, 0x2c5e, 1048528, + 0x2d00, 0x2d25, 1041312, + 0xff41, 0xff5a, 1048544, + 0x10428, 0x1044f, 1048536, +}; + +static Rune __totitlep[] = { + 0x0101, 0x012f, 1048575, + 0x0133, 0x0137, 1048575, + 0x013a, 0x0148, 1048575, + 0x014b, 0x0177, 1048575, + 0x017a, 0x017e, 1048575, + 0x0183, 0x0185, 1048575, + 0x01a1, 0x01a5, 1048575, + 0x01b4, 0x01b6, 1048575, + 0x01cc, 0x01dc, 1048575, + 0x01df, 0x01ef, 1048575, + 0x01f3, 0x01f5, 1048575, + 0x01f9, 0x021f, 1048575, + 0x0223, 0x0233, 1048575, + 0x0247, 0x024f, 1048575, + 0x0371, 0x0373, 1048575, + 0x03d9, 0x03ef, 1048575, + 0x0461, 0x0481, 1048575, + 0x048b, 0x04bf, 1048575, + 0x04c2, 0x04ce, 1048575, + 0x04d1, 0x0527, 1048575, + 0x1e01, 0x1e95, 1048575, + 0x1ea1, 0x1eff, 1048575, + 0x1f51, 0x1f57, 1048584, + 0x2c68, 0x2c6c, 1048575, + 0x2c81, 0x2ce3, 1048575, + 0x2cec, 0x2cee, 1048575, + 0xa641, 0xa66d, 1048575, + 0xa681, 0xa697, 1048575, + 0xa723, 0xa72f, 1048575, + 0xa733, 0xa76f, 1048575, + 0xa77a, 0xa77c, 1048575, + 0xa77f, 0xa787, 1048575, + 0xa791, 0xa793, 1048575, + 0xa7a1, 0xa7a9, 1048575, +}; + +static Rune __totitles[] = { + 0x00b5, 1049319, + 0x00ff, 1048697, + 0x0131, 1048344, + 0x017f, 1048276, + 0x0180, 1048771, + 0x0188, 1048575, + 0x018c, 1048575, + 0x0192, 1048575, + 0x0195, 1048673, + 0x0199, 1048575, + 0x019a, 1048739, + 0x019e, 1048706, + 0x01a8, 1048575, + 0x01ad, 1048575, + 0x01b0, 1048575, + 0x01b9, 1048575, + 0x01bd, 1048575, + 0x01bf, 1048632, + 0x01c4, 1048577, + 0x01c6, 1048575, + 0x01c7, 1048577, + 0x01c9, 1048575, + 0x01ca, 1048577, + 0x01dd, 1048497, + 0x01f1, 1048577, + 0x023c, 1048575, + 0x0242, 1048575, + 0x0250, 1059359, + 0x0251, 1059356, + 0x0252, 1059358, + 0x0253, 1048366, + 0x0254, 1048370, + 0x0259, 1048374, + 0x025b, 1048373, + 0x0260, 1048371, + 0x0263, 1048369, + 0x0265, 1090856, + 0x0266, 1090884, + 0x0268, 1048367, + 0x0269, 1048365, + 0x026b, 1059319, + 0x026f, 1048365, + 0x0271, 1059325, + 0x0272, 1048363, + 0x0275, 1048362, + 0x027d, 1059303, + 0x0280, 1048358, + 0x0283, 1048358, + 0x0288, 1048358, + 0x0289, 1048507, + 0x028c, 1048505, + 0x0292, 1048357, + 0x0345, 1048660, + 0x0377, 1048575, + 0x03ac, 1048538, + 0x03c2, 1048545, + 0x03cc, 1048512, + 0x03d0, 1048514, + 0x03d1, 1048519, + 0x03d5, 1048529, + 0x03d6, 1048522, + 0x03d7, 1048568, + 0x03f0, 1048490, + 0x03f1, 1048496, + 0x03f2, 1048583, + 0x03f5, 1048480, + 0x03f8, 1048575, + 0x03fb, 1048575, + 0x04cf, 1048561, + 0x1d79, 1083908, + 0x1d7d, 1052390, + 0x1e9b, 1048517, + 0x1fb3, 1048585, + 0x1fbe, 1041371, + 0x1fc3, 1048585, + 0x1fe5, 1048583, + 0x1ff3, 1048585, + 0x214e, 1048548, + 0x2184, 1048575, + 0x2c61, 1048575, + 0x2c65, 1037781, + 0x2c66, 1037784, + 0x2c73, 1048575, + 0x2c76, 1048575, + 0x2cf3, 1048575, + 0x2d27, 1041312, + 0x2d2d, 1041312, + 0xa78c, 1048575, +}; + +Rune +totitlerune(Rune c) +{ + Rune *p; + + p = _runebsearch(c, __totitler, nelem(__totitler)/3, 3); + if(p && c >= p[0] && c <= p[1]) + return c + p[2] - 1048576; + p = _runebsearch(c, __totitlep, nelem(__totitlep)/3, 3); + if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1)) + return c + p[2] - 1048576; + p = _runebsearch(c, __totitles, nelem(__totitles)/2, 2); + if(p && c == p[0]) + return c + p[1] - 1048576; + return c; +} + --- /sys/src/libdraw/buildfont.c Mon Jul 25 23:19:18 2011 +++ /sys/src/libdraw/buildfont.c Thu Apr 25 01:00:11 2013 @@ -70,7 +70,7 @@ } max = strtol(s, &s, 0); s = skip(s); - if(*s==0 || min>=65536 || max>=65536 || min>max){ + if(*s==0 || min>=Runemax || max>=Runemax || min>max){ werrstr("illegal subfont range"); Err3: freefont(fnt); --- /sys/src/libmach/0.c Fri Mar 31 21:49:35 2006 +++ /sys/src/libmach/0.c Thu Apr 25 00:58:42 2013 @@ -4,6 +4,7 @@ * currently no compiler - not related to 0c */ #include +#include #include #include "mips2ureg.h" #include --- /sys/src/libmach/5.c Thu Mar 8 21:52:30 2007 +++ /sys/src/libmach/5.c Thu Apr 25 23:56:02 2013 @@ -2,10 +2,10 @@ * arm definition */ #include +#include #include #include "/arm/include/ureg.h" #include - #define REGOFF(x) (ulong) (&((struct Ureg *) 0)->x) --- /sys/src/libmach/68020.c Thu Sep 27 20:02:45 2012 +++ /sys/src/libmach/68020.c Thu Apr 25 00:58:43 2013 @@ -3,6 +3,7 @@ */ #include #include "68020/ureg.h" +#include #include #include --- /sys/src/libmach/8.c Wed Dec 14 23:52:00 2011 +++ /sys/src/libmach/8.c Thu Apr 25 23:56:02 2013 @@ -2,6 +2,7 @@ * 386 definition */ #include +#include #include #include "/386/include/ureg.h" #include --- /sys/src/libmach/alpha.c Thu Sep 27 19:58:16 2012 +++ /sys/src/libmach/alpha.c Thu Apr 25 00:58:43 2013 @@ -2,6 +2,7 @@ * alpha definition */ #include +#include #include #include "alpha/ureg.h" #include --- /sys/src/libmach/k.c Thu Jan 26 23:41:36 2006 +++ /sys/src/libmach/k.c Thu Apr 25 00:58:43 2013 @@ -2,6 +2,7 @@ * sparc definition */ #include +#include #include #include "/sparc/include/ureg.h" #include --- /sys/src/libmach/q.c Wed Oct 14 16:29:49 2009 +++ /sys/src/libmach/q.c Thu Apr 25 00:58:43 2013 @@ -3,6 +3,7 @@ * forsyth@terzarima.net */ #include +#include #include #include "/power/include/ureg.h" #include --- /sys/src/libmach/sparc64.c Thu Sep 27 17:11:37 2012 +++ /sys/src/libmach/sparc64.c Thu Apr 25 00:58:43 2013 @@ -2,6 +2,7 @@ * sparc64 definition */ #include +#include #include #include "sparc64/ureg.h" #include --- /sys/src/libmach/v.c Wed Oct 12 03:08:03 2005 +++ /sys/src/libmach/v.c Thu Apr 25 00:58:43 2013 @@ -2,6 +2,7 @@ * mips definition */ #include +#include #include #include "/mips/include/ureg.h" #include --- /sys/src/libmach/vcodas.c Wed Jan 4 00:02:10 2006 +++ /sys/src/libmach/vcodas.c Thu Apr 25 00:57:32 2013 @@ -493,8 +493,12 @@ m = "rfe"; break; - case 32: + case 24: m = "eret"; + break; + + case 32: + m = "wait"; break; } if (m) { --- /sys/src/libmach/vdb.c Fri Mar 31 16:20:04 2006 +++ /sys/src/libmach/vdb.c Thu Apr 25 00:57:32 2013 @@ -415,7 +415,9 @@ sll(Opcode *o, Instr *i) { if (i->w0 == 0) - bprint(i, "NOOP"); + bprint(i, "NOOP"); /* unofficial nop */ + else if (i->w0 == 0xc0) /* 0xc0: SLL $3,R0 */ + bprint(i, "EHB"); else if (i->rd == i->rt) format(o->mnemonic, i, "$%a,R%d"); else @@ -962,8 +964,12 @@ m = "RFE"; break; - case 32: + case 24: m = "ERET"; + break; + + case 32: + m = "WAIT"; break; } if (m) {