Browse Source

Plan 9 from Bell Labs 2013-05-01

David du Colombier 11 years ago
parent
commit
83d6593e6c

+ 1 - 1
386/include/u.h

@@ -8,7 +8,7 @@ typedef	long long	vlong;
 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

+ 1 - 1
amd64/include/u.h

@@ -8,7 +8,7 @@ typedef	long long	vlong;
 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

+ 1 - 1
arm/include/u.h

@@ -9,7 +9,7 @@ typedef	long long	vlong;
 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

+ 0 - 8
dist/replica/plan9.proto

@@ -31,12 +31,6 @@ usr	- sys sys
 # architectures owned by sys
 386	- sys sys
 	+	- sys sys
-68000	- sys sys
-	+	- sys sys
-68020	- sys sys
-	+	- sys sys
-alpha	- sys sys
-	+	- sys sys
 amd64	- sys sys
 	+	- sys sys
 arm	- sys sys
@@ -49,8 +43,6 @@ power64	- sys sys
 	+	- sys sys
 sparc	- sys sys
 	+	- sys sys
-sparc64	- sys sys
-	+	- sys sys
 
 # everything else is owned by sys
 acme	- sys sys

+ 0 - 8
dist/replica/plan9binary.proto

@@ -31,12 +31,6 @@ usr	- sys sys
 # architectures owned by sys
 386	- sys sys
 	+	- sys sys
-68000	- sys sys
-	+	- sys sys
-68020	- sys sys
-	+	- sys sys
-alpha	- sys sys
-	+	- sys sys
 amd64	- sys sys
 	+	- sys sys
 arm	- sys sys
@@ -49,8 +43,6 @@ power64	- sys sys
 	+	- sys sys
 sparc	- sys sys
 	+	- sys sys
-sparc64	- sys sys
-	+	- sys sys
 
 # everything else is owned by sys
 acme	- sys sys

+ 1 - 1
mips/include/u.h

@@ -8,7 +8,7 @@ typedef	long long	vlong;
 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

+ 1 - 1
power/include/u.h

@@ -8,7 +8,7 @@ typedef	long long	vlong;
 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

+ 1 - 1
power64/include/u.h

@@ -8,7 +8,7 @@ typedef	long long	vlong;
 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

+ 1 - 1
sparc/include/u.h

@@ -8,7 +8,7 @@ typedef	long long	vlong;
 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

+ 1 - 1
sys/include/ape/limits.h

@@ -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

+ 1 - 1
sys/include/ape/stdlib.h

@@ -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;

+ 1 - 1
sys/include/ape/u.h

@@ -12,7 +12,7 @@ typedef unsigned int	uint;
 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;
 

+ 4 - 3
sys/include/ape/utf.h

@@ -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 */
 };
 
 /*

+ 1 - 1
sys/include/bio.h

@@ -7,7 +7,7 @@ typedef	struct	Biobufhdr	Biobufhdr;
 enum
 {
 	Bsize		= 8*1024,
-	Bungetsize	= 4,		/* space for ungetc */
+	Bungetsize	= UTFmax+1,		/* space for ungetc */
 	Bmagic		= 0x314159,
 	Beof		= -1,
 	Bbad		= -2,

+ 6 - 4
sys/include/libc.h

@@ -41,12 +41,12 @@ extern	int	tokenize(char*, char**, int);
 
 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*	runestrstr(Rune*, Rune*);
 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

+ 0 - 1
sys/lib/dist/setup

@@ -16,7 +16,6 @@ if (! test -e $dist/web.protect/plan9.iso) {
 	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 \

+ 2 - 2
sys/man/1/tr

@@ -62,9 +62,9 @@ character whose
 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

+ 1 - 1
sys/man/2/bio

@@ -257,7 +257,7 @@ Otherwise, a zero is returned.
 calls
 .I Bputc
 to output the low order
-16 bits of
+21 bits of
 .I c
 as a rune
 in

+ 1 - 1
sys/man/2/rune

@@ -54,7 +54,7 @@ bytes starting at
 and returns the number of bytes copied.
 .BR UTFmax ,
 defined as
-.B 3
+.B 4
 in
 .BR <libc.h> ,
 is the maximum number of bytes required to represent a rune.

+ 1 - 1
sys/man/3/cons

@@ -51,7 +51,7 @@ and a backspace
 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

+ 10 - 8
sys/man/6/utf

@@ -7,7 +7,7 @@ based on the Unicode Standard and on the ISO multibyte
 .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 @@ is shortened to
 .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 @@ a rune x is converted to a multibyte
 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

+ 19 - 14
sys/src/9/port/latin1.c

@@ -1,5 +1,5 @@
-#include <u.h>
-
+#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<i.
@@ -15,23 +15,23 @@ struct cvlist
 };
 
 /*
- * Given 5 characters k[0]..k[4], find the rune or return -1 for failure.
+ * Given n characters k[0]..k[n-1], find the rune or return -1 for failure.
  */
 long
