utf.c - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       utf.c (54810B)
       ---
            1 /*
            2  * The authors of this software are Rob Pike and Ken Thompson.
            3  *              Copyright (c) 1998-2002 by Lucent Technologies.
            4  * Permission to use, copy, modify, and distribute this software for any
            5  * purpose without fee is hereby granted, provided that this entire notice
            6  * is included in all copies of any software which is or includes a copy
            7  * or modification of this software and in all copies of the supporting
            8  * documentation for such software.
            9  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
           10  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
           11  * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
           12  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
           13  */
           14 #define _BSD_SOURCE 1 /* for memcccpy */
           15 #include <stdarg.h>
           16 #include <string.h>
           17 #include <stdlib.h>
           18 #include "u.h"
           19 #include "utf.h"
           20 #define bsearch utfbsearch
           21 /*
           22  * compiler directive on Plan 9
           23  */
           24 #ifndef USED
           25 #define USED(x) if(x);else
           26 #endif
           27 
           28 /*
           29  * nil cannot be ((void*)0) on ANSI C,
           30  * because it is used for function pointers
           31  */
           32 #undef        nil
           33 #define        nil        0
           34 
           35 #undef        nelem
           36 #define        nelem(x)        (sizeof (x)/sizeof (x)[0])
           37 
           38 
           39 /* ---------- end preamble -------- */
           40 
           41 /* -------------- rune.c --------------- */
           42 /*
           43  * The authors of this software are Rob Pike and Ken Thompson.
           44  *              Copyright (c) 2002 by Lucent Technologies.
           45  * Permission to use, copy, modify, and distribute this software for any
           46  * purpose without fee is hereby granted, provided that this entire notice
           47  * is included in all copies of any software which is or includes a copy
           48  * or modification of this software and in all copies of the supporting
           49  * documentation for such software.
           50  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
           51  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
           52  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
           53  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
           54  */
           55 // #include <stdarg.h>
           56 // #include <string.h>
           57 // #include "plan9.h"
           58 // #include "utf.h"
           59 
           60 enum
           61 {
           62         Bit1        = 7,
           63         Bitx        = 6,
           64         Bit2        = 5,
           65         Bit3        = 4,
           66         Bit4        = 3,
           67 
           68         T1        = ((1<<(Bit1+1))-1) ^ 0xFF,        /* 0000 0000 */
           69         Tx        = ((1<<(Bitx+1))-1) ^ 0xFF,        /* 1000 0000 */
           70         T2        = ((1<<(Bit2+1))-1) ^ 0xFF,        /* 1100 0000 */
           71         T3        = ((1<<(Bit3+1))-1) ^ 0xFF,        /* 1110 0000 */
           72         T4        = ((1<<(Bit4+1))-1) ^ 0xFF,        /* 1111 0000 */
           73 
           74         Rune1        = (1<<(Bit1+0*Bitx))-1,                /* 0000 0000 0111 1111 */
           75         Rune2        = (1<<(Bit2+1*Bitx))-1,                /* 0000 0111 1111 1111 */
           76         Rune3        = (1<<(Bit3+2*Bitx))-1,                /* 1111 1111 1111 1111 */
           77 
           78         Maskx        = (1<<Bitx)-1,                        /* 0011 1111 */
           79         Testx        = Maskx ^ 0xFF,                        /* 1100 0000 */
           80 
           81         Bad        = Runeerror
           82 };
           83 
           84 int
           85 chartorune(Rune *rune, char *str)
           86 {
           87         int c, c1, c2;
           88         long l;
           89 
           90         /*
           91          * one character sequence
           92          *        00000-0007F => T1
           93          */
           94         c = *(uchar*)str;
           95         if(c < Tx) {
           96                 *rune = c;
           97                 return 1;
           98         }
           99 
          100         /*
          101          * two character sequence
          102          *        0080-07FF => T2 Tx
          103          */
          104         c1 = *(uchar*)(str+1) ^ Tx;
          105         if(c1 & Testx)
          106                 goto bad;
          107         if(c < T3) {
          108                 if(c < T2)
          109                         goto bad;
          110                 l = ((c << Bitx) | c1) & Rune2;
          111                 if(l <= Rune1)
          112                         goto bad;
          113                 *rune = l;
          114                 return 2;
          115         }
          116 
          117         /*
          118          * three character sequence
          119          *        0800-FFFF => T3 Tx Tx
          120          */
          121         c2 = *(uchar*)(str+2) ^ Tx;
          122         if(c2 & Testx)
          123                 goto bad;
          124         if(c < T4) {
          125                 l = ((((c << Bitx) | c1) << Bitx) | c2) & Rune3;
          126                 if(l <= Rune2)
          127                         goto bad;
          128                 *rune = l;
          129                 return 3;
          130         }
          131 
          132         /*
          133          * bad decoding
          134          */
          135 bad:
          136         *rune = Bad;
          137         return 1;
          138 }
          139 
          140 int
          141 runetochar(char *str, Rune *rune)
          142 {
          143         long c;
          144 
          145         /*
          146          * one character sequence
          147          *        00000-0007F => 00-7F
          148          */
          149         c = *rune;
          150         if(c <= Rune1) {
          151                 str[0] = c;
          152                 return 1;
          153         }
          154 
          155         /*
          156          * two character sequence
          157          *        0080-07FF => T2 Tx
          158          */
          159         if(c <= Rune2) {
          160                 str[0] = T2 | (c >> 1*Bitx);
          161                 str[1] = Tx | (c & Maskx);
          162                 return 2;
          163         }
          164 
          165         /*
          166          * three character sequence
          167          *        0800-FFFF => T3 Tx Tx
          168          */
          169         str[0] = T3 |  (c >> 2*Bitx);
          170         str[1] = Tx | ((c >> 1*Bitx) & Maskx);
          171         str[2] = Tx |  (c & Maskx);
          172         return 3;
          173 }
          174 
          175 int
          176 runelen(long c)
          177 {
          178         Rune rune;
          179         char str[10];
          180 
          181         rune = c;
          182         return runetochar(str, &rune);
          183 }
          184 
          185 int
          186 runenlen(Rune *r, int nrune)
          187 {
          188         int nb, c;
          189 
          190         nb = 0;
          191         while(nrune--) {
          192                 c = *r++;
          193                 if(c <= Rune1)
          194                         nb++;
          195                 else
          196                 if(c <= Rune2)
          197                         nb += 2;
          198                 else
          199                         nb += 3;
          200         }
          201         return nb;
          202 }
          203 
          204 int
          205 fullrune(char *str, int n)
          206 {
          207         int c;
          208 
          209         if(n > 0) {
          210                 c = *(uchar*)str;
          211                 if(c < Tx)
          212                         return 1;
          213                 if(n > 1)
          214                         if(c < T3 || n > 2)
          215                                 return 1;
          216         }
          217         return 0;
          218 }
          219 /* -------------- runestrcat.c --------------- */
          220 /*
          221  * The authors of this software are Rob Pike and Ken Thompson.
          222  *              Copyright (c) 2002 by Lucent Technologies.
          223  * Permission to use, copy, modify, and distribute this software for any
          224  * purpose without fee is hereby granted, provided that this entire notice
          225  * is included in all copies of any software which is or includes a copy
          226  * or modification of this software and in all copies of the supporting
          227  * documentation for such software.
          228  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
          229  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
          230  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
          231  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
          232  */
          233 // #include <stdarg.h>
          234 // #include <string.h>
          235 // #include "plan9.h"
          236 // #include "utf.h"
          237 
          238 Rune*
          239 runestrcat(Rune *s1, Rune *s2)
          240 {
          241 
          242         runestrcpy(runestrchr(s1, 0), s2);
          243         return s1;
          244 }
          245 /* -------------- runestrchr.c --------------- */
          246 /*
          247  * The authors of this software are Rob Pike and Ken Thompson.
          248  *              Copyright (c) 2002 by Lucent Technologies.
          249  * Permission to use, copy, modify, and distribute this software for any
          250  * purpose without fee is hereby granted, provided that this entire notice
          251  * is included in all copies of any software which is or includes a copy
          252  * or modification of this software and in all copies of the supporting
          253  * documentation for such software.
          254  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
          255  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
          256  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
          257  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
          258  */
          259 // #include <stdarg.h>
          260 // #include <string.h>
          261 // #include "plan9.h"
          262 // #include "utf.h"
          263 
          264 Rune*
          265 runestrchr(Rune *s, Rune c)
          266 {
          267         Rune c0 = c;
          268         Rune c1;
          269 
          270         if(c == 0) {
          271                 while(*s++)
          272                         ;
          273                 return s-1;
          274         }
          275 
          276         while((c1 = *s++))
          277                 if(c1 == c0)
          278                         return s-1;
          279         return 0;
          280 }
          281 /* -------------- runestrcmp.c --------------- */
          282 /*
          283  * The authors of this software are Rob Pike and Ken Thompson.
          284  *              Copyright (c) 2002 by Lucent Technologies.
          285  * Permission to use, copy, modify, and distribute this software for any
          286  * purpose without fee is hereby granted, provided that this entire notice
          287  * is included in all copies of any software which is or includes a copy
          288  * or modification of this software and in all copies of the supporting
          289  * documentation for such software.
          290  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
          291  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
          292  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
          293  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
          294  */
          295 // #include <stdarg.h>
          296 // #include <string.h>
          297 // #include "plan9.h"
          298 // #include "utf.h"
          299 
          300 int
          301 runestrcmp(Rune *s1, Rune *s2)
          302 {
          303         Rune c1, c2;
          304 
          305         for(;;) {
          306                 c1 = *s1++;
          307                 c2 = *s2++;
          308                 if(c1 != c2) {
          309                         if(c1 > c2)
          310                                 return 1;
          311                         return -1;
          312                 }
          313                 if(c1 == 0)
          314                         return 0;
          315         }
          316 }
          317 /* -------------- runestrcpy.c --------------- */
          318 /*
          319  * The authors of this software are Rob Pike and Ken Thompson.
          320  *              Copyright (c) 2002 by Lucent Technologies.
          321  * Permission to use, copy, modify, and distribute this software for any
          322  * purpose without fee is hereby granted, provided that this entire notice
          323  * is included in all copies of any software which is or includes a copy
          324  * or modification of this software and in all copies of the supporting
          325  * documentation for such software.
          326  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
          327  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
          328  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
          329  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
          330  */
          331 // #include <stdarg.h>
          332 // #include <string.h>
          333 // #include "plan9.h"
          334 // #include "utf.h"
          335 
          336 Rune*
          337 runestrcpy(Rune *s1, Rune *s2)
          338 {
          339         Rune *os1;
          340 
          341         os1 = s1;
          342         while((*s1++ = *s2++))
          343                 ;
          344         return os1;
          345 }
          346 /* -------------- runestrdup.c --------------- */
          347 /*
          348  * The authors of this software are Rob Pike and Ken Thompson.
          349  *              Copyright (c) 2002 by Lucent Technologies.
          350  * Permission to use, copy, modify, and distribute this software for any
          351  * purpose without fee is hereby granted, provided that this entire notice
          352  * is included in all copies of any software which is or includes a copy
          353  * or modification of this software and in all copies of the supporting
          354  * documentation for such software.
          355  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
          356  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
          357  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
          358  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
          359  */
          360 // #include <stdarg.h>
          361 // #include <string.h>
          362 // #include <stdlib.h>
          363 // #include "plan9.h"
          364 // #include "utf.h"
          365 
          366 Rune*
          367 runestrdup(Rune *s) 
          368 {  
          369         Rune *ns;
          370 
          371         ns = malloc(sizeof(Rune)*(runestrlen(s) + 1));
          372         if(ns == 0)
          373                 return 0;
          374 
          375         return runestrcpy(ns, s);
          376 }
          377 /* -------------- runestrlen.c --------------- */
          378 /*
          379  * The authors of this software are Rob Pike and Ken Thompson.
          380  *              Copyright (c) 2002 by Lucent Technologies.
          381  * Permission to use, copy, modify, and distribute this software for any
          382  * purpose without fee is hereby granted, provided that this entire notice
          383  * is included in all copies of any software which is or includes a copy
          384  * or modification of this software and in all copies of the supporting
          385  * documentation for such software.
          386  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
          387  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
          388  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
          389  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
          390  */
          391 // #include <stdarg.h>
          392 // #include <string.h>
          393 // #include "plan9.h"
          394 // #include "utf.h"
          395 
          396 long
          397 runestrlen(Rune *s)
          398 {
          399 
          400         return runestrchr(s, 0) - s;
          401 }
          402 /* -------------- runestrecpy.c --------------- */
          403 /*
          404  * The authors of this software are Rob Pike and Ken Thompson.
          405  *              Copyright (c) 2002 by Lucent Technologies.
          406  * Permission to use, copy, modify, and distribute this software for any
          407  * purpose without fee is hereby granted, provided that this entire notice
          408  * is included in all copies of any software which is or includes a copy
          409  * or modification of this software and in all copies of the supporting
          410  * documentation for such software.
          411  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
          412  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
          413  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
          414  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
          415  */
          416 // #include <stdarg.h>
          417 // #include <string.h>
          418 // #include "plan9.h"
          419 // #include "utf.h"
          420 
          421 Rune*
          422 runestrecpy(Rune *s1, Rune *es1, Rune *s2)
          423 {
          424         if(s1 >= es1)
          425                 return s1;
          426 
          427         while((*s1++ = *s2++)){
          428                 if(s1 == es1){
          429                         *--s1 = '\0';
          430                         break;
          431                 }
          432         }
          433         return s1;
          434 }
          435 /* -------------- runestrncat.c --------------- */
          436 /*
          437  * The authors of this software are Rob Pike and Ken Thompson.
          438  *              Copyright (c) 2002 by Lucent Technologies.
          439  * Permission to use, copy, modify, and distribute this software for any
          440  * purpose without fee is hereby granted, provided that this entire notice
          441  * is included in all copies of any software which is or includes a copy
          442  * or modification of this software and in all copies of the supporting
          443  * documentation for such software.
          444  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
          445  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
          446  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
          447  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
          448  */
          449 // #include <stdarg.h>
          450 // #include <string.h>
          451 // #include "plan9.h"
          452 // #include "utf.h"
          453 
          454 Rune*
          455 runestrncat(Rune *s1, Rune *s2, long n)
          456 {
          457         Rune *os1;
          458 
          459         os1 = s1;
          460         s1 = runestrchr(s1, 0);
          461         while((*s1++ = *s2++))
          462                 if(--n < 0) {
          463                         s1[-1] = 0;
          464                         break;
          465                 }
          466         return os1;
          467 }
          468 /* -------------- runestrncmp.c --------------- */
          469 /*
          470  * The authors of this software are Rob Pike and Ken Thompson.
          471  *              Copyright (c) 2002 by Lucent Technologies.
          472  * Permission to use, copy, modify, and distribute this software for any
          473  * purpose without fee is hereby granted, provided that this entire notice
          474  * is included in all copies of any software which is or includes a copy
          475  * or modification of this software and in all copies of the supporting
          476  * documentation for such software.
          477  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
          478  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
          479  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
          480  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
          481  */
          482 // #include <stdarg.h>
          483 // #include <string.h>
          484 // #include "plan9.h"
          485 // #include "utf.h"
          486 
          487 int
          488 runestrncmp(Rune *s1, Rune *s2, long n)
          489 {
          490         Rune c1, c2;
          491 
          492         while(n > 0) {
          493                 c1 = *s1++;
          494                 c2 = *s2++;
          495                 n--;
          496                 if(c1 != c2) {
          497                         if(c1 > c2)
          498                                 return 1;
          499                         return -1;
          500                 }
          501                 if(c1 == 0)
          502                         break;
          503         }
          504         return 0;
          505 }
          506 /* -------------- runestrncpy.c --------------- */
          507 /*
          508  * The authors of this software are Rob Pike and Ken Thompson.
          509  *              Copyright (c) 2002 by Lucent Technologies.
          510  * Permission to use, copy, modify, and distribute this software for any
          511  * purpose without fee is hereby granted, provided that this entire notice
          512  * is included in all copies of any software which is or includes a copy
          513  * or modification of this software and in all copies of the supporting
          514  * documentation for such software.
          515  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
          516  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
          517  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
          518  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
          519  */
          520 // #include <stdarg.h>
          521 // #include <string.h>
          522 // #include "plan9.h"
          523 // #include "utf.h"
          524 
          525 Rune*
          526 runestrncpy(Rune *s1, Rune *s2, long n)
          527 {
          528         int i;
          529         Rune *os1;
          530 
          531         os1 = s1;
          532         for(i = 0; i < n; i++)
          533                 if((*s1++ = *s2++) == 0) {
          534                         while(++i < n)
          535                                 *s1++ = 0;
          536                         return os1;
          537                 }
          538         return os1;
          539 }
          540 /* -------------- runestrrchr.c --------------- */
          541 /*
          542  * The authors of this software are Rob Pike and Ken Thompson.
          543  *              Copyright (c) 2002 by Lucent Technologies.
          544  * Permission to use, copy, modify, and distribute this software for any
          545  * purpose without fee is hereby granted, provided that this entire notice
          546  * is included in all copies of any software which is or includes a copy
          547  * or modification of this software and in all copies of the supporting
          548  * documentation for such software.
          549  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
          550  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
          551  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
          552  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
          553  */
          554 // #include <stdarg.h>
          555 // #include <string.h>
          556 // #include "plan9.h"
          557 // #include "utf.h"
          558 
          559 Rune*
          560 runestrrchr(Rune *s, Rune c)
          561 {
          562         Rune *r;
          563 
          564         if(c == 0)
          565                 return runestrchr(s, 0);
          566         r = 0;
          567         while((s = runestrchr(s, c)))
          568                 r = s++;
          569         return r;
          570 }
          571 /* -------------- runestrstr.c --------------- */
          572 /*
          573  * The authors of this software are Rob Pike and Ken Thompson.
          574  *              Copyright (c) 2002 by Lucent Technologies.
          575  * Permission to use, copy, modify, and distribute this software for any
          576  * purpose without fee is hereby granted, provided that this entire notice
          577  * is included in all copies of any software which is or includes a copy
          578  * or modification of this software and in all copies of the supporting
          579  * documentation for such software.
          580  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
          581  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
          582  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
          583  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
          584  */
          585 // #include <stdarg.h>
          586 // #include <string.h>
          587 // #include "plan9.h"
          588 // #include "utf.h"
          589 
          590 /*
          591  * Return pointer to first occurrence of s2 in s1,
          592  * 0 if none
          593  */
          594 Rune*
          595 runestrstr(Rune *s1, Rune *s2)
          596 {
          597         Rune *p, *pa, *pb;
          598         int c0, c;
          599 
          600         c0 = *s2;
          601         if(c0 == 0)
          602                 return s1;
          603         s2++;
          604         for(p=runestrchr(s1, c0); p; p=runestrchr(p+1, c0)) {
          605                 pa = p;
          606                 for(pb=s2;; pb++) {
          607                         c = *pb;
          608                         if(c == 0)
          609                                 return p;
          610                         if(c != *++pa)
          611                                 break;
          612                 }
          613         }
          614         return 0;
          615 }
          616 /* -------------- runetype.c --------------- */
          617 /*
          618  * The authors of this software are Rob Pike and Ken Thompson.
          619  *              Copyright (c) 2002 by Lucent Technologies.
          620  * Permission to use, copy, modify, and distribute this software for any
          621  * purpose without fee is hereby granted, provided that this entire notice
          622  * is included in all copies of any software which is or includes a copy
          623  * or modification of this software and in all copies of the supporting
          624  * documentation for such software.
          625  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
          626  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
          627  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
          628  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
          629  */
          630 // #include <stdarg.h>
          631 // #include <string.h>
          632 // #include "plan9.h"
          633 // #include "utf.h"
          634 
          635 /*
          636  * alpha ranges -
          637  *        only covers ranges not in lower||upper
          638  */
          639 static
          640 Rune        __alpha2[] =
          641 {
          642         0x00d8,        0x00f6,        /* Ø - ö */
          643         0x00f8,        0x01f5,        /* ø - ǵ */
          644         0x0250,        0x02a8,        /* ɐ - ʨ */
          645         0x038e,        0x03a1,        /* Ύ - Ρ */
          646         0x03a3,        0x03ce,        /* Σ - ώ */
          647         0x03d0,        0x03d6,        /* ϐ - ϖ */
          648         0x03e2,        0x03f3,        /* Ϣ - ϳ */
          649         0x0490,        0x04c4,        /* Ґ - ӄ */
          650         0x0561,        0x0587,        /* ա - և */
          651         0x05d0,        0x05ea,        /* א - ת */
          652         0x05f0,        0x05f2,        /* װ - ײ */
          653         0x0621,        0x063a,        /* ء - غ */
          654         0x0640,        0x064a,        /* ـ - ي */
          655         0x0671,        0x06b7,        /* ٱ - ڷ */
          656         0x06ba,        0x06be,        /* ں - ھ */
          657         0x06c0,        0x06ce,        /* ۀ - ێ */
          658         0x06d0,        0x06d3,        /* ې - ۓ */
          659         0x0905,        0x0939,        /* अ - ह */
          660         0x0958,        0x0961,        /* क़ - ॡ */
          661         0x0985,        0x098c,        /* অ - ঌ */
          662         0x098f,        0x0990,        /* এ - ঐ */
          663         0x0993,        0x09a8,        /* ও - ন */
          664         0x09aa,        0x09b0,        /* প - র */
          665         0x09b6,        0x09b9,        /* শ - হ */
          666         0x09dc,        0x09dd,        /* ড় - ঢ় */
          667         0x09df,        0x09e1,        /* য় - ৡ */
          668         0x09f0,        0x09f1,        /* ৰ - ৱ */
          669         0x0a05,        0x0a0a,        /* ਅ - ਊ */
          670         0x0a0f,        0x0a10,        /* ਏ - ਐ */
          671         0x0a13,        0x0a28,        /* ਓ - ਨ */
          672         0x0a2a,        0x0a30,        /* ਪ - ਰ */
          673         0x0a32,        0x0a33,        /* ਲ - ਲ਼ */
          674         0x0a35,        0x0a36,        /* ਵ - ਸ਼ */
          675         0x0a38,        0x0a39,        /* ਸ - ਹ */
          676         0x0a59,        0x0a5c,        /* ਖ਼ - ੜ */
          677         0x0a85,        0x0a8b,        /* અ - ઋ */
          678         0x0a8f,        0x0a91,        /* એ - ઑ */
          679         0x0a93,        0x0aa8,        /* ઓ - ન */
          680         0x0aaa,        0x0ab0,        /* પ - ર */
          681         0x0ab2,        0x0ab3,        /* લ - ળ */
          682         0x0ab5,        0x0ab9,        /* વ - હ */
          683         0x0b05,        0x0b0c,        /* ଅ - ଌ */
          684         0x0b0f,        0x0b10,        /* ଏ - ଐ */
          685         0x0b13,        0x0b28,        /* ଓ - ନ */
          686         0x0b2a,        0x0b30,        /* ପ - ର */
          687         0x0b32,        0x0b33,        /* ଲ - ଳ */
          688         0x0b36,        0x0b39,        /* ଶ - ହ */
          689         0x0b5c,        0x0b5d,        /* ଡ଼ - ଢ଼ */
          690         0x0b5f,        0x0b61,        /* ୟ - ୡ */
          691         0x0b85,        0x0b8a,        /* அ - ஊ */
          692         0x0b8e,        0x0b90,        /* எ - ஐ */
          693         0x0b92,        0x0b95,        /* ஒ - க */
          694         0x0b99,        0x0b9a,        /* ங - ச */
          695         0x0b9e,        0x0b9f,        /* ஞ - ட */
          696         0x0ba3,        0x0ba4,        /* ண - த */
          697         0x0ba8,        0x0baa,        /* ந - ப */
          698         0x0bae,        0x0bb5,        /* ம - வ */
          699         0x0bb7,        0x0bb9,        /* ஷ - ஹ */
          700         0x0c05,        0x0c0c,        /* అ - ఌ */
          701         0x0c0e,        0x0c10,        /* ఎ - ఐ */
          702         0x0c12,        0x0c28,        /* ఒ - న */
          703         0x0c2a,        0x0c33,        /* ప - ళ */
          704         0x0c35,        0x0c39,        /* వ - హ */
          705         0x0c60,        0x0c61,        /* ౠ - ౡ */
          706         0x0c85,        0x0c8c,        /* ಅ - ಌ */
          707         0x0c8e,        0x0c90,        /* ಎ - ಐ */
          708         0x0c92,        0x0ca8,        /* ಒ - ನ */
          709         0x0caa,        0x0cb3,        /* ಪ - ಳ */
          710         0x0cb5,        0x0cb9,        /* ವ - ಹ */
          711         0x0ce0,        0x0ce1,        /* ೠ - ೡ */
          712         0x0d05,        0x0d0c,        /* അ - ഌ */
          713         0x0d0e,        0x0d10,        /* എ - ഐ */
          714         0x0d12,        0x0d28,        /* ഒ - ന */
          715         0x0d2a,        0x0d39,        /* പ - ഹ */
          716         0x0d60,        0x0d61,        /* ൠ - ൡ */
          717         0x0e01,        0x0e30,        /* ก - ะ */
          718         0x0e32,        0x0e33,        /* า - ำ */
          719         0x0e40,        0x0e46,        /* เ - ๆ */
          720         0x0e5a,        0x0e5b,        /* ๚ - ๛ */
          721         0x0e81,        0x0e82,        /* ກ - ຂ */
          722         0x0e87,        0x0e88,        /* ງ - ຈ */
          723         0x0e94,        0x0e97,        /* ດ - ທ */
          724         0x0e99,        0x0e9f,        /* ນ - ຟ */
          725         0x0ea1,        0x0ea3,        /* ມ - ຣ */
          726         0x0eaa,        0x0eab,        /* ສ - ຫ */
          727         0x0ead,        0x0eae,        /* ອ - ຮ */
          728         0x0eb2,        0x0eb3,        /* າ - ຳ */
          729         0x0ec0,        0x0ec4,        /* ເ - ໄ */
          730         0x0edc,        0x0edd,        /* ໜ - ໝ */
          731         0x0f18,        0x0f19,        /* ༘ - ༙ */
          732         0x0f40,        0x0f47,        /* ཀ - ཇ */
          733         0x0f49,        0x0f69,        /* ཉ - ཀྵ */
          734         0x10d0,        0x10f6,        /* ა - ჶ */
          735         0x1100,        0x1159,        /* ᄀ - ᅙ */
          736         0x115f,        0x11a2,        /* ᅟ - ᆢ */
          737         0x11a8,        0x11f9,        /* ᆨ - ᇹ */
          738         0x1e00,        0x1e9b,        /* Ḁ - ẛ */
          739         0x1f50,        0x1f57,        /* ὐ - ὗ */
          740         0x1f80,        0x1fb4,        /* ᾀ - ᾴ */
          741         0x1fb6,        0x1fbc,        /* ᾶ - ᾼ */
          742         0x1fc2,        0x1fc4,        /* ῂ - ῄ */
          743         0x1fc6,        0x1fcc,        /* ῆ - ῌ */
          744         0x1fd0,        0x1fd3,        /* ῐ - ΐ */
          745         0x1fd6,        0x1fdb,        /* ῖ - Ί */
          746         0x1fe0,        0x1fec,        /* ῠ - Ῥ */
          747         0x1ff2,        0x1ff4,        /* ῲ - ῴ */
          748         0x1ff6,        0x1ffc,        /* ῶ - ῼ */
          749         0x210a,        0x2113,        /* ℊ - ℓ */
          750         0x2115,        0x211d,        /* ℕ - ℝ */
          751         0x2120,        0x2122,        /* ℠ - ™ */
          752         0x212a,        0x2131,        /* K - ℱ */
          753         0x2133,        0x2138,        /* ℳ - ℸ */
          754         0x3041,        0x3094,        /* ぁ - ゔ */
          755         0x30a1,        0x30fa,        /* ァ - ヺ */
          756         0x3105,        0x312c,        /* ㄅ - ㄬ */
          757         0x3131,        0x318e,        /* ㄱ - ㆎ */
          758         0x3192,        0x319f,        /* ㆒ - ㆟ */
          759         0x3260,        0x327b,        /* ㉠ - ㉻ */
          760         0x328a,        0x32b0,        /* ㊊ - ㊰ */
          761         0x32d0,        0x32fe,        /* ㋐ - ㋾ */
          762         0x3300,        0x3357,        /* ㌀ - ㍗ */
          763         0x3371,        0x3376,        /* ㍱ - ㍶ */
          764         0x337b,        0x3394,        /* ㍻ - ㎔ */
          765         0x3399,        0x339e,        /* ㎙ - ㎞ */
          766         0x33a9,        0x33ad,        /* ㎩ - ㎭ */
          767         0x33b0,        0x33c1,        /* ㎰ - ㏁ */
          768         0x33c3,        0x33c5,        /* ㏃ - ㏅ */
          769         0x33c7,        0x33d7,        /* ㏇ - ㏗ */
          770         0x33d9,        0x33dd,        /* ㏙ - ㏝ */
          771         0x4e00,        0x9fff,        /* 一 - 鿿 */
          772         0xac00,        0xd7a3,        /* 가 - 힣 */
          773         0xf900,        0xfb06,        /* 豈 - st */
          774         0xfb13,        0xfb17,        /* ﬓ - ﬗ */
          775         0xfb1f,        0xfb28,        /* ײַ - ﬨ */
          776         0xfb2a,        0xfb36,        /* שׁ - זּ */
          777         0xfb38,        0xfb3c,        /* טּ - לּ */
          778         0xfb40,        0xfb41,        /* נּ - סּ */
          779         0xfb43,        0xfb44,        /* ףּ - פּ */
          780         0xfb46,        0xfbb1,        /* צּ - ﮱ */
          781         0xfbd3,        0xfd3d,        /* ﯓ - ﴽ */
          782         0xfd50,        0xfd8f,        /* ﵐ - ﶏ */
          783         0xfd92,        0xfdc7,        /* ﶒ - ﷇ */
          784         0xfdf0,        0xfdf9,        /* ﷰ - ﷹ */
          785         0xfe70,        0xfe72,        /* ﹰ - ﹲ */
          786         0xfe76,        0xfefc,        /* ﹶ - ﻼ */
          787         0xff66,        0xff6f,        /* ヲ - ッ */
          788         0xff71,        0xff9d,        /* ア - ン */
          789         0xffa0,        0xffbe,        /* ᅠ - ᄒ */
          790         0xffc2,        0xffc7,        /* ᅡ - ᅦ */
          791         0xffca,        0xffcf,        /* ᅧ - ᅬ */
          792         0xffd2,        0xffd7,        /* ᅭ - ᅲ */
          793         0xffda,        0xffdc,        /* ᅳ - ᅵ */
          794 };
          795 
          796 /*
          797  * alpha singlets -
          798  *        only covers ranges not in lower||upper
          799  */
          800 static
          801 Rune        __alpha1[] =
          802 {
          803         0x00aa,        /* ª */
          804         0x00b5,        /* µ */
          805         0x00ba,        /* º */
          806         0x03da,        /* Ϛ */
          807         0x03dc,        /* Ϝ */
          808         0x03de,        /* Ϟ */
          809         0x03e0,        /* Ϡ */
          810         0x06d5,        /* ە */
          811         0x09b2,        /* ল */
          812         0x0a5e,        /* ਫ਼ */
          813         0x0a8d,        /* ઍ */
          814         0x0ae0,        /* ૠ */
          815         0x0b9c,        /* ஜ */
          816         0x0cde,        /* ೞ */
          817         0x0e4f,        /* ๏ */
          818         0x0e84,        /* ຄ */
          819         0x0e8a,        /* ຊ */
          820         0x0e8d,        /* ຍ */
          821         0x0ea5,        /* ລ */
          822         0x0ea7,        /* ວ */
          823         0x0eb0,        /* ະ */
          824         0x0ebd,        /* ຽ */
          825         0x1fbe,        /* ι */
          826         0x207f,        /* ⁿ */
          827         0x20a8,        /* ₨ */
          828         0x2102,        /* ℂ */
          829         0x2107,        /* ℇ */
          830         0x2124,        /* ℤ */
          831         0x2126,        /* Ω */
          832         0x2128,        /* ℨ */
          833         0xfb3e,        /* מּ */
          834         0xfe74,        /* ﹴ */
          835 };
          836 
          837 /*
          838  * space ranges
          839  */
          840 static
          841 Rune        __space2[] =
          842 {
          843         0x0009,        0x000a,        /* tab and newline */
          844         0x0020,        0x0020,        /* space */
          845         0x00a0,        0x00a0,        /*   */
          846         0x2000,        0x200b,        /*   - ​ */
          847         0x2028,        0x2029,        /* 
 - 
 */
          848         0x3000,        0x3000,        /*   */
          849         0xfeff,        0xfeff,        /*  */
          850 };
          851 
          852 /*
          853  * lower case ranges
          854  *        3rd col is conversion excess 500
          855  */
          856 static
          857 Rune        __toupper2[] =
          858 {
          859         0x0061,        0x007a, 468,        /* a-z A-Z */
          860         0x00e0,        0x00f6, 468,        /* à-ö À-Ö */
          861         0x00f8,        0x00fe, 468,        /* ø-þ Ø-Þ */
          862         0x0256,        0x0257, 295,        /* ɖ-ɗ Ɖ-Ɗ */
          863         0x0258,        0x0259, 298,        /* ɘ-ə Ǝ-Ə */
          864         0x028a,        0x028b, 283,        /* ʊ-ʋ Ʊ-Ʋ */
          865         0x03ad,        0x03af, 463,        /* έ-ί Έ-Ί */
          866         0x03b1,        0x03c1, 468,        /* α-ρ Α-Ρ */
          867         0x03c3,        0x03cb, 468,        /* σ-ϋ Σ-Ϋ */
          868         0x03cd,        0x03ce, 437,        /* ύ-ώ Ύ-Ώ */
          869         0x0430,        0x044f, 468,        /* а-я А-Я */
          870         0x0451,        0x045c, 420,        /* ё-ќ Ё-Ќ */
          871         0x045e,        0x045f, 420,        /* ў-џ Ў-Џ */
          872         0x0561,        0x0586, 452,        /* ա-ֆ Ա-Ֆ */
          873         0x1f00,        0x1f07, 508,        /* ἀ-ἇ Ἀ-Ἇ */
          874         0x1f10,        0x1f15, 508,        /* ἐ-ἕ Ἐ-Ἕ */
          875         0x1f20,        0x1f27, 508,        /* ἠ-ἧ Ἠ-Ἧ */
          876         0x1f30,        0x1f37, 508,        /* ἰ-ἷ Ἰ-Ἷ */
          877         0x1f40,        0x1f45, 508,        /* ὀ-ὅ Ὀ-Ὅ */
          878         0x1f60,        0x1f67, 508,        /* ὠ-ὧ Ὠ-Ὧ */
          879         0x1f70,        0x1f71, 574,        /* ὰ-ά Ὰ-Ά */
          880         0x1f72,        0x1f75, 586,        /* ὲ-ή Ὲ-Ή */
          881         0x1f76,        0x1f77, 600,        /* ὶ-ί Ὶ-Ί */
          882         0x1f78,        0x1f79, 628,        /* ὸ-ό Ὸ-Ό */
          883         0x1f7a,        0x1f7b, 612,        /* ὺ-ύ Ὺ-Ύ */
          884         0x1f7c,        0x1f7d, 626,        /* ὼ-ώ Ὼ-Ώ */
          885         0x1f80,        0x1f87, 508,        /* ᾀ-ᾇ ᾈ-ᾏ */
          886         0x1f90,        0x1f97, 508,        /* ᾐ-ᾗ ᾘ-ᾟ */
          887         0x1fa0,        0x1fa7, 508,        /* ᾠ-ᾧ ᾨ-ᾯ */
          888         0x1fb0,        0x1fb1, 508,        /* ᾰ-ᾱ Ᾰ-Ᾱ */
          889         0x1fd0,        0x1fd1, 508,        /* ῐ-ῑ Ῐ-Ῑ */
          890         0x1fe0,        0x1fe1, 508,        /* ῠ-ῡ Ῠ-Ῡ */
          891         0x2170,        0x217f, 484,        /* ⅰ-ⅿ Ⅰ-Ⅿ */
          892         0x24d0,        0x24e9, 474,        /* ⓐ-ⓩ Ⓐ-Ⓩ */
          893         0xff41,        0xff5a, 468,        /* a-z A-Z */
          894 };
          895 
          896 /*
          897  * lower case singlets
          898  *        2nd col is conversion excess 500
          899  */
          900 static
          901 Rune        __toupper1[] =
          902 {
          903         0x00ff, 621,        /* ÿ Ÿ */
          904         0x0101, 499,        /* ā Ā */
          905         0x0103, 499,        /* ă Ă */
          906         0x0105, 499,        /* ą Ą */
          907         0x0107, 499,        /* ć Ć */
          908         0x0109, 499,        /* ĉ Ĉ */
          909         0x010b, 499,        /* ċ Ċ */
          910         0x010d, 499,        /* č Č */
          911         0x010f, 499,        /* ď Ď */
          912         0x0111, 499,        /* đ Đ */
          913         0x0113, 499,        /* ē Ē */
          914         0x0115, 499,        /* ĕ Ĕ */
          915         0x0117, 499,        /* ė Ė */
          916         0x0119, 499,        /* ę Ę */
          917         0x011b, 499,        /* ě Ě */
          918         0x011d, 499,        /* ĝ Ĝ */
          919         0x011f, 499,        /* ğ Ğ */
          920         0x0121, 499,        /* ġ Ġ */
          921         0x0123, 499,        /* ģ Ģ */
          922         0x0125, 499,        /* ĥ Ĥ */
          923         0x0127, 499,        /* ħ Ħ */
          924         0x0129, 499,        /* ĩ Ĩ */
          925         0x012b, 499,        /* ī Ī */
          926         0x012d, 499,        /* ĭ Ĭ */
          927         0x012f, 499,        /* į Į */
          928         0x0131, 268,        /* ı I */
          929         0x0133, 499,        /* ij IJ */
          930         0x0135, 499,        /* ĵ Ĵ */
          931         0x0137, 499,        /* ķ Ķ */
          932         0x013a, 499,        /* ĺ Ĺ */
          933         0x013c, 499,        /* ļ Ļ */
          934         0x013e, 499,        /* ľ Ľ */
          935         0x0140, 499,        /* ŀ Ŀ */
          936         0x0142, 499,        /* ł Ł */
          937         0x0144, 499,        /* ń Ń */
          938         0x0146, 499,        /* ņ Ņ */
          939         0x0148, 499,        /* ň Ň */
          940         0x014b, 499,        /* ŋ Ŋ */
          941         0x014d, 499,        /* ō Ō */
          942         0x014f, 499,        /* ŏ Ŏ */
          943         0x0151, 499,        /* ő Ő */
          944         0x0153, 499,        /* œ Œ */
          945         0x0155, 499,        /* ŕ Ŕ */
          946         0x0157, 499,        /* ŗ Ŗ */
          947         0x0159, 499,        /* ř Ř */
          948         0x015b, 499,        /* ś Ś */
          949         0x015d, 499,        /* ŝ Ŝ */
          950         0x015f, 499,        /* ş Ş */
          951         0x0161, 499,        /* š Š */
          952         0x0163, 499,        /* ţ Ţ */
          953         0x0165, 499,        /* ť Ť */
          954         0x0167, 499,        /* ŧ Ŧ */
          955         0x0169, 499,        /* ũ Ũ */
          956         0x016b, 499,        /* ū Ū */
          957         0x016d, 499,        /* ŭ Ŭ */
          958         0x016f, 499,        /* ů Ů */
          959         0x0171, 499,        /* ű Ű */
          960         0x0173, 499,        /* ų Ų */
          961         0x0175, 499,        /* ŵ Ŵ */
          962         0x0177, 499,        /* ŷ Ŷ */
          963         0x017a, 499,        /* ź Ź */
          964         0x017c, 499,        /* ż Ż */
          965         0x017e, 499,        /* ž Ž */
          966         0x017f, 200,        /* ſ S */
          967         0x0183, 499,        /* ƃ Ƃ */
          968         0x0185, 499,        /* ƅ Ƅ */
          969         0x0188, 499,        /* ƈ Ƈ */
          970         0x018c, 499,        /* ƌ Ƌ */
          971         0x0192, 499,        /* ƒ Ƒ */
          972         0x0199, 499,        /* ƙ Ƙ */
          973         0x01a1, 499,        /* ơ Ơ */
          974         0x01a3, 499,        /* ƣ Ƣ */
          975         0x01a5, 499,        /* ƥ Ƥ */
          976         0x01a8, 499,        /* ƨ Ƨ */
          977         0x01ad, 499,        /* ƭ Ƭ */
          978         0x01b0, 499,        /* ư Ư */
          979         0x01b4, 499,        /* ƴ Ƴ */
          980         0x01b6, 499,        /* ƶ Ƶ */
          981         0x01b9, 499,        /* ƹ Ƹ */
          982         0x01bd, 499,        /* ƽ Ƽ */
          983         0x01c5, 499,        /* Dž DŽ */
          984         0x01c6, 498,        /* dž DŽ */
          985         0x01c8, 499,        /* Lj LJ */
          986         0x01c9, 498,        /* lj LJ */
          987         0x01cb, 499,        /* Nj NJ */
          988         0x01cc, 498,        /* nj NJ */
          989         0x01ce, 499,        /* ǎ Ǎ */
          990         0x01d0, 499,        /* ǐ Ǐ */
          991         0x01d2, 499,        /* ǒ Ǒ */
          992         0x01d4, 499,        /* ǔ Ǔ */
          993         0x01d6, 499,        /* ǖ Ǖ */
          994         0x01d8, 499,        /* ǘ Ǘ */
          995         0x01da, 499,        /* ǚ Ǚ */
          996         0x01dc, 499,        /* ǜ Ǜ */
          997         0x01df, 499,        /* ǟ Ǟ */
          998         0x01e1, 499,        /* ǡ Ǡ */
          999         0x01e3, 499,        /* ǣ Ǣ */
         1000         0x01e5, 499,        /* ǥ Ǥ */
         1001         0x01e7, 499,        /* ǧ Ǧ */
         1002         0x01e9, 499,        /* ǩ Ǩ */
         1003         0x01eb, 499,        /* ǫ Ǫ */
         1004         0x01ed, 499,        /* ǭ Ǭ */
         1005         0x01ef, 499,        /* ǯ Ǯ */
         1006         0x01f2, 499,        /* Dz DZ */
         1007         0x01f3, 498,        /* dz DZ */
         1008         0x01f5, 499,        /* ǵ Ǵ */
         1009         0x01fb, 499,        /* ǻ Ǻ */
         1010         0x01fd, 499,        /* ǽ Ǽ */
         1011         0x01ff, 499,        /* ǿ Ǿ */
         1012         0x0201, 499,        /* ȁ Ȁ */
         1013         0x0203, 499,        /* ȃ Ȃ */
         1014         0x0205, 499,        /* ȅ Ȅ */
         1015         0x0207, 499,        /* ȇ Ȇ */
         1016         0x0209, 499,        /* ȉ Ȉ */
         1017         0x020b, 499,        /* ȋ Ȋ */
         1018         0x020d, 499,        /* ȍ Ȍ */
         1019         0x020f, 499,        /* ȏ Ȏ */
         1020         0x0211, 499,        /* ȑ Ȑ */
         1021         0x0213, 499,        /* ȓ Ȓ */
         1022         0x0215, 499,        /* ȕ Ȕ */
         1023         0x0217, 499,        /* ȗ Ȗ */
         1024         0x0253, 290,        /* ɓ Ɓ */
         1025         0x0254, 294,        /* ɔ Ɔ */
         1026         0x025b, 297,        /* ɛ Ɛ */
         1027         0x0260, 295,        /* ɠ Ɠ */
         1028         0x0263, 293,        /* ɣ Ɣ */
         1029         0x0268, 291,        /* ɨ Ɨ */
         1030         0x0269, 289,        /* ɩ Ɩ */
         1031         0x026f, 289,        /* ɯ Ɯ */
         1032         0x0272, 287,        /* ɲ Ɲ */
         1033         0x0283, 282,        /* ʃ Ʃ */
         1034         0x0288, 282,        /* ʈ Ʈ */
         1035         0x0292, 281,        /* ʒ Ʒ */
         1036         0x03ac, 462,        /* ά Ά */
         1037         0x03cc, 436,        /* ό Ό */
         1038         0x03d0, 438,        /* ϐ Β */
         1039         0x03d1, 443,        /* ϑ Θ */
         1040         0x03d5, 453,        /* ϕ Φ */
         1041         0x03d6, 446,        /* ϖ Π */
         1042         0x03e3, 499,        /* ϣ Ϣ */
         1043         0x03e5, 499,        /* ϥ Ϥ */
         1044         0x03e7, 499,        /* ϧ Ϧ */
         1045         0x03e9, 499,        /* ϩ Ϩ */
         1046         0x03eb, 499,        /* ϫ Ϫ */
         1047         0x03ed, 499,        /* ϭ Ϭ */
         1048         0x03ef, 499,        /* ϯ Ϯ */
         1049         0x03f0, 414,        /* ϰ Κ */
         1050         0x03f1, 420,        /* ϱ Ρ */
         1051         0x0461, 499,        /* ѡ Ѡ */
         1052         0x0463, 499,        /* ѣ Ѣ */
         1053         0x0465, 499,        /* ѥ Ѥ */
         1054         0x0467, 499,        /* ѧ Ѧ */
         1055         0x0469, 499,        /* ѩ Ѩ */
         1056         0x046b, 499,        /* ѫ Ѫ */
         1057         0x046d, 499,        /* ѭ Ѭ */
         1058         0x046f, 499,        /* ѯ Ѯ */
         1059         0x0471, 499,        /* ѱ Ѱ */
         1060         0x0473, 499,        /* ѳ Ѳ */
         1061         0x0475, 499,        /* ѵ Ѵ */
         1062         0x0477, 499,        /* ѷ Ѷ */
         1063         0x0479, 499,        /* ѹ Ѹ */
         1064         0x047b, 499,        /* ѻ Ѻ */
         1065         0x047d, 499,        /* ѽ Ѽ */
         1066         0x047f, 499,        /* ѿ Ѿ */
         1067         0x0481, 499,        /* ҁ Ҁ */
         1068         0x0491, 499,        /* ґ Ґ */
         1069         0x0493, 499,        /* ғ Ғ */
         1070         0x0495, 499,        /* ҕ Ҕ */
         1071         0x0497, 499,        /* җ Җ */
         1072         0x0499, 499,        /* ҙ Ҙ */
         1073         0x049b, 499,        /* қ Қ */
         1074         0x049d, 499,        /* ҝ Ҝ */
         1075         0x049f, 499,        /* ҟ Ҟ */
         1076         0x04a1, 499,        /* ҡ Ҡ */
         1077         0x04a3, 499,        /* ң Ң */
         1078         0x04a5, 499,        /* ҥ Ҥ */
         1079         0x04a7, 499,        /* ҧ Ҧ */
         1080         0x04a9, 499,        /* ҩ Ҩ */
         1081         0x04ab, 499,        /* ҫ Ҫ */
         1082         0x04ad, 499,        /* ҭ Ҭ */
         1083         0x04af, 499,        /* ү Ү */
         1084         0x04b1, 499,        /* ұ Ұ */
         1085         0x04b3, 499,        /* ҳ Ҳ */
         1086         0x04b5, 499,        /* ҵ Ҵ */
         1087         0x04b7, 499,        /* ҷ Ҷ */
         1088         0x04b9, 499,        /* ҹ Ҹ */
         1089         0x04bb, 499,        /* һ Һ */
         1090         0x04bd, 499,        /* ҽ Ҽ */
         1091         0x04bf, 499,        /* ҿ Ҿ */
         1092         0x04c2, 499,        /* ӂ Ӂ */
         1093         0x04c4, 499,        /* ӄ Ӄ */
         1094         0x04c8, 499,        /* ӈ Ӈ */
         1095         0x04cc, 499,        /* ӌ Ӌ */
         1096         0x04d1, 499,        /* ӑ Ӑ */
         1097         0x04d3, 499,        /* ӓ Ӓ */
         1098         0x04d5, 499,        /* ӕ Ӕ */
         1099         0x04d7, 499,        /* ӗ Ӗ */
         1100         0x04d9, 499,        /* ә Ә */
         1101         0x04db, 499,        /* ӛ Ӛ */
         1102         0x04dd, 499,        /* ӝ Ӝ */
         1103         0x04df, 499,        /* ӟ Ӟ */
         1104         0x04e1, 499,        /* ӡ Ӡ */
         1105         0x04e3, 499,        /* ӣ Ӣ */
         1106         0x04e5, 499,        /* ӥ Ӥ */
         1107         0x04e7, 499,        /* ӧ Ӧ */
         1108         0x04e9, 499,        /* ө Ө */
         1109         0x04eb, 499,        /* ӫ Ӫ */
         1110         0x04ef, 499,        /* ӯ Ӯ */
         1111         0x04f1, 499,        /* ӱ Ӱ */
         1112         0x04f3, 499,        /* ӳ Ӳ */
         1113         0x04f5, 499,        /* ӵ Ӵ */
         1114         0x04f9, 499,        /* ӹ Ӹ */
         1115         0x1e01, 499,        /* ḁ Ḁ */
         1116         0x1e03, 499,        /* ḃ Ḃ */
         1117         0x1e05, 499,        /* ḅ Ḅ */
         1118         0x1e07, 499,        /* ḇ Ḇ */
         1119         0x1e09, 499,        /* ḉ Ḉ */
         1120         0x1e0b, 499,        /* ḋ Ḋ */
         1121         0x1e0d, 499,        /* ḍ Ḍ */
         1122         0x1e0f, 499,        /* ḏ Ḏ */
         1123         0x1e11, 499,        /* ḑ Ḑ */
         1124         0x1e13, 499,        /* ḓ Ḓ */
         1125         0x1e15, 499,        /* ḕ Ḕ */
         1126         0x1e17, 499,        /* ḗ Ḗ */
         1127         0x1e19, 499,        /* ḙ Ḙ */
         1128         0x1e1b, 499,        /* ḛ Ḛ */
         1129         0x1e1d, 499,        /* ḝ Ḝ */
         1130         0x1e1f, 499,        /* ḟ Ḟ */
         1131         0x1e21, 499,        /* ḡ Ḡ */
         1132         0x1e23, 499,        /* ḣ Ḣ */
         1133         0x1e25, 499,        /* ḥ Ḥ */
         1134         0x1e27, 499,        /* ḧ Ḧ */
         1135         0x1e29, 499,        /* ḩ Ḩ */
         1136         0x1e2b, 499,        /* ḫ Ḫ */
         1137         0x1e2d, 499,        /* ḭ Ḭ */
         1138         0x1e2f, 499,        /* ḯ Ḯ */
         1139         0x1e31, 499,        /* ḱ Ḱ */
         1140         0x1e33, 499,        /* ḳ Ḳ */
         1141         0x1e35, 499,        /* ḵ Ḵ */
         1142         0x1e37, 499,        /* ḷ Ḷ */
         1143         0x1e39, 499,        /* ḹ Ḹ */
         1144         0x1e3b, 499,        /* ḻ Ḻ */
         1145         0x1e3d, 499,        /* ḽ Ḽ */
         1146         0x1e3f, 499,        /* ḿ Ḿ */
         1147         0x1e41, 499,        /* ṁ Ṁ */
         1148         0x1e43, 499,        /* ṃ Ṃ */
         1149         0x1e45, 499,        /* ṅ Ṅ */
         1150         0x1e47, 499,        /* ṇ Ṇ */
         1151         0x1e49, 499,        /* ṉ Ṉ */
         1152         0x1e4b, 499,        /* ṋ Ṋ */
         1153         0x1e4d, 499,        /* ṍ Ṍ */
         1154         0x1e4f, 499,        /* ṏ Ṏ */
         1155         0x1e51, 499,        /* ṑ Ṑ */
         1156         0x1e53, 499,        /* ṓ Ṓ */
         1157         0x1e55, 499,        /* ṕ Ṕ */
         1158         0x1e57, 499,        /* ṗ Ṗ */
         1159         0x1e59, 499,        /* ṙ Ṙ */
         1160         0x1e5b, 499,        /* ṛ Ṛ */
         1161         0x1e5d, 499,        /* ṝ Ṝ */
         1162         0x1e5f, 499,        /* ṟ Ṟ */
         1163         0x1e61, 499,        /* ṡ Ṡ */
         1164         0x1e63, 499,        /* ṣ Ṣ */
         1165         0x1e65, 499,        /* ṥ Ṥ */
         1166         0x1e67, 499,        /* ṧ Ṧ */
         1167         0x1e69, 499,        /* ṩ Ṩ */
         1168         0x1e6b, 499,        /* ṫ Ṫ */
         1169         0x1e6d, 499,        /* ṭ Ṭ */
         1170         0x1e6f, 499,        /* ṯ Ṯ */
         1171         0x1e71, 499,        /* ṱ Ṱ */
         1172         0x1e73, 499,        /* ṳ Ṳ */
         1173         0x1e75, 499,        /* ṵ Ṵ */
         1174         0x1e77, 499,        /* ṷ Ṷ */
         1175         0x1e79, 499,        /* ṹ Ṹ */
         1176         0x1e7b, 499,        /* ṻ Ṻ */
         1177         0x1e7d, 499,        /* ṽ Ṽ */
         1178         0x1e7f, 499,        /* ṿ Ṿ */
         1179         0x1e81, 499,        /* ẁ Ẁ */
         1180         0x1e83, 499,        /* ẃ Ẃ */
         1181         0x1e85, 499,        /* ẅ Ẅ */
         1182         0x1e87, 499,        /* ẇ Ẇ */
         1183         0x1e89, 499,        /* ẉ Ẉ */
         1184         0x1e8b, 499,        /* ẋ Ẋ */
         1185         0x1e8d, 499,        /* ẍ Ẍ */
         1186         0x1e8f, 499,        /* ẏ Ẏ */
         1187         0x1e91, 499,        /* ẑ Ẑ */
         1188         0x1e93, 499,        /* ẓ Ẓ */
         1189         0x1e95, 499,        /* ẕ Ẕ */
         1190         0x1ea1, 499,        /* ạ Ạ */
         1191         0x1ea3, 499,        /* ả Ả */
         1192         0x1ea5, 499,        /* ấ Ấ */
         1193         0x1ea7, 499,        /* ầ Ầ */
         1194         0x1ea9, 499,        /* ẩ Ẩ */
         1195         0x1eab, 499,        /* ẫ Ẫ */
         1196         0x1ead, 499,        /* ậ Ậ */
         1197         0x1eaf, 499,        /* ắ Ắ */
         1198         0x1eb1, 499,        /* ằ Ằ */
         1199         0x1eb3, 499,        /* ẳ Ẳ */
         1200         0x1eb5, 499,        /* ẵ Ẵ */
         1201         0x1eb7, 499,        /* ặ Ặ */
         1202         0x1eb9, 499,        /* ẹ Ẹ */
         1203         0x1ebb, 499,        /* ẻ Ẻ */
         1204         0x1ebd, 499,        /* ẽ Ẽ */
         1205         0x1ebf, 499,        /* ế Ế */
         1206         0x1ec1, 499,        /* ề Ề */
         1207         0x1ec3, 499,        /* ể Ể */
         1208         0x1ec5, 499,        /* ễ Ễ */
         1209         0x1ec7, 499,        /* ệ Ệ */
         1210         0x1ec9, 499,        /* ỉ Ỉ */
         1211         0x1ecb, 499,        /* ị Ị */
         1212         0x1ecd, 499,        /* ọ Ọ */
         1213         0x1ecf, 499,        /* ỏ Ỏ */
         1214         0x1ed1, 499,        /* ố Ố */
         1215         0x1ed3, 499,        /* ồ Ồ */
         1216         0x1ed5, 499,        /* ổ Ổ */
         1217         0x1ed7, 499,        /* ỗ Ỗ */
         1218         0x1ed9, 499,        /* ộ Ộ */
         1219         0x1edb, 499,        /* ớ Ớ */
         1220         0x1edd, 499,        /* ờ Ờ */
         1221         0x1edf, 499,        /* ở Ở */
         1222         0x1ee1, 499,        /* ỡ Ỡ */
         1223         0x1ee3, 499,        /* ợ Ợ */
         1224         0x1ee5, 499,        /* ụ Ụ */
         1225         0x1ee7, 499,        /* ủ Ủ */
         1226         0x1ee9, 499,        /* ứ Ứ */
         1227         0x1eeb, 499,        /* ừ Ừ */
         1228         0x1eed, 499,        /* ử Ử */
         1229         0x1eef, 499,        /* ữ Ữ */
         1230         0x1ef1, 499,        /* ự Ự */
         1231         0x1ef3, 499,        /* ỳ Ỳ */
         1232         0x1ef5, 499,        /* ỵ Ỵ */
         1233         0x1ef7, 499,        /* ỷ Ỷ */
         1234         0x1ef9, 499,        /* ỹ Ỹ */
         1235         0x1f51, 508,        /* ὑ Ὑ */
         1236         0x1f53, 508,        /* ὓ Ὓ */
         1237         0x1f55, 508,        /* ὕ Ὕ */
         1238         0x1f57, 508,        /* ὗ Ὗ */
         1239         0x1fb3, 509,        /* ᾳ ᾼ */
         1240         0x1fc3, 509,        /* ῃ ῌ */
         1241         0x1fe5, 507,        /* ῥ Ῥ */
         1242         0x1ff3, 509,        /* ῳ ῼ */
         1243 };
         1244 
         1245 /*
         1246  * upper case ranges
         1247  *        3rd col is conversion excess 500
         1248  */
         1249 static
         1250 Rune        __tolower2[] =
         1251 {
         1252         0x0041,        0x005a, 532,        /* A-Z a-z */
         1253         0x00c0,        0x00d6, 532,        /* À-Ö à-ö */
         1254         0x00d8,        0x00de, 532,        /* Ø-Þ ø-þ */
         1255         0x0189,        0x018a, 705,        /* Ɖ-Ɗ ɖ-ɗ */
         1256         0x018e,        0x018f, 702,        /* Ǝ-Ə ɘ-ə */
         1257         0x01b1,        0x01b2, 717,        /* Ʊ-Ʋ ʊ-ʋ */
         1258         0x0388,        0x038a, 537,        /* Έ-Ί έ-ί */
         1259         0x038e,        0x038f, 563,        /* Ύ-Ώ ύ-ώ */
         1260         0x0391,        0x03a1, 532,        /* Α-Ρ α-ρ */
         1261         0x03a3,        0x03ab, 532,        /* Σ-Ϋ σ-ϋ */
         1262         0x0401,        0x040c, 580,        /* Ё-Ќ ё-ќ */
         1263         0x040e,        0x040f, 580,        /* Ў-Џ ў-џ */
         1264         0x0410,        0x042f, 532,        /* А-Я а-я */
         1265         0x0531,        0x0556, 548,        /* Ա-Ֆ ա-ֆ */
         1266         0x10a0,        0x10c5, 548,        /* Ⴀ-Ⴥ ა-ჵ */
         1267         0x1f08,        0x1f0f, 492,        /* Ἀ-Ἇ ἀ-ἇ */
         1268         0x1f18,        0x1f1d, 492,        /* Ἐ-Ἕ ἐ-ἕ */
         1269         0x1f28,        0x1f2f, 492,        /* Ἠ-Ἧ ἠ-ἧ */
         1270         0x1f38,        0x1f3f, 492,        /* Ἰ-Ἷ ἰ-ἷ */
         1271         0x1f48,        0x1f4d, 492,        /* Ὀ-Ὅ ὀ-ὅ */
         1272         0x1f68,        0x1f6f, 492,        /* Ὠ-Ὧ ὠ-ὧ */
         1273         0x1f88,        0x1f8f, 492,        /* ᾈ-ᾏ ᾀ-ᾇ */
         1274         0x1f98,        0x1f9f, 492,        /* ᾘ-ᾟ ᾐ-ᾗ */
         1275         0x1fa8,        0x1faf, 492,        /* ᾨ-ᾯ ᾠ-ᾧ */
         1276         0x1fb8,        0x1fb9, 492,        /* Ᾰ-Ᾱ ᾰ-ᾱ */
         1277         0x1fba,        0x1fbb, 426,        /* Ὰ-Ά ὰ-ά */
         1278         0x1fc8,        0x1fcb, 414,        /* Ὲ-Ή ὲ-ή */
         1279         0x1fd8,        0x1fd9, 492,        /* Ῐ-Ῑ ῐ-ῑ */
         1280         0x1fda,        0x1fdb, 400,        /* Ὶ-Ί ὶ-ί */
         1281         0x1fe8,        0x1fe9, 492,        /* Ῠ-Ῡ ῠ-ῡ */
         1282         0x1fea,        0x1feb, 388,        /* Ὺ-Ύ ὺ-ύ */
         1283         0x1ff8,        0x1ff9, 372,        /* Ὸ-Ό ὸ-ό */
         1284         0x1ffa,        0x1ffb, 374,        /* Ὼ-Ώ ὼ-ώ */
         1285         0x2160,        0x216f, 516,        /* Ⅰ-Ⅿ ⅰ-ⅿ */
         1286         0x24b6,        0x24cf, 526,        /* Ⓐ-Ⓩ ⓐ-ⓩ */
         1287         0xff21,        0xff3a, 532,        /* A-Z a-z */
         1288 };
         1289 
         1290 /*
         1291  * upper case singlets
         1292  *        2nd col is conversion excess 500
         1293  */
         1294 static
         1295 Rune        __tolower1[] =
         1296 {
         1297         0x0100, 501,        /* Ā ā */
         1298         0x0102, 501,        /* Ă ă */
         1299         0x0104, 501,        /* Ą ą */
         1300         0x0106, 501,        /* Ć ć */
         1301         0x0108, 501,        /* Ĉ ĉ */
         1302         0x010a, 501,        /* Ċ ċ */
         1303         0x010c, 501,        /* Č č */
         1304         0x010e, 501,        /* Ď ď */
         1305         0x0110, 501,        /* Đ đ */
         1306         0x0112, 501,        /* Ē ē */
         1307         0x0114, 501,        /* Ĕ ĕ */
         1308         0x0116, 501,        /* Ė ė */
         1309         0x0118, 501,        /* Ę ę */
         1310         0x011a, 501,        /* Ě ě */
         1311         0x011c, 501,        /* Ĝ ĝ */
         1312         0x011e, 501,        /* Ğ ğ */
         1313         0x0120, 501,        /* Ġ ġ */
         1314         0x0122, 501,        /* Ģ ģ */
         1315         0x0124, 501,        /* Ĥ ĥ */
         1316         0x0126, 501,        /* Ħ ħ */
         1317         0x0128, 501,        /* Ĩ ĩ */
         1318         0x012a, 501,        /* Ī ī */
         1319         0x012c, 501,        /* Ĭ ĭ */
         1320         0x012e, 501,        /* Į į */
         1321         0x0130, 301,        /* İ i */
         1322         0x0132, 501,        /* IJ ij */
         1323         0x0134, 501,        /* Ĵ ĵ */
         1324         0x0136, 501,        /* Ķ ķ */
         1325         0x0139, 501,        /* Ĺ ĺ */
         1326         0x013b, 501,        /* Ļ ļ */
         1327         0x013d, 501,        /* Ľ ľ */
         1328         0x013f, 501,        /* Ŀ ŀ */
         1329         0x0141, 501,        /* Ł ł */
         1330         0x0143, 501,        /* Ń ń */
         1331         0x0145, 501,        /* Ņ ņ */
         1332         0x0147, 501,        /* Ň ň */
         1333         0x014a, 501,        /* Ŋ ŋ */
         1334         0x014c, 501,        /* Ō ō */
         1335         0x014e, 501,        /* Ŏ ŏ */
         1336         0x0150, 501,        /* Ő ő */
         1337         0x0152, 501,        /* Œ œ */
         1338         0x0154, 501,        /* Ŕ ŕ */
         1339         0x0156, 501,        /* Ŗ ŗ */
         1340         0x0158, 501,        /* Ř ř */
         1341         0x015a, 501,        /* Ś ś */
         1342         0x015c, 501,        /* Ŝ ŝ */
         1343         0x015e, 501,        /* Ş ş */
         1344         0x0160, 501,        /* Š š */
         1345         0x0162, 501,        /* Ţ ţ */
         1346         0x0164, 501,        /* Ť ť */
         1347         0x0166, 501,        /* Ŧ ŧ */
         1348         0x0168, 501,        /* Ũ ũ */
         1349         0x016a, 501,        /* Ū ū */
         1350         0x016c, 501,        /* Ŭ ŭ */
         1351         0x016e, 501,        /* Ů ů */
         1352         0x0170, 501,        /* Ű ű */
         1353         0x0172, 501,        /* Ų ų */
         1354         0x0174, 501,        /* Ŵ ŵ */
         1355         0x0176, 501,        /* Ŷ ŷ */
         1356         0x0178, 379,        /* Ÿ ÿ */
         1357         0x0179, 501,        /* Ź ź */
         1358         0x017b, 501,        /* Ż ż */
         1359         0x017d, 501,        /* Ž ž */
         1360         0x0181, 710,        /* Ɓ ɓ */
         1361         0x0182, 501,        /* Ƃ ƃ */
         1362         0x0184, 501,        /* Ƅ ƅ */
         1363         0x0186, 706,        /* Ɔ ɔ */
         1364         0x0187, 501,        /* Ƈ ƈ */
         1365         0x018b, 501,        /* Ƌ ƌ */
         1366         0x0190, 703,        /* Ɛ ɛ */
         1367         0x0191, 501,        /* Ƒ ƒ */
         1368         0x0193, 705,        /* Ɠ ɠ */
         1369         0x0194, 707,        /* Ɣ ɣ */
         1370         0x0196, 711,        /* Ɩ ɩ */
         1371         0x0197, 709,        /* Ɨ ɨ */
         1372         0x0198, 501,        /* Ƙ ƙ */
         1373         0x019c, 711,        /* Ɯ ɯ */
         1374         0x019d, 713,        /* Ɲ ɲ */
         1375         0x01a0, 501,        /* Ơ ơ */
         1376         0x01a2, 501,        /* Ƣ ƣ */
         1377         0x01a4, 501,        /* Ƥ ƥ */
         1378         0x01a7, 501,        /* Ƨ ƨ */
         1379         0x01a9, 718,        /* Ʃ ʃ */
         1380         0x01ac, 501,        /* Ƭ ƭ */
         1381         0x01ae, 718,        /* Ʈ ʈ */
         1382         0x01af, 501,        /* Ư ư */
         1383         0x01b3, 501,        /* Ƴ ƴ */
         1384         0x01b5, 501,        /* Ƶ ƶ */
         1385         0x01b7, 719,        /* Ʒ ʒ */
         1386         0x01b8, 501,        /* Ƹ ƹ */
         1387         0x01bc, 501,        /* Ƽ ƽ */
         1388         0x01c4, 502,        /* DŽ dž */
         1389         0x01c5, 501,        /* Dž dž */
         1390         0x01c7, 502,        /* LJ lj */
         1391         0x01c8, 501,        /* Lj lj */
         1392         0x01ca, 502,        /* NJ nj */
         1393         0x01cb, 501,        /* Nj nj */
         1394         0x01cd, 501,        /* Ǎ ǎ */
         1395         0x01cf, 501,        /* Ǐ ǐ */
         1396         0x01d1, 501,        /* Ǒ ǒ */
         1397         0x01d3, 501,        /* Ǔ ǔ */
         1398         0x01d5, 501,        /* Ǖ ǖ */
         1399         0x01d7, 501,        /* Ǘ ǘ */
         1400         0x01d9, 501,        /* Ǚ ǚ */
         1401         0x01db, 501,        /* Ǜ ǜ */
         1402         0x01de, 501,        /* Ǟ ǟ */
         1403         0x01e0, 501,        /* Ǡ ǡ */
         1404         0x01e2, 501,        /* Ǣ ǣ */
         1405         0x01e4, 501,        /* Ǥ ǥ */
         1406         0x01e6, 501,        /* Ǧ ǧ */
         1407         0x01e8, 501,        /* Ǩ ǩ */
         1408         0x01ea, 501,        /* Ǫ ǫ */
         1409         0x01ec, 501,        /* Ǭ ǭ */
         1410         0x01ee, 501,        /* Ǯ ǯ */
         1411         0x01f1, 502,        /* DZ dz */
         1412         0x01f2, 501,        /* Dz dz */
         1413         0x01f4, 501,        /* Ǵ ǵ */
         1414         0x01fa, 501,        /* Ǻ ǻ */
         1415         0x01fc, 501,        /* Ǽ ǽ */
         1416         0x01fe, 501,        /* Ǿ ǿ */
         1417         0x0200, 501,        /* Ȁ ȁ */
         1418         0x0202, 501,        /* Ȃ ȃ */
         1419         0x0204, 501,        /* Ȅ ȅ */
         1420         0x0206, 501,        /* Ȇ ȇ */
         1421         0x0208, 501,        /* Ȉ ȉ */
         1422         0x020a, 501,        /* Ȋ ȋ */
         1423         0x020c, 501,        /* Ȍ ȍ */
         1424         0x020e, 501,        /* Ȏ ȏ */
         1425         0x0210, 501,        /* Ȑ ȑ */
         1426         0x0212, 501,        /* Ȓ ȓ */
         1427         0x0214, 501,        /* Ȕ ȕ */
         1428         0x0216, 501,        /* Ȗ ȗ */
         1429         0x0386, 538,        /* Ά ά */
         1430         0x038c, 564,        /* Ό ό */
         1431         0x03e2, 501,        /* Ϣ ϣ */
         1432         0x03e4, 501,        /* Ϥ ϥ */
         1433         0x03e6, 501,        /* Ϧ ϧ */
         1434         0x03e8, 501,        /* Ϩ ϩ */
         1435         0x03ea, 501,        /* Ϫ ϫ */
         1436         0x03ec, 501,        /* Ϭ ϭ */
         1437         0x03ee, 501,        /* Ϯ ϯ */
         1438         0x0460, 501,        /* Ѡ ѡ */
         1439         0x0462, 501,        /* Ѣ ѣ */
         1440         0x0464, 501,        /* Ѥ ѥ */
         1441         0x0466, 501,        /* Ѧ ѧ */
         1442         0x0468, 501,        /* Ѩ ѩ */
         1443         0x046a, 501,        /* Ѫ ѫ */
         1444         0x046c, 501,        /* Ѭ ѭ */
         1445         0x046e, 501,        /* Ѯ ѯ */
         1446         0x0470, 501,        /* Ѱ ѱ */
         1447         0x0472, 501,        /* Ѳ ѳ */
         1448         0x0474, 501,        /* Ѵ ѵ */
         1449         0x0476, 501,        /* Ѷ ѷ */
         1450         0x0478, 501,        /* Ѹ ѹ */
         1451         0x047a, 501,        /* Ѻ ѻ */
         1452         0x047c, 501,        /* Ѽ ѽ */
         1453         0x047e, 501,        /* Ѿ ѿ */
         1454         0x0480, 501,        /* Ҁ ҁ */
         1455         0x0490, 501,        /* Ґ ґ */
         1456         0x0492, 501,        /* Ғ ғ */
         1457         0x0494, 501,        /* Ҕ ҕ */
         1458         0x0496, 501,        /* Җ җ */
         1459         0x0498, 501,        /* Ҙ ҙ */
         1460         0x049a, 501,        /* Қ қ */
         1461         0x049c, 501,        /* Ҝ ҝ */
         1462         0x049e, 501,        /* Ҟ ҟ */
         1463         0x04a0, 501,        /* Ҡ ҡ */
         1464         0x04a2, 501,        /* Ң ң */
         1465         0x04a4, 501,        /* Ҥ ҥ */
         1466         0x04a6, 501,        /* Ҧ ҧ */
         1467         0x04a8, 501,        /* Ҩ ҩ */
         1468         0x04aa, 501,        /* Ҫ ҫ */
         1469         0x04ac, 501,        /* Ҭ ҭ */
         1470         0x04ae, 501,        /* Ү ү */
         1471         0x04b0, 501,        /* Ұ ұ */
         1472         0x04b2, 501,        /* Ҳ ҳ */
         1473         0x04b4, 501,        /* Ҵ ҵ */
         1474         0x04b6, 501,        /* Ҷ ҷ */
         1475         0x04b8, 501,        /* Ҹ ҹ */
         1476         0x04ba, 501,        /* Һ һ */
         1477         0x04bc, 501,        /* Ҽ ҽ */
         1478         0x04be, 501,        /* Ҿ ҿ */
         1479         0x04c1, 501,        /* Ӂ ӂ */
         1480         0x04c3, 501,        /* Ӄ ӄ */
         1481         0x04c7, 501,        /* Ӈ ӈ */
         1482         0x04cb, 501,        /* Ӌ ӌ */
         1483         0x04d0, 501,        /* Ӑ ӑ */
         1484         0x04d2, 501,        /* Ӓ ӓ */
         1485         0x04d4, 501,        /* Ӕ ӕ */
         1486         0x04d6, 501,        /* Ӗ ӗ */
         1487         0x04d8, 501,        /* Ә ә */
         1488         0x04da, 501,        /* Ӛ ӛ */
         1489         0x04dc, 501,        /* Ӝ ӝ */
         1490         0x04de, 501,        /* Ӟ ӟ */
         1491         0x04e0, 501,        /* Ӡ ӡ */
         1492         0x04e2, 501,        /* Ӣ ӣ */
         1493         0x04e4, 501,        /* Ӥ ӥ */
         1494         0x04e6, 501,        /* Ӧ ӧ */
         1495         0x04e8, 501,        /* Ө ө */
         1496         0x04ea, 501,        /* Ӫ ӫ */
         1497         0x04ee, 501,        /* Ӯ ӯ */
         1498         0x04f0, 501,        /* Ӱ ӱ */
         1499         0x04f2, 501,        /* Ӳ ӳ */
         1500         0x04f4, 501,        /* Ӵ ӵ */
         1501         0x04f8, 501,        /* Ӹ ӹ */
         1502         0x1e00, 501,        /* Ḁ ḁ */
         1503         0x1e02, 501,        /* Ḃ ḃ */
         1504         0x1e04, 501,        /* Ḅ ḅ */
         1505         0x1e06, 501,        /* Ḇ ḇ */
         1506         0x1e08, 501,        /* Ḉ ḉ */
         1507         0x1e0a, 501,        /* Ḋ ḋ */
         1508         0x1e0c, 501,        /* Ḍ ḍ */
         1509         0x1e0e, 501,        /* Ḏ ḏ */
         1510         0x1e10, 501,        /* Ḑ ḑ */
         1511         0x1e12, 501,        /* Ḓ ḓ */
         1512         0x1e14, 501,        /* Ḕ ḕ */
         1513         0x1e16, 501,        /* Ḗ ḗ */
         1514         0x1e18, 501,        /* Ḙ ḙ */
         1515         0x1e1a, 501,        /* Ḛ ḛ */
         1516         0x1e1c, 501,        /* Ḝ ḝ */
         1517         0x1e1e, 501,        /* Ḟ ḟ */
         1518         0x1e20, 501,        /* Ḡ ḡ */
         1519         0x1e22, 501,        /* Ḣ ḣ */
         1520         0x1e24, 501,        /* Ḥ ḥ */
         1521         0x1e26, 501,        /* Ḧ ḧ */
         1522         0x1e28, 501,        /* Ḩ ḩ */
         1523         0x1e2a, 501,        /* Ḫ ḫ */
         1524         0x1e2c, 501,        /* Ḭ ḭ */
         1525         0x1e2e, 501,        /* Ḯ ḯ */
         1526         0x1e30, 501,        /* Ḱ ḱ */
         1527         0x1e32, 501,        /* Ḳ ḳ */
         1528         0x1e34, 501,        /* Ḵ ḵ */
         1529         0x1e36, 501,        /* Ḷ ḷ */
         1530         0x1e38, 501,        /* Ḹ ḹ */
         1531         0x1e3a, 501,        /* Ḻ ḻ */
         1532         0x1e3c, 501,        /* Ḽ ḽ */
         1533         0x1e3e, 501,        /* Ḿ ḿ */
         1534         0x1e40, 501,        /* Ṁ ṁ */
         1535         0x1e42, 501,        /* Ṃ ṃ */
         1536         0x1e44, 501,        /* Ṅ ṅ */
         1537         0x1e46, 501,        /* Ṇ ṇ */
         1538         0x1e48, 501,        /* Ṉ ṉ */
         1539         0x1e4a, 501,        /* Ṋ ṋ */
         1540         0x1e4c, 501,        /* Ṍ ṍ */
         1541         0x1e4e, 501,        /* Ṏ ṏ */
         1542         0x1e50, 501,        /* Ṑ ṑ */
         1543         0x1e52, 501,        /* Ṓ ṓ */
         1544         0x1e54, 501,        /* Ṕ ṕ */
         1545         0x1e56, 501,        /* Ṗ ṗ */
         1546         0x1e58, 501,        /* Ṙ ṙ */
         1547         0x1e5a, 501,        /* Ṛ ṛ */
         1548         0x1e5c, 501,        /* Ṝ ṝ */
         1549         0x1e5e, 501,        /* Ṟ ṟ */
         1550         0x1e60, 501,        /* Ṡ ṡ */
         1551         0x1e62, 501,        /* Ṣ ṣ */
         1552         0x1e64, 501,        /* Ṥ ṥ */
         1553         0x1e66, 501,        /* Ṧ ṧ */
         1554         0x1e68, 501,        /* Ṩ ṩ */
         1555         0x1e6a, 501,        /* Ṫ ṫ */
         1556         0x1e6c, 501,        /* Ṭ ṭ */
         1557         0x1e6e, 501,        /* Ṯ ṯ */
         1558         0x1e70, 501,        /* Ṱ ṱ */
         1559         0x1e72, 501,        /* Ṳ ṳ */
         1560         0x1e74, 501,        /* Ṵ ṵ */
         1561         0x1e76, 501,        /* Ṷ ṷ */
         1562         0x1e78, 501,        /* Ṹ ṹ */
         1563         0x1e7a, 501,        /* Ṻ ṻ */
         1564         0x1e7c, 501,        /* Ṽ ṽ */
         1565         0x1e7e, 501,        /* Ṿ ṿ */
         1566         0x1e80, 501,        /* Ẁ ẁ */
         1567         0x1e82, 501,        /* Ẃ ẃ */
         1568         0x1e84, 501,        /* Ẅ ẅ */
         1569         0x1e86, 501,        /* Ẇ ẇ */
         1570         0x1e88, 501,        /* Ẉ ẉ */
         1571         0x1e8a, 501,        /* Ẋ ẋ */
         1572         0x1e8c, 501,        /* Ẍ ẍ */
         1573         0x1e8e, 501,        /* Ẏ ẏ */
         1574         0x1e90, 501,        /* Ẑ ẑ */
         1575         0x1e92, 501,        /* Ẓ ẓ */
         1576         0x1e94, 501,        /* Ẕ ẕ */
         1577         0x1ea0, 501,        /* Ạ ạ */
         1578         0x1ea2, 501,        /* Ả ả */
         1579         0x1ea4, 501,        /* Ấ ấ */
         1580         0x1ea6, 501,        /* Ầ ầ */
         1581         0x1ea8, 501,        /* Ẩ ẩ */
         1582         0x1eaa, 501,        /* Ẫ ẫ */
         1583         0x1eac, 501,        /* Ậ ậ */
         1584         0x1eae, 501,        /* Ắ ắ */
         1585         0x1eb0, 501,        /* Ằ ằ */
         1586         0x1eb2, 501,        /* Ẳ ẳ */
         1587         0x1eb4, 501,        /* Ẵ ẵ */
         1588         0x1eb6, 501,        /* Ặ ặ */
         1589         0x1eb8, 501,        /* Ẹ ẹ */
         1590         0x1eba, 501,        /* Ẻ ẻ */
         1591         0x1ebc, 501,        /* Ẽ ẽ */
         1592         0x1ebe, 501,        /* Ế ế */
         1593         0x1ec0, 501,        /* Ề ề */
         1594         0x1ec2, 501,        /* Ể ể */
         1595         0x1ec4, 501,        /* Ễ ễ */
         1596         0x1ec6, 501,        /* Ệ ệ */
         1597         0x1ec8, 501,        /* Ỉ ỉ */
         1598         0x1eca, 501,        /* Ị ị */
         1599         0x1ecc, 501,        /* Ọ ọ */
         1600         0x1ece, 501,        /* Ỏ ỏ */
         1601         0x1ed0, 501,        /* Ố ố */
         1602         0x1ed2, 501,        /* Ồ ồ */
         1603         0x1ed4, 501,        /* Ổ ổ */
         1604         0x1ed6, 501,        /* Ỗ ỗ */
         1605         0x1ed8, 501,        /* Ộ ộ */
         1606         0x1eda, 501,        /* Ớ ớ */
         1607         0x1edc, 501,        /* Ờ ờ */
         1608         0x1ede, 501,        /* Ở ở */
         1609         0x1ee0, 501,        /* Ỡ ỡ */
         1610         0x1ee2, 501,        /* Ợ ợ */
         1611         0x1ee4, 501,        /* Ụ ụ */
         1612         0x1ee6, 501,        /* Ủ ủ */
         1613         0x1ee8, 501,        /* Ứ ứ */
         1614         0x1eea, 501,        /* Ừ ừ */
         1615         0x1eec, 501,        /* Ử ử */
         1616         0x1eee, 501,        /* Ữ ữ */
         1617         0x1ef0, 501,        /* Ự ự */
         1618         0x1ef2, 501,        /* Ỳ ỳ */
         1619         0x1ef4, 501,        /* Ỵ ỵ */
         1620         0x1ef6, 501,        /* Ỷ ỷ */
         1621         0x1ef8, 501,        /* Ỹ ỹ */
         1622         0x1f59, 492,        /* Ὑ ὑ */
         1623         0x1f5b, 492,        /* Ὓ ὓ */
         1624         0x1f5d, 492,        /* Ὕ ὕ */
         1625         0x1f5f, 492,        /* Ὗ ὗ */
         1626         0x1fbc, 491,        /* ᾼ ᾳ */
         1627         0x1fcc, 491,        /* ῌ ῃ */
         1628         0x1fec, 493,        /* Ῥ ῥ */
         1629         0x1ffc, 491,        /* ῼ ῳ */
         1630 };
         1631 
         1632 /*
         1633  * title characters are those between
         1634  * upper and lower case. ie DZ Dz dz
         1635  */
         1636 static
         1637 Rune        __totitle1[] =
         1638 {
         1639         0x01c4, 501,        /* DŽ Dž */
         1640         0x01c6, 499,        /* dž Dž */
         1641         0x01c7, 501,        /* LJ Lj */
         1642         0x01c9, 499,        /* lj Lj */
         1643         0x01ca, 501,        /* NJ Nj */
         1644         0x01cc, 499,        /* nj Nj */
         1645         0x01f1, 501,        /* DZ Dz */
         1646         0x01f3, 499,        /* dz Dz */
         1647 };
         1648 
         1649 static Rune*
         1650 bsearch(Rune c, Rune *t, int n, int ne)
         1651 {
         1652         Rune *p;
         1653         int m;
         1654 
         1655         while(n > 1) {
         1656                 m = n/2;
         1657                 p = t + m*ne;
         1658                 if(c >= p[0]) {
         1659                         t = p;
         1660                         n = n-m;
         1661                 } else
         1662                         n = m;
         1663         }
         1664         if(n && c >= t[0])
         1665                 return t;
         1666         return 0;
         1667 }
         1668 
         1669 Rune
         1670 tolowerrune(Rune c)
         1671 {
         1672         Rune *p;
         1673 
         1674         p = bsearch(c, __tolower2, nelem(__tolower2)/3, 3);
         1675         if(p && c >= p[0] && c <= p[1])
         1676                 return c + p[2] - 500;
         1677         p = bsearch(c, __tolower1, nelem(__tolower1)/2, 2);
         1678         if(p && c == p[0])
         1679                 return c + p[1] - 500;
         1680         return c;
         1681 }
         1682 
         1683 Rune
         1684 toupperrune(Rune c)
         1685 {
         1686         Rune *p;
         1687 
         1688         p = bsearch(c, __toupper2, nelem(__toupper2)/3, 3);
         1689         if(p && c >= p[0] && c <= p[1])
         1690                 return c + p[2] - 500;
         1691         p = bsearch(c, __toupper1, nelem(__toupper1)/2, 2);
         1692         if(p && c == p[0])
         1693                 return c + p[1] - 500;
         1694         return c;
         1695 }
         1696 
         1697 Rune
         1698 totitlerune(Rune c)
         1699 {
         1700         Rune *p;
         1701 
         1702         p = bsearch(c, __totitle1, nelem(__totitle1)/2, 2);
         1703         if(p && c == p[0])
         1704                 return c + p[1] - 500;
         1705         return c;
         1706 }
         1707 
         1708 int
         1709 islowerrune(Rune c)
         1710 {
         1711         Rune *p;
         1712 
         1713         p = bsearch(c, __toupper2, nelem(__toupper2)/3, 3);
         1714         if(p && c >= p[0] && c <= p[1])
         1715                 return 1;
         1716         p = bsearch(c, __toupper1, nelem(__toupper1)/2, 2);
         1717         if(p && c == p[0])
         1718                 return 1;
         1719         return 0;
         1720 }
         1721 
         1722 int
         1723 isupperrune(Rune c)
         1724 {
         1725         Rune *p;
         1726 
         1727         p = bsearch(c, __tolower2, nelem(__tolower2)/3, 3);
         1728         if(p && c >= p[0] && c <= p[1])
         1729                 return 1;
         1730         p = bsearch(c, __tolower1, nelem(__tolower1)/2, 2);
         1731         if(p && c == p[0])
         1732                 return 1;
         1733         return 0;
         1734 }
         1735 
         1736 int
         1737 isalpharune(Rune c)
         1738 {
         1739         Rune *p;
         1740 
         1741         if(isupperrune(c) || islowerrune(c))
         1742                 return 1;
         1743         p = bsearch(c, __alpha2, nelem(__alpha2)/2, 2);
         1744         if(p && c >= p[0] && c <= p[1])
         1745                 return 1;
         1746         p = bsearch(c, __alpha1, nelem(__alpha1), 1);
         1747         if(p && c == p[0])
         1748                 return 1;
         1749         return 0;
         1750 }
         1751 
         1752 int
         1753 istitlerune(Rune c)
         1754 {
         1755         return isupperrune(c) && islowerrune(c);
         1756 }
         1757 
         1758 int
         1759 isspacerune(Rune c)
         1760 {
         1761         Rune *p;
         1762 
         1763         p = bsearch(c, __space2, nelem(__space2)/2, 2);
         1764         if(p && c >= p[0] && c <= p[1])
         1765                 return 1;
         1766         return 0;
         1767 }
         1768 /* -------------- utfecpy.c --------------- */
         1769 /*
         1770  * The authors of this software are Rob Pike and Ken Thompson.
         1771  *              Copyright (c) 2002 by Lucent Technologies.
         1772  * Permission to use, copy, modify, and distribute this software for any
         1773  * purpose without fee is hereby granted, provided that this entire notice
         1774  * is included in all copies of any software which is or includes a copy
         1775  * or modification of this software and in all copies of the supporting
         1776  * documentation for such software.
         1777  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
         1778  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
         1779  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
         1780  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
         1781  */
         1782 #define _BSD_SOURCE 1        /* memccpy */
         1783 // #include <stdarg.h>
         1784 // #include <string.h>
         1785 // #include "plan9.h"
         1786 // #include "utf.h"
         1787 
         1788 char*
         1789 utfecpy(char *to, char *e, char *from)
         1790 {
         1791         char *end;
         1792 
         1793         if(to >= e)
         1794                 return to;
         1795         end = memccpy(to, from, '\0', e - to);
         1796         if(end == nil){
         1797                 end = e-1;
         1798                 while(end>to && (*--end&0xC0)==0x80)
         1799                         ;
         1800                 *end = '\0';
         1801         }else{
         1802                 end--;
         1803         }
         1804         return end;
         1805 }
         1806 /* -------------- utflen.c --------------- */
         1807 /*
         1808  * The authors of this software are Rob Pike and Ken Thompson.
         1809  *              Copyright (c) 2002 by Lucent Technologies.
         1810  * Permission to use, copy, modify, and distribute this software for any
         1811  * purpose without fee is hereby granted, provided that this entire notice
         1812  * is included in all copies of any software which is or includes a copy
         1813  * or modification of this software and in all copies of the supporting
         1814  * documentation for such software.
         1815  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
         1816  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
         1817  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
         1818  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
         1819  */
         1820 // #include <stdarg.h>
         1821 // #include <string.h>
         1822 // #include "plan9.h"
         1823 // #include "utf.h"
         1824 
         1825 int
         1826 utflen(char *s)
         1827 {
         1828         int c;
         1829         long n;
         1830         Rune rune;
         1831 
         1832         n = 0;
         1833         for(;;) {
         1834                 c = *(uchar*)s;
         1835                 if(c < Runeself) {
         1836                         if(c == 0)
         1837                                 return n;
         1838                         s++;
         1839                 } else
         1840                         s += chartorune(&rune, s);
         1841                 n++;
         1842         }
         1843 }
         1844 /* -------------- utfnlen.c --------------- */
         1845 /*
         1846  * The authors of this software are Rob Pike and Ken Thompson.
         1847  *              Copyright (c) 2002 by Lucent Technologies.
         1848  * Permission to use, copy, modify, and distribute this software for any
         1849  * purpose without fee is hereby granted, provided that this entire notice
         1850  * is included in all copies of any software which is or includes a copy
         1851  * or modification of this software and in all copies of the supporting
         1852  * documentation for such software.
         1853  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
         1854  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
         1855  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
         1856  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
         1857  */
         1858 // #include <stdarg.h>
         1859 // #include <string.h>
         1860 // #include "plan9.h"
         1861 // #include "utf.h"
         1862 
         1863 int
         1864 utfnlen(char *s, long m)
         1865 {
         1866         int c;
         1867         long n;
         1868         Rune rune;
         1869         char *es;
         1870 
         1871         es = s + m;
         1872         for(n = 0; s < es; n++) {
         1873                 c = *(uchar*)s;
         1874                 if(c < Runeself){
         1875                         if(c == '\0')
         1876                                 break;
         1877                         s++;
         1878                         continue;
         1879                 }
         1880                 if(!fullrune(s, es-s))
         1881                         break;
         1882                 s += chartorune(&rune, s);
         1883         }
         1884         return n;
         1885 }
         1886 /* -------------- utfrrune.c --------------- */
         1887 /*
         1888  * The authors of this software are Rob Pike and Ken Thompson.
         1889  *              Copyright (c) 2002 by Lucent Technologies.
         1890  * Permission to use, copy, modify, and distribute this software for any
         1891  * purpose without fee is hereby granted, provided that this entire notice
         1892  * is included in all copies of any software which is or includes a copy
         1893  * or modification of this software and in all copies of the supporting
         1894  * documentation for such software.
         1895  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
         1896  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
         1897  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
         1898  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
         1899  */
         1900 // #include <stdarg.h>
         1901 // #include <string.h>
         1902 // #include "plan9.h"
         1903 // #include "utf.h"
         1904 
         1905 char*
         1906 utfrrune(char *s, long c)
         1907 {
         1908         long c1;
         1909         Rune r;
         1910         char *s1;
         1911 
         1912         if(c < Runesync)                /* not part of utf sequence */
         1913                 return strrchr(s, c);
         1914 
         1915         s1 = 0;
         1916         for(;;) {
         1917                 c1 = *(uchar*)s;
         1918                 if(c1 < Runeself) {        /* one byte rune */
         1919                         if(c1 == 0)
         1920                                 return s1;
         1921                         if(c1 == c)
         1922                                 s1 = s;
         1923                         s++;
         1924                         continue;
         1925                 }
         1926                 c1 = chartorune(&r, s);
         1927                 if(r == c)
         1928                         s1 = s;
         1929                 s += c1;
         1930         }
         1931 }
         1932 /* -------------- utfrune.c --------------- */
         1933 /*
         1934  * The authors of this software are Rob Pike and Ken Thompson.
         1935  *              Copyright (c) 2002 by Lucent Technologies.
         1936  * Permission to use, copy, modify, and distribute this software for any
         1937  * purpose without fee is hereby granted, provided that this entire notice
         1938  * is included in all copies of any software which is or includes a copy
         1939  * or modification of this software and in all copies of the supporting
         1940  * documentation for such software.
         1941  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
         1942  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
         1943  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
         1944  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
         1945  */
         1946 // #include <stdarg.h>
         1947 // #include <string.h>
         1948 // #include "plan9.h"
         1949 // #include "utf.h"
         1950 
         1951 char*
         1952 utfrune(char *s, long c)
         1953 {
         1954         long c1;
         1955         Rune r;
         1956         int n;
         1957 
         1958         if(c < Runesync)                /* not part of utf sequence */
         1959                 return strchr(s, c);
         1960 
         1961         for(;;) {
         1962                 c1 = *(uchar*)s;
         1963                 if(c1 < Runeself) {        /* one byte rune */
         1964                         if(c1 == 0)
         1965                                 return 0;
         1966                         if(c1 == c)
         1967                                 return s;
         1968                         s++;
         1969                         continue;
         1970                 }
         1971                 n = chartorune(&r, s);
         1972                 if(r == c)
         1973                         return s;
         1974                 s += n;
         1975         }
         1976 }
         1977 /* -------------- utfutf.c --------------- */
         1978 /*
         1979  * The authors of this software are Rob Pike and Ken Thompson.
         1980  *              Copyright (c) 2002 by Lucent Technologies.
         1981  * Permission to use, copy, modify, and distribute this software for any
         1982  * purpose without fee is hereby granted, provided that this entire notice
         1983  * is included in all copies of any software which is or includes a copy
         1984  * or modification of this software and in all copies of the supporting
         1985  * documentation for such software.
         1986  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
         1987  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
         1988  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
         1989  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
         1990  */
         1991 // #include <stdarg.h>
         1992 // #include <string.h>
         1993 // #include "plan9.h"
         1994 // #include "utf.h"
         1995 
         1996 
         1997 /*
         1998  * Return pointer to first occurrence of s2 in s1,
         1999  * 0 if none
         2000  */
         2001 char*
         2002 utfutf(char *s1, char *s2)
         2003 {
         2004         char *p;
         2005         long f, n1, n2;
         2006         Rune r;
         2007 
         2008         n1 = chartorune(&r, s2);
         2009         f = r;
         2010         if(f <= Runesync)                /* represents self */
         2011                 return strstr(s1, s2);
         2012 
         2013         n2 = strlen(s2);
         2014         for(p=s1; (p=utfrune(p, f)); p+=n1)
         2015                 if(strncmp(p, s2, n2) == 0)
         2016                         return p;
         2017         return 0;
         2018 }