1b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*
2b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
3b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
4b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Licensed under the Apache License, Version 2.0 (the "License");
5b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * you may not use this file except in compliance with the License.
6b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * You may obtain a copy of the License at
7b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
8b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *     http://www.apache.org/licenses/LICENSE-2.0
9b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
10b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Unless required by applicable law or agreed to in writing, software
11b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * distributed under the License is distributed on an "AS IS" BASIS,
12b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * See the License for the specific language governing permissions and
14b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * limitations under the License.
15b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
16b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
17b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @file picobase.c
18b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
19b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
20b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * All rights reserved.
21b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
22b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * History:
23b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - 2009-04-20 -- initial version
24b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
25b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
26b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
27b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoos.h"
28b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodbg.h"
29b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodefs.h"
30b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picobase.h"
31b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
32b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus
33b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern "C" {
34b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
35b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if 0
36b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
37b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
38b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
39b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
40b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @addtogroup picobase
41b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
42b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @b Unicode_UTF8_functions
43b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
44b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * UTF8
45b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * scalar value                1st Byte    2nd Byte    3rd Byte    4th Byte
46b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 00000000 0xxxxxxx           0xxxxxxx
47b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 00000yyy yyxxxxxx           110yyyyy    10xxxxxx
48b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * zzzzyyyy yyxxxxxx           1110zzzz    10yyyyyy    10xxxxxx
49b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 000uuuuu zzzzyyyy yyxxxxx   11110uuu    10uuzzzz    10yyyyyy    10xxxxxx
50b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
51b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
52b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_int32 picobase_utf8_length(const picoos_uint8 *utf8str,
53b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  const picoos_uint16 maxlen) {
54b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
55b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i;
56b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 len;
57b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 follow;
58b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 ok;
59b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
60b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    ok = TRUE;
61b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    i = 0;
62b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    len = 0;
63b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    follow = 0;
64b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while (ok && (i < maxlen) && (utf8str[i] != '\000')) {
65b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (follow > 0) {
66b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if ((utf8str[i] >= (picoos_uint8)'\200') &&
67b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                (utf8str[i] < (picoos_uint8)'\300')) {
68b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                follow--;
69b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
70b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                ok = FALSE;
71b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
72b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else if (utf8str[i] < (picoos_uint8)'\200') {
73b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            len++;
74b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else if (utf8str[i] >= (picoos_uint8)'\370') {
75b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            ok = FALSE;
76b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else if (utf8str[i] >= (picoos_uint8)'\360') {
77b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            follow = 3;
78b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            len++;
79b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else if (utf8str[i] >= (picoos_uint8)'\340') {
80b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            follow = 2;
81b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            len++;
82b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else if (utf8str[i] >= (picoos_uint8)'\300') {
83b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            follow = 1;
84b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            len++;
85b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {
86b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            ok = FALSE;
87b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
88b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        i++;
89b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
90b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (ok) {
91b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return len;
92b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
93b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return -1;
94b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
95b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
96b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
97b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
98b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint32 base_utf32_lowercase (picoos_uint32 utf32)
99b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 lc;
102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    lc = utf32;
104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (((utf32 >= 65313) && (utf32 <= 65338))) {
105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        lc = (utf32 + 32);
106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if (((utf32 >= 66560) && (utf32 <= 66599))) {
107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        lc = (utf32 + 40);
108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if (((utf32 >= 7680) && (utf32 <= 9423))) {
109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        switch (utf32) {
110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7680:   case 7681:   case 7682:   case 7683:   case 7684:   case 7685:   case 7686:   case 7687:   case 7688:   case 7689:
111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7690:   case 7691:   case 7692:   case 7693:   case 7694:   case 7695:   case 7696:   case 7697:   case 7698:   case 7699:   case 7700:   case 7701:
112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7702:   case 7703:   case 7704:   case 7705:   case 7706:   case 7707:   case 7708:   case 7709:   case 7710:   case 7711:   case 7712:   case 7713:
113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7714:   case 7715:   case 7716:   case 7717:   case 7718:   case 7719:   case 7720:   case 7721:   case 7722:   case 7723:   case 7724:   case 7725:
114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7726:   case 7727:   case 7728:   case 7729:   case 7730:   case 7731:   case 7732:   case 7733:   case 7734:   case 7735:   case 7736:   case 7737:
115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7738:   case 7739:   case 7740:   case 7741:   case 7742:   case 7743:   case 7744:   case 7745:   case 7746:   case 7747:   case 7748:   case 7749:
116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7750:   case 7751:   case 7752:   case 7753:   case 7754:   case 7755:   case 7756:   case 7757:   case 7758:   case 7759:   case 7760:   case 7761:
117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7762:   case 7763:   case 7764:   case 7765:   case 7766:   case 7767:   case 7768:   case 7769:   case 7770:   case 7771:   case 7772:   case 7773:
118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7774:   case 7775:   case 7776:   case 7777:   case 7778:   case 7779:   case 7780:   case 7781:   case 7782:   case 7783:   case 7784:   case 7785:
119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7786:   case 7787:   case 7788:   case 7789:   case 7790:   case 7791:   case 7792:   case 7793:   case 7794:   case 7795:   case 7796:   case 7797:
120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7798:   case 7799:   case 7800:   case 7801:   case 7802:   case 7803:   case 7804:   case 7805:   case 7806:   case 7807:   case 7808:   case 7809:
121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7810:   case 7811:   case 7812:   case 7813:   case 7814:   case 7815:   case 7816:   case 7817:   case 7818:   case 7819:   case 7820:   case 7821:
122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7822:   case 7823:   case 7824:   case 7825:   case 7826:   case 7827:   case 7828:   case 7840:   case 7841:   case 7842:   case 7843:
123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7844:   case 7845:   case 7846:   case 7847:   case 7848:   case 7849:   case 7850:   case 7851:   case 7852:   case 7853:   case 7854:   case 7855:
124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7856:   case 7857:   case 7858:   case 7859:   case 7860:   case 7861:   case 7862:   case 7863:   case 7864:   case 7865:   case 7866:   case 7867:
125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7868:   case 7869:   case 7870:   case 7871:   case 7872:   case 7873:   case 7874:   case 7875:   case 7876:   case 7877:   case 7878:   case 7879:
126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7880:   case 7881:   case 7882:   case 7883:   case 7884:   case 7885:   case 7886:   case 7887:   case 7888:   case 7889:   case 7890:   case 7891:
127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7892:   case 7893:   case 7894:   case 7895:   case 7896:   case 7897:   case 7898:   case 7899:   case 7900:   case 7901:   case 7902:   case 7903:
128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7904:   case 7905:   case 7906:   case 7907:   case 7908:   case 7909:   case 7910:   case 7911:   case 7912:   case 7913:   case 7914:   case 7915:
129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7916:   case 7917:   case 7918:   case 7919:   case 7920:   case 7921:   case 7922:   case 7923:   case 7924:   case 7925:   case 7926:   case 7927:
130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7928:
131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if ( !(((utf32) % 2 == 1))) {
132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    lc = (utf32 + 1);
133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7944:   case 7945:   case 7946:   case 7947:   case 7948:   case 7949:   case 7950:   case 7951:   case 7960:
136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7961:   case 7962:   case 7963:   case 7964:   case 7965:   case 7976:   case 7977:   case 7978:   case 7979:   case 7980:   case 7981:
137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7982:   case 7983:   case 7992:   case 7993:   case 7994:   case 7995:   case 7996:   case 7997:   case 7998:   case 7999:
138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8008:   case 8009:   case 8010:   case 8011:   case 8012:   case 8013:   case 8040:   case 8041:   case 8042:   case 8043:   case 8044:
139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8045:   case 8046:   case 8047:   case 8072:   case 8073:   case 8074:   case 8075:   case 8076:   case 8077:   case 8078:   case 8079:
140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8088:   case 8089:   case 8090:   case 8091:   case 8092:   case 8093:   case 8094:   case 8095:   case 8104:   case 8105:
141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8106:   case 8107:   case 8108:   case 8109:   case 8110:   case 8111:
142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = (utf32 - 8);
143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8025:   case 8026:   case 8027:   case 8028:   case 8029:   case 8030:   case 8031:
145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (((utf32) % 2 == 1)) {
146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    lc = (utf32 - 8);
147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8544:   case 8545:   case 8546:   case 8547:   case 8548:   case 8549:   case 8550:   case 8551:   case 8552:   case 8553:
150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8554:   case 8555:   case 8556:   case 8557:   case 8558:   case 8559:
151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = (utf32 + 16);
152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 9398:   case 9399:   case 9400:   case 9401:   case 9402:   case 9403:   case 9404:   case 9405:   case 9406:   case 9407:
154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 9408:   case 9409:   case 9410:   case 9411:   case 9412:   case 9413:   case 9414:   case 9415:   case 9416:   case 9417:   case 9418:   case 9419:
155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 9420:   case 9421:   case 9422:   case 9423:
156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = (utf32 + 26);
157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8120:
159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8112;
160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8121:
162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8113;
163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8122:
165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8048;
166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8123:
168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8049;
169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8124:
171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8115;
172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8136:
174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8050;
175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8137:
177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8051;
178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8138:
180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8052;
181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8139:
183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8053;
184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8140:
186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8131;
187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8152:
189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8144;
190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8153:
192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8145;
193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8154:
195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8054;
196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8155:
198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8055;
199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8168:
201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8160;
202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8169:
204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8161;
205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8170:
207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8058;
208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8171:
210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8059;
211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8172:
213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8165;
214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8184:
216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8056;
217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8185:
219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8057;
220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8186:
222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8060;
223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8187:
225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8061;
226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8188:
228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8179;
229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8486:
231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 969;
232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8490:
234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 107;
235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8491:
237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 229;
238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        default:
240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        switch (utf32) {
244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 65:   case 66:   case 67:   case 68:   case 69:   case 70:   case 71:   case 72:   case 73:   case 74:
245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 75:   case 76:   case 77:   case 78:   case 79:   case 80:   case 81:   case 82:   case 83:   case 84:   case 85:   case 86:
246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 87:   case 88:   case 89:   case 90:   case 192:   case 193:   case 194:   case 195:   case 196:   case 197:   case 198:
247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 199:   case 200:   case 201:   case 202:   case 203:   case 204:   case 205:   case 206:   case 207:   case 208:   case 209:   case 210:
248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 211:   case 212:   case 213:   case 214:   case 216:   case 217:   case 218:   case 219:   case 220:   case 221:   case 222:
249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 913:   case 914:   case 915:   case 916:   case 917:   case 918:   case 919:   case 920:   case 921:   case 922:   case 923:
250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 924:   case 925:   case 926:   case 927:   case 928:   case 929:   case 931:   case 932:   case 933:   case 934:   case 935:
251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 936:   case 937:   case 938:   case 939:   case 1040:   case 1041:   case 1042:   case 1043:   case 1044:   case 1045:   case 1046:
252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1047:   case 1048:   case 1049:   case 1050:   case 1051:   case 1052:   case 1053:   case 1054:   case 1055:   case 1056:   case 1057:   case 1058:
253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1059:   case 1060:   case 1061:   case 1062:   case 1063:   case 1064:   case 1065:   case 1066:   case 1067:   case 1068:   case 1069:   case 1070:
254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1071:
255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = (utf32 + 32);
256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 256:   case 257:   case 258:   case 259:   case 260:   case 261:   case 262:   case 263:   case 264:   case 265:
258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 266:   case 267:   case 268:   case 269:   case 270:   case 271:   case 272:   case 273:   case 274:   case 275:   case 276:   case 277:
259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 278:   case 279:   case 280:   case 281:   case 282:   case 283:   case 284:   case 285:   case 286:   case 287:   case 288:   case 289:
260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 290:   case 291:   case 292:   case 293:   case 294:   case 295:   case 296:   case 297:   case 298:   case 299:   case 300:   case 301:
261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 302:   case 303:   case 305:   case 306:   case 307:   case 308:   case 309:   case 310:   case 330:   case 331:
262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 332:   case 333:   case 334:   case 335:   case 336:   case 337:   case 338:   case 339:   case 340:   case 341:   case 342:   case 343:
263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 344:   case 345:   case 346:   case 347:   case 348:   case 349:   case 350:   case 351:   case 352:   case 353:   case 354:   case 355:
264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 356:   case 357:   case 358:   case 359:   case 360:   case 361:   case 362:   case 363:   case 364:   case 365:   case 366:   case 367:
265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 368:   case 369:   case 370:   case 371:   case 372:   case 373:   case 374:   case 416:   case 417:   case 418:   case 419:
266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 420:   case 478:   case 479:   case 480:   case 481:   case 482:   case 483:   case 484:   case 485:   case 486:   case 487:
267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 488:   case 489:   case 490:   case 491:   case 492:   case 493:   case 494:   case 504:   case 505:   case 506:   case 507:
268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 508:   case 509:   case 510:   case 511:   case 512:   case 513:   case 514:   case 515:   case 516:   case 517:   case 518:   case 519:
269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 520:   case 521:   case 522:   case 523:   case 524:   case 525:   case 526:   case 527:   case 528:   case 529:   case 530:   case 531:
270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 532:   case 533:   case 534:   case 535:   case 536:   case 537:   case 538:   case 539:   case 540:   case 541:   case 542:
271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 546:   case 547:   case 548:   case 549:   case 550:   case 551:   case 552:   case 553:   case 554:   case 555:   case 556:   case 557:
272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 558:   case 559:   case 560:   case 561:   case 562:   case 984:   case 985:   case 986:   case 987:   case 988:   case 989:
273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 990:   case 991:   case 992:   case 993:   case 994:   case 995:   case 996:   case 997:   case 998:   case 999:   case 1000:   case 1001:
274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1002:   case 1003:   case 1004:   case 1005:   case 1006:   case 1120:   case 1121:   case 1122:   case 1123:   case 1124:   case 1125:
275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1126:   case 1127:   case 1128:   case 1129:   case 1130:   case 1131:   case 1132:   case 1133:   case 1134:   case 1135:   case 1136:   case 1137:
276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1138:   case 1139:   case 1140:   case 1141:   case 1142:   case 1143:   case 1144:   case 1145:   case 1146:   case 1147:   case 1148:   case 1149:
277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1150:   case 1151:   case 1152:   case 1162:   case 1163:   case 1164:   case 1165:   case 1166:   case 1167:   case 1168:   case 1169:
278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1170:   case 1171:   case 1172:   case 1173:   case 1174:   case 1175:   case 1176:   case 1177:   case 1178:   case 1179:   case 1180:   case 1181:
279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1182:   case 1183:   case 1184:   case 1185:   case 1186:   case 1187:   case 1188:   case 1189:   case 1190:   case 1191:   case 1192:   case 1193:
280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1194:   case 1195:   case 1196:   case 1197:   case 1198:   case 1199:   case 1200:   case 1201:   case 1202:   case 1203:   case 1204:   case 1205:
281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1206:   case 1207:   case 1208:   case 1209:   case 1210:   case 1211:   case 1212:   case 1213:   case 1214:   case 1232:   case 1233:
282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1234:   case 1235:   case 1236:   case 1237:   case 1238:   case 1239:   case 1240:   case 1241:   case 1242:   case 1243:   case 1244:   case 1245:
283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1246:   case 1247:   case 1248:   case 1249:   case 1250:   case 1251:   case 1252:   case 1253:   case 1254:   case 1255:   case 1256:   case 1257:
284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1258:   case 1259:   case 1260:   case 1261:   case 1262:   case 1263:   case 1264:   case 1265:   case 1266:   case 1267:   case 1268:
285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1280:   case 1281:   case 1282:   case 1283:   case 1284:   case 1285:   case 1286:   case 1287:   case 1288:   case 1289:   case 1290:   case 1291:
286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1292:   case 1293:   case 1294:
287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if ( !(((utf32) % 2 == 1))) {
288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    lc = (utf32 + 1);
289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 313:   case 314:   case 315:   case 316:   case 317:   case 318:   case 319:   case 320:   case 321:   case 322:
292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 323:   case 324:   case 325:   case 326:   case 327:   case 377:   case 378:   case 379:   case 380:   case 381:
293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 459:   case 460:   case 461:   case 462:   case 463:   case 464:   case 465:   case 466:   case 467:   case 468:   case 469:   case 470:
294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 471:   case 472:   case 473:   case 474:   case 475:   case 1217:   case 1218:   case 1219:   case 1220:   case 1221:   case 1222:
295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1223:   case 1224:   case 1225:   case 1226:   case 1227:   case 1228:   case 1229:
296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (((utf32) % 2 == 1)) {
297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    lc = (utf32 + 1);
298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1024:   case 1025:   case 1026:   case 1027:   case 1028:   case 1029:   case 1030:   case 1031:   case 1032:   case 1033:
301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1034:   case 1035:   case 1036:   case 1037:   case 1038:   case 1039:
302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = (utf32 + 80);
303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1329:   case 1330:   case 1331:   case 1332:   case 1333:   case 1334:   case 1335:   case 1336:   case 1337:   case 1338:
305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1339:   case 1340:   case 1341:   case 1342:   case 1343:   case 1344:   case 1345:   case 1346:   case 1347:   case 1348:   case 1349:   case 1350:
306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1351:   case 1352:   case 1353:   case 1354:   case 1355:   case 1356:   case 1357:   case 1358:   case 1359:   case 1360:   case 1361:   case 1362:
307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1363:   case 1364:   case 1365:   case 1366:
308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = (utf32 + 48);
309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 304:
311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 105;
312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 376:
314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 255;
315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 385:
317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 595;
318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 386:
320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 387;
321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 388:
323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 389;
324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 390:
326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 596;
327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 391:
329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 392;
330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 393:
332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 598;
333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 394:
335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 599;
336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 395:
338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 396;
339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 398:
341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 477;
342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 399:
344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 601;
345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 400:
347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 603;
348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 401:
350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 402;
351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 403:
353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 608;
354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 404:
356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 611;
357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 406:
359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 617;
360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 407:
362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 616;
363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 408:
365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 409;
366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 412:
368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 623;
369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 413:
371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 626;
372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 415:
374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 629;
375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 422:
377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 640;
378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 423:
380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 424;
381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 425:
383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 643;
384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 428:
386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 429;
387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 430:
389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 648;
390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 431:
392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 432;
393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 433:
395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 650;
396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 434:
398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 651;
399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 435:
401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 436;
402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 437:
404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 438;
405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 439:
407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 658;
408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 440:
410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 441;
411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 444:
413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 445;
414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 452:
416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 454;
417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 453:
419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 454;
420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 455:
422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 457;
423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 456:
425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 457;
426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 458:
428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 460;
429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 497:
431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 499;
432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 498:
434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 499;
435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 500:
437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 501;
438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 502:
440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 405;
441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 503:
443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 447;
444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 544:
446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 414;
447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 902:
449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 940;
450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 904:
452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 941;
453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 905:
455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 942;
456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 906:
458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 943;
459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 908:
461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 972;
462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 910:
464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 973;
465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 911:
467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 974;
468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1012:
470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 952;
471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1015:
473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 1016;
474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1017:
476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 1010;
477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1018:
479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 1019;
480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1272:
482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 1273;
483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        default:
485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return lc;
489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Converts utf32 input to uppercase
493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    utf32 : a single character encoded in UTF32
494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return   a single uppercase character encoded in UTF32
495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint32 base_utf32_uppercase (picoos_uint32 utf32)
497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 lc;
499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    lc = utf32;
501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (((utf32 >= 65345) && (utf32 <= 65370))) {
502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        lc = (utf32 - 32);
503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if (((utf32 >= 66600) && (utf32 <= 66639))) {
504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        lc = (utf32 - 40);
505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if (((utf32 >= 7681) && (utf32 <= 9449))) {
506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        switch (utf32) {
507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7681:   case 7682:   case 7683:   case 7684:   case 7685:   case 7686:   case 7687:   case 7688:   case 7689:   case 7690:
508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7691:   case 7692:   case 7693:   case 7694:   case 7695:   case 7696:   case 7697:   case 7698:   case 7699:   case 7700:   case 7701:   case 7702:
509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7703:   case 7704:   case 7705:   case 7706:   case 7707:   case 7708:   case 7709:   case 7710:   case 7711:   case 7712:   case 7713:   case 7714:
510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7715:   case 7716:   case 7717:   case 7718:   case 7719:   case 7720:   case 7721:   case 7722:   case 7723:   case 7724:   case 7725:   case 7726:
511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7727:   case 7728:   case 7729:   case 7730:   case 7731:   case 7732:   case 7733:   case 7734:   case 7735:   case 7736:   case 7737:   case 7738:
512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7739:   case 7740:   case 7741:   case 7742:   case 7743:   case 7744:   case 7745:   case 7746:   case 7747:   case 7748:   case 7749:   case 7750:
513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7751:   case 7752:   case 7753:   case 7754:   case 7755:   case 7756:   case 7757:   case 7758:   case 7759:   case 7760:   case 7761:   case 7762:
514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7763:   case 7764:   case 7765:   case 7766:   case 7767:   case 7768:   case 7769:   case 7770:   case 7771:   case 7772:   case 7773:   case 7774:
515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7775:   case 7776:   case 7777:   case 7778:   case 7779:   case 7780:   case 7781:   case 7782:   case 7783:   case 7784:   case 7785:   case 7786:
516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7787:   case 7788:   case 7789:   case 7790:   case 7791:   case 7792:   case 7793:   case 7794:   case 7795:   case 7796:   case 7797:   case 7798:
517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7799:   case 7800:   case 7801:   case 7802:   case 7803:   case 7804:   case 7805:   case 7806:   case 7807:   case 7808:   case 7809:   case 7810:
518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7811:   case 7812:   case 7813:   case 7814:   case 7815:   case 7816:   case 7817:   case 7818:   case 7819:   case 7820:   case 7821:   case 7822:
519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7823:   case 7824:   case 7825:   case 7826:   case 7827:   case 7828:   case 7829:   case 7841:   case 7842:   case 7843:   case 7844:
520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7845:   case 7846:   case 7847:   case 7848:   case 7849:   case 7850:   case 7851:   case 7852:   case 7853:   case 7854:   case 7855:   case 7856:
521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7857:   case 7858:   case 7859:   case 7860:   case 7861:   case 7862:   case 7863:   case 7864:   case 7865:   case 7866:   case 7867:   case 7868:
522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7869:   case 7870:   case 7871:   case 7872:   case 7873:   case 7874:   case 7875:   case 7876:   case 7877:   case 7878:   case 7879:   case 7880:
523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7881:   case 7882:   case 7883:   case 7884:   case 7885:   case 7886:   case 7887:   case 7888:   case 7889:   case 7890:   case 7891:   case 7892:
524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7893:   case 7894:   case 7895:   case 7896:   case 7897:   case 7898:   case 7899:   case 7900:   case 7901:   case 7902:   case 7903:   case 7904:
525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7905:   case 7906:   case 7907:   case 7908:   case 7909:   case 7910:   case 7911:   case 7912:   case 7913:   case 7914:   case 7915:   case 7916:
526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7917:   case 7918:   case 7919:   case 7920:   case 7921:   case 7922:   case 7923:   case 7924:   case 7925:   case 7926:   case 7927:   case 7928:
527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7929:
528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (((utf32) % 2 == 1)) {
529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    lc = (utf32 - 1);
530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7936:   case 7937:   case 7938:   case 7939:   case 7940:   case 7941:   case 7942:   case 7943:   case 7952:
533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7953:   case 7954:   case 7955:   case 7956:   case 7957:   case 7968:   case 7969:   case 7970:   case 7971:   case 7972:   case 7973:
534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7974:   case 7975:   case 7984:   case 7985:   case 7986:   case 7987:   case 7988:   case 7989:   case 7990:   case 7991:
535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8000:   case 8001:   case 8002:   case 8003:   case 8004:   case 8005:   case 8032:   case 8033:   case 8034:   case 8035:   case 8036:
536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8037:   case 8038:   case 8039:   case 8064:   case 8065:   case 8066:   case 8067:   case 8068:   case 8069:   case 8070:   case 8071:
537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8080:   case 8081:   case 8082:   case 8083:   case 8084:   case 8085:   case 8086:   case 8087:   case 8096:   case 8097:
538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8098:   case 8099:   case 8100:   case 8101:   case 8102:   case 8103:
539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = (utf32 + 8);
540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8017:   case 8018:   case 8019:   case 8020:   case 8021:   case 8022:   case 8023:
542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (((utf32) % 2 == 1)) {
543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    lc = (utf32 + 8);
544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8560:   case 8561:   case 8562:   case 8563:   case 8564:   case 8565:   case 8566:   case 8567:   case 8568:   case 8569:
547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8570:   case 8571:   case 8572:   case 8573:   case 8574:   case 8575:
548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = (utf32 - 16);
549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 9424:   case 9425:   case 9426:   case 9427:   case 9428:   case 9429:   case 9430:   case 9431:   case 9432:   case 9433:
551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 9434:   case 9435:   case 9436:   case 9437:   case 9438:   case 9439:   case 9440:   case 9441:   case 9442:   case 9443:   case 9444:   case 9445:
552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 9446:   case 9447:   case 9448:   case 9449:
553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = (utf32 - 26);
554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7835:
556b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 7776;
557b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
558b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8048:
559b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8122;
560b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
561b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8049:
562b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8123;
563b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
564b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8050:
565b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8136;
566b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
567b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8051:
568b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8137;
569b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
570b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8052:
571b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8138;
572b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
573b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8053:
574b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8139;
575b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
576b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8054:
577b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8154;
578b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
579b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8055:
580b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8155;
581b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
582b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8056:
583b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8184;
584b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
585b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8057:
586b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8185;
587b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
588b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8058:
589b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8170;
590b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
591b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8059:
592b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8171;
593b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
594b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8060:
595b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8186;
596b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
597b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8061:
598b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8187;
599b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
600b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8112:
601b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8120;
602b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
603b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8113:
604b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8121;
605b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
606b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8115:
607b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8124;
608b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
609b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8126:
610b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 921;
611b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
612b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8131:
613b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8140;
614b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
615b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8144:
616b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8152;
617b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
618b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8145:
619b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8153;
620b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
621b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8160:
622b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8168;
623b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
624b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8161:
625b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8169;
626b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
627b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8165:
628b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8172;
629b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
630b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8179:
631b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 8188;
632b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
633b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        default:
634b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
635b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
636b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
637b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        switch (utf32) {
638b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 97:   case 98:   case 99:   case 100:   case 101:   case 102:   case 103:   case 104:   case 105:   case 106:
639b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 107:   case 108:   case 109:   case 110:   case 111:   case 112:   case 113:   case 114:   case 115:   case 116:   case 117:   case 118:
640b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 119:   case 120:   case 121:   case 122:   case 224:   case 225:   case 226:   case 227:   case 228:   case 229:   case 230:
641b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 231:   case 232:   case 233:   case 234:   case 235:   case 236:   case 237:   case 238:   case 239:   case 240:   case 241:   case 242:
642b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 243:   case 244:   case 245:   case 246:   case 247:   case 248:   case 249:   case 250:   case 251:   case 252:   case 253:   case 254:
643b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 945:   case 946:   case 947:   case 948:   case 949:   case 950:   case 951:   case 952:   case 953:   case 954:   case 955:
644b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 956:   case 957:   case 958:   case 959:   case 960:   case 961:   case 963:   case 964:   case 965:   case 966:   case 967:
645b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 968:   case 969:   case 970:   case 971:   case 1072:   case 1073:   case 1074:   case 1075:   case 1076:   case 1077:   case 1078:
646b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1079:   case 1080:   case 1081:   case 1082:   case 1083:   case 1084:   case 1085:   case 1086:   case 1087:   case 1088:   case 1089:   case 1090:
647b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1091:   case 1092:   case 1093:   case 1094:   case 1095:   case 1096:   case 1097:   case 1098:   case 1099:   case 1100:   case 1101:   case 1102:
648b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1103:
649b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if ((utf32 != 247)) {
650b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    lc = (utf32 - 32);
651b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
652b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
653b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 257:   case 258:   case 259:   case 260:   case 261:   case 262:   case 263:   case 264:   case 265:   case 266:
654b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 267:   case 268:   case 269:   case 270:   case 271:   case 272:   case 273:   case 274:   case 275:   case 276:   case 277:   case 278:
655b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 279:   case 280:   case 281:   case 282:   case 283:   case 284:   case 285:   case 286:   case 287:   case 288:   case 289:   case 290:
656b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 291:   case 292:   case 293:   case 294:   case 295:   case 296:   case 297:   case 298:   case 299:   case 300:   case 301:   case 302:
657b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 303:   case 304:   case 306:   case 307:   case 308:   case 309:   case 310:   case 311:   case 331:   case 332:
658b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 333:   case 334:   case 335:   case 336:   case 337:   case 338:   case 339:   case 340:   case 341:   case 342:   case 343:   case 344:
659b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 345:   case 346:   case 347:   case 348:   case 349:   case 350:   case 351:   case 352:   case 353:   case 354:   case 355:   case 356:
660b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 357:   case 358:   case 359:   case 360:   case 361:   case 362:   case 363:   case 364:   case 365:   case 366:   case 367:   case 368:
661b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 369:   case 370:   case 371:   case 372:   case 373:   case 374:   case 375:   case 417:   case 418:   case 419:   case 420:
662b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 421:   case 481:   case 482:   case 483:   case 484:   case 485:   case 486:   case 487:   case 488:   case 489:   case 490:
663b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 491:   case 492:   case 493:   case 494:   case 495:   case 507:   case 508:   case 509:   case 510:   case 511:
664b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 513:   case 514:   case 515:   case 516:   case 517:   case 518:   case 519:   case 520:   case 521:   case 522:   case 523:   case 524:
665b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 525:   case 526:   case 527:   case 528:   case 529:   case 530:   case 531:   case 532:   case 533:   case 534:   case 535:   case 536:
666b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 537:   case 538:   case 539:   case 540:   case 541:   case 542:   case 543:   case 544:   case 546:   case 547:   case 548:
667b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 549:   case 550:   case 551:   case 552:   case 553:   case 554:   case 555:   case 556:   case 557:   case 558:   case 559:   case 560:
668b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 561:   case 562:   case 563:   case 985:   case 986:   case 987:   case 988:   case 989:   case 990:   case 991:   case 992:
669b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 993:   case 994:   case 995:   case 996:   case 997:   case 998:   case 999:   case 1000:   case 1001:   case 1002:   case 1003:   case 1004:
670b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1005:   case 1006:   case 1007:   case 1121:   case 1122:   case 1123:   case 1124:   case 1125:   case 1126:   case 1127:   case 1128:
671b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1129:   case 1130:   case 1131:   case 1132:   case 1133:   case 1134:   case 1135:   case 1136:   case 1137:   case 1138:   case 1139:   case 1140:
672b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1141:   case 1142:   case 1143:   case 1144:   case 1145:   case 1146:   case 1147:   case 1148:   case 1149:   case 1150:   case 1151:   case 1152:
673b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1153:   case 1163:   case 1164:   case 1165:   case 1166:   case 1167:   case 1168:   case 1169:   case 1170:   case 1171:   case 1172:
674b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1173:   case 1174:   case 1175:   case 1176:   case 1177:   case 1178:   case 1179:   case 1180:   case 1181:   case 1182:   case 1183:   case 1184:
675b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1185:   case 1186:   case 1187:   case 1188:   case 1189:   case 1190:   case 1191:   case 1192:   case 1193:   case 1194:   case 1195:   case 1196:
676b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1197:   case 1198:   case 1199:   case 1200:   case 1201:   case 1202:   case 1203:   case 1204:   case 1205:   case 1206:   case 1207:   case 1208:
677b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1209:   case 1210:   case 1211:   case 1212:   case 1213:   case 1214:   case 1215:   case 1233:   case 1234:   case 1235:   case 1236:
678b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1237:   case 1238:   case 1239:   case 1240:   case 1241:   case 1242:   case 1243:   case 1244:   case 1245:   case 1246:   case 1247:   case 1248:
679b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1249:   case 1250:   case 1251:   case 1252:   case 1253:   case 1254:   case 1255:   case 1256:   case 1257:   case 1258:   case 1259:   case 1260:
680b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1261:   case 1262:   case 1263:   case 1264:   case 1265:   case 1266:   case 1267:   case 1268:   case 1269:   case 1281:   case 1282:
681b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1283:   case 1284:   case 1285:   case 1286:   case 1287:   case 1288:   case 1289:   case 1290:   case 1291:   case 1292:   case 1293:   case 1294:
682b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1295:
683b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (((utf32) % 2 == 1)) {
684b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    lc = (utf32 - 1);
685b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
686b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
687b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 314:   case 315:   case 316:   case 317:   case 318:   case 319:   case 320:   case 321:   case 322:   case 323:
688b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 324:   case 325:   case 326:   case 327:   case 328:   case 378:   case 379:   case 380:   case 381:   case 382:
689b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 464:   case 465:   case 466:   case 467:   case 468:   case 469:   case 470:   case 471:   case 472:   case 473:   case 474:   case 475:
690b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 476:   case 1218:   case 1219:   case 1220:   case 1221:   case 1222:   case 1223:   case 1224:   case 1225:   case 1226:   case 1227:
691b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1228:   case 1229:   case 1230:
692b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if ( !(((utf32) % 2 == 1))) {
693b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    lc = (utf32 - 1);
694b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
695b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
696b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1104:   case 1105:   case 1106:   case 1107:   case 1108:   case 1109:   case 1110:   case 1111:   case 1112:   case 1113:
697b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1114:   case 1115:   case 1116:   case 1117:   case 1118:   case 1119:
698b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = (utf32 - 80);
699b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
700b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1377:   case 1378:   case 1379:   case 1380:   case 1381:   case 1382:   case 1383:   case 1384:   case 1385:   case 1386:
701b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1387:   case 1388:   case 1389:   case 1390:   case 1391:   case 1392:   case 1393:   case 1394:   case 1395:   case 1396:   case 1397:   case 1398:
702b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1399:   case 1400:   case 1401:   case 1402:   case 1403:   case 1404:   case 1405:   case 1406:   case 1407:   case 1408:   case 1409:   case 1410:
703b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1411:   case 1412:   case 1413:   case 1414:
704b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = (utf32 - 48);
705b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
706b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 181:
707b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 924;
708b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
709b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 255:
710b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 376;
711b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
712b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 305:
713b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 73;
714b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
715b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 383:
716b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 83;
717b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
718b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 387:
719b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 386;
720b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
721b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 389:
722b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 388;
723b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
724b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 392:
725b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 391;
726b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
727b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 396:
728b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 395;
729b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
730b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 402:
731b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 401;
732b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
733b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 405:
734b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 502;
735b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
736b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 409:
737b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 408;
738b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
739b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 414:
740b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 544;
741b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
742b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 424:
743b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 423;
744b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
745b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 429:
746b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 428;
747b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
748b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 432:
749b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 431;
750b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
751b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 436:
752b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 435;
753b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
754b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 438:
755b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 437;
756b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
757b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 441:
758b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 440;
759b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
760b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 445:
761b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 444;
762b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
763b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 447:
764b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 503;
765b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
766b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 453:
767b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 452;
768b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
769b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 454:
770b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 452;
771b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
772b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 456:
773b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 455;
774b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
775b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 457:
776b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 455;
777b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
778b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 459:
779b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 458;
780b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
781b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 460:
782b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 458;
783b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
784b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 462:
785b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 461;
786b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
787b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 477:
788b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 398;
789b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
790b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 479:
791b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 478;
792b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
793b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 498:
794b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 497;
795b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
796b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 499:
797b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 497;
798b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
799b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 501:
800b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 500;
801b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
802b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 505:
803b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 504;
804b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
805b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 595:
806b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 385;
807b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
808b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 596:
809b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 390;
810b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
811b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 598:
812b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 393;
813b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
814b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 599:
815b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 394;
816b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
817b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 601:
818b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 399;
819b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
820b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 603:
821b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 400;
822b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
823b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 608:
824b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 403;
825b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
826b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 611:
827b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 404;
828b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
829b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 616:
830b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 407;
831b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
832b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 617:
833b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 406;
834b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
835b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 623:
836b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 412;
837b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
838b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 626:
839b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 413;
840b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
841b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 629:
842b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 415;
843b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
844b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 640:
845b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 422;
846b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
847b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 643:
848b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 425;
849b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
850b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 648:
851b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 430;
852b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
853b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 650:
854b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 433;
855b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
856b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 651:
857b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 434;
858b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
859b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 658:
860b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 439;
861b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
862b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 837:
863b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 921;
864b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
865b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 940:
866b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 902;
867b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
868b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 941:
869b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 904;
870b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
871b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 942:
872b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 905;
873b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
874b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 943:
875b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 906;
876b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
877b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 962:
878b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 931;
879b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
880b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 972:
881b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 908;
882b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
883b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 973:
884b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 910;
885b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
886b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 974:
887b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 911;
888b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
889b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 976:
890b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 914;
891b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
892b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 977:
893b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 920;
894b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
895b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 981:
896b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 934;
897b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
898b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 982:
899b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 928;
900b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
901b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1008:
902b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 922;
903b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
904b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1009:
905b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 929;
906b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
907b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1010:
908b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 1017;
909b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
910b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1013:
911b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 917;
912b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
913b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1016:
914b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 1015;
915b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
916b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1019:
917b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 1018;
918b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
919b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1273:
920b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lc = 1272;
921b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
922b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        default:
923b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
924b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
925b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
926b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return lc;
927b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
928b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
929b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
930b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Gets the UTF8 character 'utf8char' from the UTF8 string 'utf8str' from
931b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *             position 'pos'
932b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    utf8str: utf8 string
933b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    pos: position from where the utf8 character is copied
934b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *            (also output set as position of the next utf8 character in the utf8 string)
935b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    utf8char: zero terminated utf8 character containing 1 to 4 bytes (output)
936b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
937b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void picobase_get_utf8char (picoos_uint8 utf8[], picoos_int32 * pos, picobase_utf8char utf8char)
938b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
939b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
940b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    int i;
941b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    int l;
942b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
943b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    utf8char[0] = 0;
944b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    l = picobase_det_utf8_length(utf8[*pos]);
945b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    i = 0;
946b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((((i < l) && (i < PICOBASE_UTF8_MAXLEN)) && (utf8[*pos] != 0))) {
947b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        utf8char[i] = utf8[*pos];
948b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (*pos)++;
949b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        i++;
950b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
951b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    utf8char[i] = 0;
952b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
953b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
954b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
955b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picobase_get_next_utf8char(const picoos_uint8 *utf8s,
956b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        const picoos_uint32 utf8slenmax,
957b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        picoos_uint32 *pos,
958b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        picobase_utf8char utf8char) {
959b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i;
960b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 len;
961b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 poscnt;
962b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
963b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    utf8char[0] = 0;
964b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    len = picobase_det_utf8_length(utf8s[*pos]);
965b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((((*pos) + len) > utf8slenmax) ||
966b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (len > PICOBASE_UTF8_MAXLEN)) {
967b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
968b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
969b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
970b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    poscnt = *pos;
971b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    i = 0;
972b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((i < len) && (utf8s[poscnt] != 0)) {
973b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        utf8char[i] = utf8s[poscnt];
974b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        poscnt++;
975b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        i++;
976b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
977b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    utf8char[i] = 0;
978b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((i < len) && (utf8s[poscnt] == 0)) {
979b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
980b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
981b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *pos = poscnt;
982b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return TRUE;
983b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
984b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
985b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picobase_get_next_utf8charpos(const picoos_uint8 *utf8s,
986b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           const picoos_uint32 utf8slenmax,
987b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           picoos_uint32 *pos) {
988b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i;
989b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 len;
990b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 poscnt;
991b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
992b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    len = picobase_det_utf8_length(utf8s[*pos]);
993b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((((*pos) + len) > utf8slenmax) ||
994b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (len > PICOBASE_UTF8_MAXLEN)){
995b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
996b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
997b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
998b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    poscnt = *pos;
999b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    i = 0;
1000b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((i < len) && (utf8s[poscnt] != 0)) {
1001b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        poscnt++;
1002b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        i++;
1003b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1004b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((i < len) && (utf8s[poscnt] == 0)) {
1005b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1006b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1007b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *pos = poscnt;
1008b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return TRUE;
1009b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1010b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1011b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picobase_get_prev_utf8char(const picoos_uint8 *utf8s,
1012b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        const picoos_uint32 utf8slenmin,
1013b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        picoos_uint32 *pos,
1014b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        picobase_utf8char utf8char) {
1015b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i, j;
1016b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 len;
1017b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 poscnt;
1018b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1019b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    utf8char[0] = 0;
1020b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((*pos) == 0) {
1021b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1022b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1023b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    poscnt = (*pos) - 1;
1024b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    i = 1;
1025b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((i <= PICOBASE_UTF8_MAXLEN) && (poscnt >= utf8slenmin) &&
1026b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen           (utf8s[poscnt] != 0)) {
1027b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        len = picobase_det_utf8_length(utf8s[poscnt]);
1028b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (len == i) {
1029b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            for (j = 0; j < len; j++) {
1030b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                utf8char[j] = utf8s[poscnt + j];
1031b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1032b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf8char[j] = 0;
1033b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            *pos = poscnt;
1034b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return TRUE;
1035b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1036b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        i++;
1037b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        poscnt--;
1038b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1039b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return FALSE;
1040b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1041b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1042b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picobase_get_prev_utf8charpos(const picoos_uint8 *utf8s,
1043b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           const picoos_uint32 utf8slenmin,
1044b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           picoos_uint32 *pos) {
1045b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i;
1046b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 len;
1047b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 poscnt;
1048b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1049b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((*pos) == 0) {
1050b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1051b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1052b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    poscnt = (*pos) - 1;
1053b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    i = 1;
1054b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((i <= PICOBASE_UTF8_MAXLEN) && (poscnt >= utf8slenmin) &&
1055b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen           (utf8s[poscnt] != 0)) {
1056b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        len = picobase_det_utf8_length(utf8s[poscnt]);
1057b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (len == i) {
1058b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            *pos = poscnt;
1059b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return TRUE;
1060b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1061b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        i++;
1062b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        poscnt--;
1063b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1064b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return FALSE;
1065b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1066b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1067b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
1068b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Converts utf8 input to utf32
1069b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    utf8[] : character encoded in utf8
1070b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    done : boolean indicating the completion of the operation (FALSE: conversion not done)
1071b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return   a single character encoded in UTF32
1072b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
1073b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picobase_utf32 picobase_utf8_to_utf32 (picoos_uint8 utf8[], picoos_uint8 * done)
1074b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
1075b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    (*done) = TRUE;
1076b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((utf8[0] < (picoos_uint8)'\200')) {
1077b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return utf8[0];
1078b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if ((utf8[0] >= (picoos_uint8)'\370')) {
1079b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return 0;
1080b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if ((utf8[0] >= (picoos_uint8)'\360')) {
1081b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return ((((262144 * (utf8[0] % 8)) + (4096 * (utf8[1] % 64))) + (64 * (utf8[2] % 64))) + (utf8[3] % 64));
1082b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if ((utf8[0] >= (picoos_uint8)'\340')) {
1083b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return (((4096 * (utf8[0] % 16)) + (64 * (utf8[1] % 64))) + (utf8[2] % 64));
1084b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if ((utf8[(0)] >= (picoos_uint8)'\300')) {
1085b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return ((64 * (utf8[0] % 32)) + (utf8[1] % 64));
1086b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
1087b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (*done) = FALSE;
1088b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return 0;
1089b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1090b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1091b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1092b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_int32 picobase_utf32_to_utf8 (picobase_utf32 utf32, picobase_utf8 utf8[], picoos_int32 utf8MaxLen, picoos_uint8 * done)
1093b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
1094b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 len;
1095b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1096b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    (*done) = TRUE;
1097b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (utf8MaxLen >= 4) {
1098b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (utf32 < 128) {
1099b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            len = 1;
1100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf8[0] = utf32;
1101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else if (utf32 < 2048) {
1102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            len = 2;
1103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf8[1] = (128 + (utf32 % 64));
1104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf32 = (utf32 / 64);
1105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf8[0] = (192 + (utf32 % 32));
1106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else if (utf32 < 65536) {
1107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            len = 3;
1108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf8[2] = (128 + (utf32 % 64));
1109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf32 = (utf32 / 64);
1110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf8[1] = (128 + (utf32 % 64));
1111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf32 = (utf32 / 64);
1112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf8[0] = (224 + utf32);
1113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else if (utf32 < 1048576) {
1114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            len = 4;
1115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf8[3] = (128 + (utf32 % 64));
1116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf32 = (utf32 / 64);
1117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf8[2] = (128 + (utf32 % 64));
1118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf32 = (utf32 / 64);
1119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf8[1] = (128 + (utf32 % 64));
1120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf32 = (utf32 / 64);
1121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf8[0] = (240 + utf32);
1122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {
1123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            (*done) = FALSE;
1124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return 0;
1125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (len <= (utf8MaxLen-1)) {
1127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf8[len] = 0;
1128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return len;
1130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
1131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (*done) = FALSE;
1132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return 0;
1133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern picoos_int32 picobase_lowercase_utf8_str (picoos_uchar utf8str[], picoos_char lowercase[], int lowercaseMaxLen, picoos_uint8 * done)
1138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
1139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picobase_utf8char utf8char;
1140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 i;
1141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 j;
1142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 k;
1143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 l;
1144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picobase_utf32 utf32;
1145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 done1;
1146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    k = 0;
1148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    i = 0;
1149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    (*done) = TRUE;
1150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while (utf8str[i] != 0) {
1151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picobase_get_utf8char(utf8str,& i,utf8char);
1152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        utf32 = picobase_utf8_to_utf32(utf8char, & done1);
1153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        utf32 = base_utf32_lowercase(utf32);
1154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        l = picobase_utf32_to_utf8(utf32, utf8char, PICOBASE_UTF8_MAXLEN, & done1);
1155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        j = 0;
1156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        while ((j < l) && (k < (lowercaseMaxLen-1))) {
1157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            lowercase[k] = utf8char[j];
1158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            k++;
1159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            j++;
1160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *done = *done && (j == l);
1162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    lowercase[k] = 0;
1164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return k;
1165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern picoos_int32 picobase_uppercase_utf8_str (picoos_uchar utf8str[], picoos_char uppercase[], int uppercaseMaxLen, picoos_uint8 * done)
1169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
1170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picobase_utf8char utf8char;
1171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 i;
1172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 j;
1173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 k;
1174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 l;
1175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picobase_utf32 utf32;
1176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 done1;
1177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    k = 0;
1179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    i = 0;
1180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    (*done) = TRUE;
1181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while (utf8str[i] != 0) {
1182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picobase_get_utf8char(utf8str,& i,utf8char);
1183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        utf32 = picobase_utf8_to_utf32(utf8char, & done1);
1184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        utf32 = base_utf32_uppercase(utf32);
1185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        l = picobase_utf32_to_utf8(utf32, utf8char, PICOBASE_UTF8_MAXLEN, & done1);
1186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        j = 0;
1187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        while ((j < l) && (k < (uppercaseMaxLen-1))) {
1188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            uppercase[k] = utf8char[j];
1189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            k++;
1190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            j++;
1191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *done = *done && (j == l);
1193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    uppercase[k] = 0;
1195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return k;
1196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern picoos_bool picobase_is_utf8_uppercase (picoos_uchar utf8str[], picoos_int32 utf8strmaxlen)
1200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
1201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picobase_utf8char utf8char;
1202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 i;
1203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 utf32;
1204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_bool done;
1205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_bool isUpperCase;
1206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    isUpperCase = TRUE;
1208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    i = 0;
1209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while (isUpperCase && (i <= utf8strmaxlen-1) && (utf8str[i] != 0)) {
1210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picobase_get_utf8char(utf8str,& i,utf8char);
1211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        utf32 = picobase_utf8_to_utf32(utf8char,& done);
1212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        isUpperCase = isUpperCase && (utf32 == base_utf32_uppercase(utf32));
1213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return isUpperCase;
1215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern picoos_bool picobase_is_utf8_lowercase (picoos_uchar utf8str[], picoos_int32 utf8strmaxlen)
1219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
1220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picobase_utf8char utf8char;
1221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 i;
1222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 utf32;
1223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_bool done;
1224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_bool isLowerCase;
1225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    isLowerCase = TRUE;
1227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    i = 0;
1228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while (isLowerCase && (i <= utf8strmaxlen-1) && (utf8str[i] != 0)) {
1229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picobase_get_utf8char(utf8str,& i,utf8char);
1230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        utf32 = picobase_utf8_to_utf32(utf8char,& done);
1231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        isLowerCase = isLowerCase && (utf32 == base_utf32_lowercase(utf32));
1232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return isLowerCase;
1234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus
1238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
1240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* end */
1244