-unicode(Rune *k)
+unicode(Rune *k, int n)
 {
-	long i, c;
+	long c;
+	Rune *r;
 
-	k++;	/* skip 'X' */
 	c = 0;
-	for(i=0; i<4; i++,k++){
+	for(r = &k[1]; r<&k[n]; r++){		/* +1 to skip [Xx] */
 		c <<= 4;
-		if('0'<=*k && *k<='9')
-			c += *k-'0';
-		else if('a'<=*k && *k<='f')
-			c += 10 + *k-'a';
-		else if('A'<=*k && *k<='F')
-			c += 10 + *k-'A';
+		if('0'<=*r && *r<='9')
+			c += *r-'0';
+		else if('a'<=*r && *r<='f')
+			c += 10 + *r-'a';
+		else if('A'<=*r && *r<='F')
+			c += 10 + *r-'A';
 		else
 			return -1;
 	}
@@ -52,9 +52,14 @@ latin1(Rune *k, int n)
 
 	if(k[0] == 'X')
 		if(n>=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)

+ 6 - 4
sys/src/9/port/lib.h

@@ -35,10 +35,12 @@ extern	int	cistrncmp(char*, char*, int);
 
 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) */
 };
 
 /*

+ 74 - 56
sys/src/ape/lib/ap/gen/mbwc.c

@@ -1,4 +1,5 @@
 #include <stdlib.h>
+#include <limits.h>
 
 /*
  * 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 @@ bad:
 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 @@ mbstowcs(wchar_t *pwcs, const char *s, size_t n)
 				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 @@ wcstombs(char *s, const wchar_t *pwcs, size_t n)
 	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 @@ wcstombs(char *s, const wchar_t *pwcs, size_t n)
 		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 @@ wcstombs(char *s, const wchar_t *pwcs, size_t n)
 	}
 	return p-s;
 }
-

+ 74 - 23
sys/src/ape/lib/utf/rune.c

@@ -23,27 +23,33 @@ enum
 	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<<Bitx)-1,			/* 0011 1111 */
 	Testx	= Maskx ^ 0xFF,			/* 1100 0000 */
 
+	SurrogateMin	= 0xD800,
+	SurrogateMax	= 0xDFFF,
+
 	Bad	= Runeerror,
 };
 
 int
 chartorune(Rune *rune, char *str)
 {
-	int c, c1, c2;
+	int c, c1, c2, c3;
 	long l;
 
 	/*
@@ -58,7 +64,7 @@ chartorune(Rune *rune, char *str)
 
 	/*
 	 * two character sequence
-	 *	0080-07FF => T2 Tx
+	 *	00080-007FF => T2 Tx
 	 */
 	c1 = *(uchar*)(str+1) ^ Tx;
 	if(c1 & Testx)
@@ -75,19 +81,41 @@ chartorune(Rune *rune, char *str)
 
 	/*
 	 * 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
 	 */
@@ -120,15 +148,37 @@ runetochar(char *str, Rune *rune)
 		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 @@ runenlen(Rune *r, int nrune)
 		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 @@ int
 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;
 }

+ 2 - 2
sys/src/cmd/cc/lex.c

@@ -1070,7 +1070,7 @@ loop:
 		 */
 		i = 2;
 		if(longflg)
