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