-			i = 4;
+			i = 6;
 		l = 0;
 		for(; i>0; i--) {
 			c = getc();
@@ -1100,7 +1100,7 @@ loop:
 		 */
 		i = 2;
 		if(longflg)
-			i = 5;
+			i = 8;
 		l = c - '0';
 		for(; i>0; i--) {
 			c = getc();

+ 20 - 0
sys/src/cmd/page/pdfprolog.c

@@ -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 {	% <pagedict> pdfshowpage_mysetpage <pagedict>\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"

+ 1 - 1
sys/src/cmd/tcs/plan9.h

@@ -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 (<) */

+ 89 - 85
sys/src/libc/port/rune.c

@@ -1,26 +1,24 @@
 #include	<u.h>
 #include	<libc.h>
 
+#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,
+	Bitx	= Bit(1),
 
-	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 */
+	Tx	= T(1),			/* 1000 0000 */
+	Rune1 = (1<<(Bit(0)+0*Bitx))-1,	/* 0000 0000 0000 0000 0111 1111 */
 
-	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 */
+	Maskx	= (1<<Bitx)-1,		/* 0011 1111 */
+	Testx	= Maskx ^ 0xFF,		/* 1100 0000 */
 
-	Maskx	= (1<<Bitx)-1,			/* 0011 1111 */
-	Testx	= Maskx ^ 0xFF,			/* 1100 0000 */
+	SurrogateMin	= 0xD800,
+	SurrogateMax	= 0xDFFF,
 
 	Bad	= Runeerror,
 };
@@ -28,49 +26,42 @@ enum
 int
 chartorune(Rune *rune, char *str)
 {
-	int c, c1, c2;
-	long l;
+	int c[UTFmax], i;
+	Rune l;
 
 	/*
-	 * one character sequence
+	 * N character sequence
 	 *	00000-0007F => T1
+	 *	00080-007FF => T2 Tx
+	 *	00800-0FFFF => T3 Tx Tx
+	 *	10000-10FFFF => T4 Tx Tx Tx
 	 */
-	c = *(uchar*)str;
-	if(c < Tx) {
-		*rune = c;
-		return 1;
-	}
 
-	/*
-	 * 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)
-			goto bad;
-		*rune = l;
-		return 2;
+	c[0] = *(uchar*)(str);
+	if(c[0] < Tx){
+		*rune = c[0];
+		return 1;
 	}
+	l = c[0];
 
-	/*
-	 * 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)
+	for(i = 1; i < UTFmax; i++) {
+		c[i] = *(uchar*)(str+i);
+		c[i] ^= Tx;
+		if(c[i] & Testx)
 			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 @@ bad:
 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 @@ runetochar(char *str, Rune *rune)
 	}
 
 	/*
+	 * 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
+	 * 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] = T3 |  (c >> 2*Bitx);
-	str[1] = Tx | ((c >> 1*Bitx) & Maskx);
-	str[2] = Tx |  (c & Maskx);
-	return 3;
+	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 @@ runelen(long c)
 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 @@ runenlen(Rune *r, int nrune)
 int
 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;
+	int  i;
+	Rune c;
+
+	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;
 }

+ 551 - 553
sys/src/libc/port/runebase.c

@@ -1252,8 +1252,7 @@ static Rune	_base2[] =
 	0xfa69,	0x97ff,	/* 響 響 */
 	0xfa6a,	0x983b,	/* 頻 頻 */
 	0xfa6b,	0x6075,	/* 恵 恵 */
-#ifdef UNICODE4
-	0xfa6c,	0x242ee,	/* 𤋮 ���� */
+	0xfa6c,	0x242ee,	/* 𤋮 𤋮 */
 	0xfa6d,	0x8218,	/* 舘 舘 */
 	0xfa70,	0x4e26,	/* 並 並 */
 	0xfa71,	0x51b5,	/* 况 况 */
@@ -1350,15 +1349,15 @@ static Rune	_base2[] =
 	0xfacc,	0x983b,	/* 頻 頻 */
 	0xfacd,	0x9b12,	/* 鬒 鬒 */
 	0xface,	0x9f9c,	/* 龜 龜 */
-	0xfacf,	0x2284a,	/* 𢡊 ���� */
-	0xfad0,	0x22844,	/* 𢡄 ���� */
-	0xfad1,	0x233d5,	/* 𣏕 ���� */
+	0xfacf,	0x2284a,	/* 𢡊 𢡊 */
+	0xfad0,	0x22844,	/* 𢡄 𢡄 */
+	0xfad1,	0x233d5,	/* 𣏕 𣏕 */
 	0xfad2,	0x3b9d,	/* 㮝 㮝 */
 	0xfad3,	0x4018,	/* 䀘 䀘 */
 	0xfad4,	0x4039,	/* 䀹 䀹 */
-	0xfad5,	0x25249,	/* 𥉉 ���� */
-	0xfad6,	0x25cd0,	/* 𥳐 ���� */
-	0xfad7,	0x27ed3,	/* 𧻓 ���� */
+	0xfad5,	0x25249,	/* 𥉉 𥉉 */
+	0xfad6,	0x25cd0,	/* 𥳐 𥳐 */
+	0xfad7,	0x27ed3,	/* 𧻓 𧻓 */
 	0xfad8,	0x9f43,	/* 齃 齃 */
 	0xfad9,	0x9f8e,	/* 龎 龎 */
 	0xfb1d,	0x05d9,	/* יִ י */
@@ -1395,551 +1394,550 @@ static Rune	_base2[] =
 	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,	/* ���� 鼻 */
-#endif
+	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

+ 2 - 1177
sys/src/libc/port/runetype.c

@@ -1,1181 +1,6 @@
 #include	<u.h>
 #include	<libc.h>
 
-/*
- * 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"

+ 1641 - 0
sys/src/libc/port/runetypebody-6.2.0.h

@@ -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;
+}
+