12e5b6d6dSopenharmony_ci// © 2016 and later: Unicode, Inc. and others. 22e5b6d6dSopenharmony_ci// License & terms of use: http://www.unicode.org/copyright.html 32e5b6d6dSopenharmony_ci/* 42e5b6d6dSopenharmony_ci******************************************************************************* 52e5b6d6dSopenharmony_ci* 62e5b6d6dSopenharmony_ci* Copyright (C) 2003, International Business Machines 72e5b6d6dSopenharmony_ci* Corporation and others. All Rights Reserved. 82e5b6d6dSopenharmony_ci* 92e5b6d6dSopenharmony_ci******************************************************************************* 102e5b6d6dSopenharmony_ci* 112e5b6d6dSopenharmony_ci* File line.cpp 122e5b6d6dSopenharmony_ci* 132e5b6d6dSopenharmony_ci* Modification History: 142e5b6d6dSopenharmony_ci* 152e5b6d6dSopenharmony_ci* Date Name Description 162e5b6d6dSopenharmony_ci* 03/18/2003 weiv Creation. 172e5b6d6dSopenharmony_ci******************************************************************************* 182e5b6d6dSopenharmony_ci*/ 192e5b6d6dSopenharmony_ci 202e5b6d6dSopenharmony_ci#include "line.h" 212e5b6d6dSopenharmony_ci#include <stdio.h> 222e5b6d6dSopenharmony_ci 232e5b6d6dSopenharmony_ciUnicodeSet * Line::needsQuoting = NULL; 242e5b6d6dSopenharmony_ci 252e5b6d6dSopenharmony_civoid 262e5b6d6dSopenharmony_ciLine::init() 272e5b6d6dSopenharmony_ci{ 282e5b6d6dSopenharmony_ci len = 0; 292e5b6d6dSopenharmony_ci expLen = 0; 302e5b6d6dSopenharmony_ci strength = UCOL_OFF; 312e5b6d6dSopenharmony_ci strengthFromEmpty = UCOL_OFF; 322e5b6d6dSopenharmony_ci cumulativeStrength = UCOL_OFF; 332e5b6d6dSopenharmony_ci expStrength = UCOL_OFF; 342e5b6d6dSopenharmony_ci previous = NULL; 352e5b6d6dSopenharmony_ci next = NULL; 362e5b6d6dSopenharmony_ci left = NULL; 372e5b6d6dSopenharmony_ci right = NULL; 382e5b6d6dSopenharmony_ci isContraction = false; 392e5b6d6dSopenharmony_ci isExpansion = false; 402e5b6d6dSopenharmony_ci isRemoved = false; 412e5b6d6dSopenharmony_ci isReset = false; 422e5b6d6dSopenharmony_ci expIndex = 0; 432e5b6d6dSopenharmony_ci firstCC = 0; 442e5b6d6dSopenharmony_ci lastCC = 0; 452e5b6d6dSopenharmony_ci sortKey = NULL; 462e5b6d6dSopenharmony_ci} 472e5b6d6dSopenharmony_ci 482e5b6d6dSopenharmony_ciLine::Line() 492e5b6d6dSopenharmony_ci{ 502e5b6d6dSopenharmony_ci init(); 512e5b6d6dSopenharmony_ci memset(name, 0, 25*sizeof(UChar)); 522e5b6d6dSopenharmony_ci memset(expansionString, 0, 25*sizeof(UChar)); 532e5b6d6dSopenharmony_ci} 542e5b6d6dSopenharmony_ci 552e5b6d6dSopenharmony_ciLine::Line(const UChar* name, int32_t len) 562e5b6d6dSopenharmony_ci{ 572e5b6d6dSopenharmony_ci init(); 582e5b6d6dSopenharmony_ci this->len = len; 592e5b6d6dSopenharmony_ci u_memcpy(this->name, name, len); 602e5b6d6dSopenharmony_ci memset(expansionString, 0, 25*sizeof(UChar)); 612e5b6d6dSopenharmony_ci UChar32 c; 622e5b6d6dSopenharmony_ci U16_GET(name, 0, 0, len, c); 632e5b6d6dSopenharmony_ci firstCC = u_getCombiningClass(c); 642e5b6d6dSopenharmony_ci U16_GET(name, 0, len-1, len, c); 652e5b6d6dSopenharmony_ci lastCC = u_getCombiningClass(c); 662e5b6d6dSopenharmony_ci} 672e5b6d6dSopenharmony_ci 682e5b6d6dSopenharmony_ciLine::Line(const UChar name) 692e5b6d6dSopenharmony_ci{ 702e5b6d6dSopenharmony_ci init(); 712e5b6d6dSopenharmony_ci len = 1; 722e5b6d6dSopenharmony_ci this->name[0] = name; 732e5b6d6dSopenharmony_ci this->name[1] = 0; 742e5b6d6dSopenharmony_ci memset(expansionString, 0, 25*sizeof(UChar)); 752e5b6d6dSopenharmony_ci firstCC = u_getCombiningClass(name); 762e5b6d6dSopenharmony_ci lastCC = firstCC; 772e5b6d6dSopenharmony_ci} 782e5b6d6dSopenharmony_ci 792e5b6d6dSopenharmony_ciLine::Line(const UnicodeString &string) 802e5b6d6dSopenharmony_ci{ 812e5b6d6dSopenharmony_ci init(); 822e5b6d6dSopenharmony_ci setTo(string); 832e5b6d6dSopenharmony_ci} 842e5b6d6dSopenharmony_ci 852e5b6d6dSopenharmony_ciLine::Line(const char *buff, int32_t buffLen, UErrorCode &status) : 862e5b6d6dSopenharmony_ciprevious(NULL), 872e5b6d6dSopenharmony_cinext(NULL), 882e5b6d6dSopenharmony_cileft(NULL), 892e5b6d6dSopenharmony_ciright(NULL) 902e5b6d6dSopenharmony_ci{ 912e5b6d6dSopenharmony_ci initFromString(buff, buffLen, status); 922e5b6d6dSopenharmony_ci} 932e5b6d6dSopenharmony_ci 942e5b6d6dSopenharmony_ciLine::Line(const Line &other) : 952e5b6d6dSopenharmony_ci previous(NULL), 962e5b6d6dSopenharmony_ci next(NULL), 972e5b6d6dSopenharmony_cileft(NULL), 982e5b6d6dSopenharmony_ciright(NULL) 992e5b6d6dSopenharmony_ci{ 1002e5b6d6dSopenharmony_ci *this = other; 1012e5b6d6dSopenharmony_ci} 1022e5b6d6dSopenharmony_ci 1032e5b6d6dSopenharmony_ciLine & 1042e5b6d6dSopenharmony_ciLine::operator=(const Line &other) { 1052e5b6d6dSopenharmony_ci len = other.len; 1062e5b6d6dSopenharmony_ci expLen = other.expLen; 1072e5b6d6dSopenharmony_ci strength = other.strength; 1082e5b6d6dSopenharmony_ci strengthFromEmpty = other.strengthFromEmpty; 1092e5b6d6dSopenharmony_ci cumulativeStrength = other.cumulativeStrength; 1102e5b6d6dSopenharmony_ci expStrength = other.expStrength; 1112e5b6d6dSopenharmony_ci isContraction = other.isContraction; 1122e5b6d6dSopenharmony_ci isExpansion = other.isExpansion; 1132e5b6d6dSopenharmony_ci isRemoved = other.isRemoved; 1142e5b6d6dSopenharmony_ci isReset = other.isReset; 1152e5b6d6dSopenharmony_ci expIndex = other.expIndex; 1162e5b6d6dSopenharmony_ci firstCC = other.firstCC; 1172e5b6d6dSopenharmony_ci lastCC = other.lastCC; 1182e5b6d6dSopenharmony_ci u_strcpy(name, other.name); 1192e5b6d6dSopenharmony_ci u_strcpy(expansionString, other.expansionString); 1202e5b6d6dSopenharmony_ci sortKey = other.sortKey; 1212e5b6d6dSopenharmony_ci left = other.left; 1222e5b6d6dSopenharmony_ci right = other.right; 1232e5b6d6dSopenharmony_ci return *this; 1242e5b6d6dSopenharmony_ci} 1252e5b6d6dSopenharmony_ci 1262e5b6d6dSopenharmony_ciUBool 1272e5b6d6dSopenharmony_ciLine::operator==(const Line &other) const { 1282e5b6d6dSopenharmony_ci if(this == &other) { 1292e5b6d6dSopenharmony_ci return true; 1302e5b6d6dSopenharmony_ci } 1312e5b6d6dSopenharmony_ci if(len != other.len) { 1322e5b6d6dSopenharmony_ci return false; 1332e5b6d6dSopenharmony_ci } 1342e5b6d6dSopenharmony_ci if(u_strcmp(name, other.name) != 0) { 1352e5b6d6dSopenharmony_ci return false; 1362e5b6d6dSopenharmony_ci } 1372e5b6d6dSopenharmony_ci return true; 1382e5b6d6dSopenharmony_ci} 1392e5b6d6dSopenharmony_ci 1402e5b6d6dSopenharmony_ciUBool 1412e5b6d6dSopenharmony_ciLine::equals(const Line &other) const { 1422e5b6d6dSopenharmony_ci if(this == &other) { 1432e5b6d6dSopenharmony_ci return true; 1442e5b6d6dSopenharmony_ci } 1452e5b6d6dSopenharmony_ci if(len != other.len) { 1462e5b6d6dSopenharmony_ci return false; 1472e5b6d6dSopenharmony_ci } 1482e5b6d6dSopenharmony_ci if(u_strcmp(name, other.name) != 0) { 1492e5b6d6dSopenharmony_ci return false; 1502e5b6d6dSopenharmony_ci } 1512e5b6d6dSopenharmony_ci if(strength != other.strength) { 1522e5b6d6dSopenharmony_ci return false; 1532e5b6d6dSopenharmony_ci } 1542e5b6d6dSopenharmony_ci if(expLen != other.expLen) { 1552e5b6d6dSopenharmony_ci return false; 1562e5b6d6dSopenharmony_ci } 1572e5b6d6dSopenharmony_ci if(u_strcmp(expansionString, other.expansionString)) { 1582e5b6d6dSopenharmony_ci return false; 1592e5b6d6dSopenharmony_ci } 1602e5b6d6dSopenharmony_ci return true; 1612e5b6d6dSopenharmony_ci} 1622e5b6d6dSopenharmony_ci 1632e5b6d6dSopenharmony_ciUBool 1642e5b6d6dSopenharmony_ciLine::operator!=(const Line &other) const { 1652e5b6d6dSopenharmony_ci return !(*this == other); 1662e5b6d6dSopenharmony_ci} 1672e5b6d6dSopenharmony_ci 1682e5b6d6dSopenharmony_ci 1692e5b6d6dSopenharmony_ciLine::~Line() { 1702e5b6d6dSopenharmony_ci} 1712e5b6d6dSopenharmony_ci 1722e5b6d6dSopenharmony_civoid 1732e5b6d6dSopenharmony_ciLine::copyArray(Line *dest, const Line *src, int32_t size) { 1742e5b6d6dSopenharmony_ci int32_t i = 0; 1752e5b6d6dSopenharmony_ci for(i = 0; i < size; i++) { 1762e5b6d6dSopenharmony_ci dest[i] = src[i]; 1772e5b6d6dSopenharmony_ci } 1782e5b6d6dSopenharmony_ci} 1792e5b6d6dSopenharmony_ci 1802e5b6d6dSopenharmony_civoid 1812e5b6d6dSopenharmony_ciLine::setName(const UChar* name, int32_t len) { 1822e5b6d6dSopenharmony_ci this->len = len; 1832e5b6d6dSopenharmony_ci u_memcpy(this->name, name, len); 1842e5b6d6dSopenharmony_ci UChar32 c; 1852e5b6d6dSopenharmony_ci U16_GET(name, 0, 0, len, c); 1862e5b6d6dSopenharmony_ci firstCC = u_getCombiningClass(c); 1872e5b6d6dSopenharmony_ci U16_GET(name, 0, len-1, len, c); 1882e5b6d6dSopenharmony_ci lastCC = u_getCombiningClass(c); 1892e5b6d6dSopenharmony_ci} 1902e5b6d6dSopenharmony_ci 1912e5b6d6dSopenharmony_civoid 1922e5b6d6dSopenharmony_ciLine::setToConcat(const Line *first, const Line *second) { 1932e5b6d6dSopenharmony_ci u_strcpy(name, first->name); 1942e5b6d6dSopenharmony_ci u_strcat(name, second->name); 1952e5b6d6dSopenharmony_ci len = first->len + second->len; 1962e5b6d6dSopenharmony_ci firstCC = first->firstCC; 1972e5b6d6dSopenharmony_ci lastCC = second->lastCC; 1982e5b6d6dSopenharmony_ci} 1992e5b6d6dSopenharmony_ci 2002e5b6d6dSopenharmony_ciUnicodeString 2012e5b6d6dSopenharmony_ciLine::stringToName(UChar *string, int32_t len) { 2022e5b6d6dSopenharmony_ci UErrorCode status = U_ZERO_ERROR; 2032e5b6d6dSopenharmony_ci UnicodeString result; 2042e5b6d6dSopenharmony_ci char buffer[256]; 2052e5b6d6dSopenharmony_ci int32_t i = 0; 2062e5b6d6dSopenharmony_ci UChar32 c; 2072e5b6d6dSopenharmony_ci while(i < len) { 2082e5b6d6dSopenharmony_ci U16_NEXT(string, i, len, c); 2092e5b6d6dSopenharmony_ci if(c < 0x10000) { 2102e5b6d6dSopenharmony_ci sprintf(buffer, "%04X ", c); 2112e5b6d6dSopenharmony_ci } else { 2122e5b6d6dSopenharmony_ci sprintf(buffer, "%06X ", c); 2132e5b6d6dSopenharmony_ci } 2142e5b6d6dSopenharmony_ci result.append(buffer); 2152e5b6d6dSopenharmony_ci } 2162e5b6d6dSopenharmony_ci i = 0; 2172e5b6d6dSopenharmony_ci while(i < len) { 2182e5b6d6dSopenharmony_ci U16_NEXT(string, i, len, c); 2192e5b6d6dSopenharmony_ci u_charName(c, U_EXTENDED_CHAR_NAME, buffer, 256, &status); 2202e5b6d6dSopenharmony_ci result.append("{"); 2212e5b6d6dSopenharmony_ci result.append(buffer); 2222e5b6d6dSopenharmony_ci result.append("} "); 2232e5b6d6dSopenharmony_ci } 2242e5b6d6dSopenharmony_ci/* 2252e5b6d6dSopenharmony_ci for(i = 0; i < len; i++) { 2262e5b6d6dSopenharmony_ci sprintf(buffer, "%04X ", string[i]); 2272e5b6d6dSopenharmony_ci result.append(buffer); 2282e5b6d6dSopenharmony_ci } 2292e5b6d6dSopenharmony_ci for(i = 0; i < len; i++) { 2302e5b6d6dSopenharmony_ci u_charName(string[i], U_EXTENDED_CHAR_NAME, buffer, 256, &status); 2312e5b6d6dSopenharmony_ci result.append("{"); 2322e5b6d6dSopenharmony_ci result.append(buffer); 2332e5b6d6dSopenharmony_ci result.append("} "); 2342e5b6d6dSopenharmony_ci } 2352e5b6d6dSopenharmony_ci*/ 2362e5b6d6dSopenharmony_ci return result; 2372e5b6d6dSopenharmony_ci} 2382e5b6d6dSopenharmony_ci 2392e5b6d6dSopenharmony_ciUnicodeString 2402e5b6d6dSopenharmony_ciLine::toBundleString() 2412e5b6d6dSopenharmony_ci{ 2422e5b6d6dSopenharmony_ci 2432e5b6d6dSopenharmony_ci UnicodeString result; 2442e5b6d6dSopenharmony_ci UErrorCode status = U_ZERO_ERROR; 2452e5b6d6dSopenharmony_ci if(!needsQuoting) { 2462e5b6d6dSopenharmony_ci needsQuoting = new UnicodeSet("[[:whitespace:][:c:][:z:][[:ascii:]-[a-zA-Z0-9]]]", status); 2472e5b6d6dSopenharmony_ci } 2482e5b6d6dSopenharmony_ci UChar NFC[50]; 2492e5b6d6dSopenharmony_ci int32_t NFCLen = unorm_normalize(name, len, UNORM_NFC, 0, NFC, 50, &status); 2502e5b6d6dSopenharmony_ci result.append("\""); 2512e5b6d6dSopenharmony_ci if(isReset) { 2522e5b6d6dSopenharmony_ci result.append("&"); 2532e5b6d6dSopenharmony_ci } else { 2542e5b6d6dSopenharmony_ci result.append(strengthToString(strength, false, false)); 2552e5b6d6dSopenharmony_ci } 2562e5b6d6dSopenharmony_ci UBool quote = needsQuoting->containsSome(name) || needsQuoting->containsSome(NFC); 2572e5b6d6dSopenharmony_ci if(quote) { 2582e5b6d6dSopenharmony_ci result.append("'"); 2592e5b6d6dSopenharmony_ci } 2602e5b6d6dSopenharmony_ci if(NFC[0] == 0x22) { 2612e5b6d6dSopenharmony_ci result.append("\\u0022"); 2622e5b6d6dSopenharmony_ci } else { 2632e5b6d6dSopenharmony_ci result.append(NFC, NFCLen); 2642e5b6d6dSopenharmony_ci } 2652e5b6d6dSopenharmony_ci if(quote && NFC[0] != 0x0027) { 2662e5b6d6dSopenharmony_ci result.append("'"); 2672e5b6d6dSopenharmony_ci } 2682e5b6d6dSopenharmony_ci if(expLen && !isReset) { 2692e5b6d6dSopenharmony_ci quote = needsQuoting->containsSome(expansionString); 2702e5b6d6dSopenharmony_ci result.append(" / "); 2712e5b6d6dSopenharmony_ci if(quote) { 2722e5b6d6dSopenharmony_ci result.append("'"); 2732e5b6d6dSopenharmony_ci } 2742e5b6d6dSopenharmony_ci result.append(expansionString); 2752e5b6d6dSopenharmony_ci if(quote) { 2762e5b6d6dSopenharmony_ci result.append("'"); 2772e5b6d6dSopenharmony_ci } 2782e5b6d6dSopenharmony_ci } 2792e5b6d6dSopenharmony_ci result.append("\" //"); 2802e5b6d6dSopenharmony_ci 2812e5b6d6dSopenharmony_ci result.append(stringToName(NFC, NFCLen)); 2822e5b6d6dSopenharmony_ci if(expLen && !isReset) { 2832e5b6d6dSopenharmony_ci result.append(" / "); 2842e5b6d6dSopenharmony_ci result.append(stringToName(expansionString, expLen)); 2852e5b6d6dSopenharmony_ci } 2862e5b6d6dSopenharmony_ci result.append("\n"); 2872e5b6d6dSopenharmony_ci return result; 2882e5b6d6dSopenharmony_ci} 2892e5b6d6dSopenharmony_ci 2902e5b6d6dSopenharmony_ciUnicodeString 2912e5b6d6dSopenharmony_ciLine::toHTMLString() 2922e5b6d6dSopenharmony_ci{ 2932e5b6d6dSopenharmony_ci UnicodeString result; 2942e5b6d6dSopenharmony_ci UErrorCode status = U_ZERO_ERROR; 2952e5b6d6dSopenharmony_ci UChar NFC[50]; 2962e5b6d6dSopenharmony_ci int32_t NFCLen = unorm_normalize(name, len, UNORM_NFC, 0, NFC, 50, &status); 2972e5b6d6dSopenharmony_ci result.append("<span title=\""); 2982e5b6d6dSopenharmony_ci result.append(stringToName(NFC, NFCLen)); 2992e5b6d6dSopenharmony_ci if(expLen && !isReset) { 3002e5b6d6dSopenharmony_ci result.append(" / "); 3012e5b6d6dSopenharmony_ci result.append(stringToName(expansionString, expLen)); 3022e5b6d6dSopenharmony_ci } 3032e5b6d6dSopenharmony_ci result.append("\">"); 3042e5b6d6dSopenharmony_ci if(isReset) { 3052e5b6d6dSopenharmony_ci result.append("&"); 3062e5b6d6dSopenharmony_ci } else { 3072e5b6d6dSopenharmony_ci result.append(strengthToString(strength, false, true)); 3082e5b6d6dSopenharmony_ci } 3092e5b6d6dSopenharmony_ci result.append(NFC, NFCLen); 3102e5b6d6dSopenharmony_ci if(expLen && !isReset) { 3112e5b6d6dSopenharmony_ci result.append(" / "); 3122e5b6d6dSopenharmony_ci result.append(expansionString); 3132e5b6d6dSopenharmony_ci } 3142e5b6d6dSopenharmony_ci result.append("</span><br>\n"); 3152e5b6d6dSopenharmony_ci return result; 3162e5b6d6dSopenharmony_ci} 3172e5b6d6dSopenharmony_ci 3182e5b6d6dSopenharmony_ciUnicodeString 3192e5b6d6dSopenharmony_ciLine::toString(UBool pretty) { 3202e5b6d6dSopenharmony_ci UnicodeString result; 3212e5b6d6dSopenharmony_ci if(!pretty) { 3222e5b6d6dSopenharmony_ci result.setTo(name); 3232e5b6d6dSopenharmony_ci if(expLen) { 3242e5b6d6dSopenharmony_ci result.append("/"); 3252e5b6d6dSopenharmony_ci result.append(expansionString); 3262e5b6d6dSopenharmony_ci } 3272e5b6d6dSopenharmony_ci } else { 3282e5b6d6dSopenharmony_ci UErrorCode status = U_ZERO_ERROR; 3292e5b6d6dSopenharmony_ci UChar NFC[50]; 3302e5b6d6dSopenharmony_ci int32_t NFCLen = unorm_normalize(name, len, UNORM_NFC, 0, NFC, 50, &status); 3312e5b6d6dSopenharmony_ci result.setTo(NFC, NFCLen); 3322e5b6d6dSopenharmony_ci if(expLen) { 3332e5b6d6dSopenharmony_ci result.append("/"); 3342e5b6d6dSopenharmony_ci result.append(expansionString); 3352e5b6d6dSopenharmony_ci } 3362e5b6d6dSopenharmony_ci /* 3372e5b6d6dSopenharmony_ci if(NFCLen != len || u_strncmp(name, NFC, len) != 0) { 3382e5b6d6dSopenharmony_ci result.append("(NFC: "); 3392e5b6d6dSopenharmony_ci result.append(NFC, NFCLen); 3402e5b6d6dSopenharmony_ci result.append(stringToName(NFC, NFCLen)); 3412e5b6d6dSopenharmony_ci result.append(")"); 3422e5b6d6dSopenharmony_ci } 3432e5b6d6dSopenharmony_ci */ 3442e5b6d6dSopenharmony_ci result.append(" # "); 3452e5b6d6dSopenharmony_ci result.append(stringToName(NFC, NFCLen)); 3462e5b6d6dSopenharmony_ci if(expLen) { 3472e5b6d6dSopenharmony_ci result.append("/ "); 3482e5b6d6dSopenharmony_ci result.append(stringToName(expansionString, expLen)); 3492e5b6d6dSopenharmony_ci } 3502e5b6d6dSopenharmony_ci } 3512e5b6d6dSopenharmony_ci return result; 3522e5b6d6dSopenharmony_ci} 3532e5b6d6dSopenharmony_ci 3542e5b6d6dSopenharmony_ci 3552e5b6d6dSopenharmony_civoid 3562e5b6d6dSopenharmony_ciLine::setTo(const UnicodeString &string) { 3572e5b6d6dSopenharmony_ci int32_t len = string.length(); 3582e5b6d6dSopenharmony_ci u_strncpy(name, string.getBuffer(), len); 3592e5b6d6dSopenharmony_ci name[len] = 0; 3602e5b6d6dSopenharmony_ci this->len = len; 3612e5b6d6dSopenharmony_ci UChar32 c; 3622e5b6d6dSopenharmony_ci U16_GET(name, 0, 0, len, c); 3632e5b6d6dSopenharmony_ci firstCC = u_getCombiningClass(c); 3642e5b6d6dSopenharmony_ci U16_GET(name, 0, len-1, len, c); 3652e5b6d6dSopenharmony_ci lastCC = u_getCombiningClass(c); 3662e5b6d6dSopenharmony_ci} 3672e5b6d6dSopenharmony_ci 3682e5b6d6dSopenharmony_civoid 3692e5b6d6dSopenharmony_ciLine::setTo(const UChar32 n) { 3702e5b6d6dSopenharmony_ci UBool isError = false; 3712e5b6d6dSopenharmony_ci len = 0; // we are setting the line to char, not appending 3722e5b6d6dSopenharmony_ci U16_APPEND(name, len, 25, n, isError); 3732e5b6d6dSopenharmony_ci name[len] = 0; 3742e5b6d6dSopenharmony_ci firstCC = u_getCombiningClass(n); 3752e5b6d6dSopenharmony_ci lastCC = firstCC; 3762e5b6d6dSopenharmony_ci} 3772e5b6d6dSopenharmony_ci 3782e5b6d6dSopenharmony_ci 3792e5b6d6dSopenharmony_ciUnicodeString 3802e5b6d6dSopenharmony_ciLine::strengthIndent(UColAttributeValue strength, int indentSize, UnicodeString &result) 3812e5b6d6dSopenharmony_ci{ 3822e5b6d6dSopenharmony_ci int i; 3832e5b6d6dSopenharmony_ci int numIndents = strength+1; 3842e5b6d6dSopenharmony_ci if(strength > UCOL_IDENTICAL) { 3852e5b6d6dSopenharmony_ci return result; 3862e5b6d6dSopenharmony_ci } else if(strength == UCOL_IDENTICAL) { 3872e5b6d6dSopenharmony_ci numIndents = 5; 3882e5b6d6dSopenharmony_ci } 3892e5b6d6dSopenharmony_ci for(i = 0; i < numIndents*indentSize; i++) { 3902e5b6d6dSopenharmony_ci result.append(" "); 3912e5b6d6dSopenharmony_ci } 3922e5b6d6dSopenharmony_ci return result; 3932e5b6d6dSopenharmony_ci} 3942e5b6d6dSopenharmony_ci 3952e5b6d6dSopenharmony_ciUnicodeString 3962e5b6d6dSopenharmony_ciLine::strengthToString(UColAttributeValue strength, UBool pretty, UBool html) { 3972e5b6d6dSopenharmony_ci UnicodeString result; 3982e5b6d6dSopenharmony_ci if(html) { 3992e5b6d6dSopenharmony_ci switch(strength) { 4002e5b6d6dSopenharmony_ci case UCOL_IDENTICAL: 4012e5b6d6dSopenharmony_ci result.append(" = "); 4022e5b6d6dSopenharmony_ci break; 4032e5b6d6dSopenharmony_ci case UCOL_QUATERNARY: 4042e5b6d6dSopenharmony_ci result.append(" <<<< "); 4052e5b6d6dSopenharmony_ci break; 4062e5b6d6dSopenharmony_ci case UCOL_TERTIARY: 4072e5b6d6dSopenharmony_ci result.append(" <<< "); 4082e5b6d6dSopenharmony_ci break; 4092e5b6d6dSopenharmony_ci case UCOL_SECONDARY: 4102e5b6d6dSopenharmony_ci result.append(" << "); 4112e5b6d6dSopenharmony_ci break; 4122e5b6d6dSopenharmony_ci case UCOL_PRIMARY: 4132e5b6d6dSopenharmony_ci result.append(" < "); 4142e5b6d6dSopenharmony_ci break; 4152e5b6d6dSopenharmony_ci case UCOL_OFF: 4162e5b6d6dSopenharmony_ci result.append(" >? "); 4172e5b6d6dSopenharmony_ci break; 4182e5b6d6dSopenharmony_ci default: 4192e5b6d6dSopenharmony_ci result.append(" ?! "); 4202e5b6d6dSopenharmony_ci break; 4212e5b6d6dSopenharmony_ci } 4222e5b6d6dSopenharmony_ci } else { 4232e5b6d6dSopenharmony_ci switch(strength) { 4242e5b6d6dSopenharmony_ci case UCOL_IDENTICAL: 4252e5b6d6dSopenharmony_ci if(pretty) { 4262e5b6d6dSopenharmony_ci result.append(" "); 4272e5b6d6dSopenharmony_ci } 4282e5b6d6dSopenharmony_ci result.append(" = "); 4292e5b6d6dSopenharmony_ci break; 4302e5b6d6dSopenharmony_ci case UCOL_QUATERNARY: 4312e5b6d6dSopenharmony_ci if(pretty) { 4322e5b6d6dSopenharmony_ci result.append(" "); 4332e5b6d6dSopenharmony_ci } 4342e5b6d6dSopenharmony_ci result.append(" <<<< "); 4352e5b6d6dSopenharmony_ci break; 4362e5b6d6dSopenharmony_ci case UCOL_TERTIARY: 4372e5b6d6dSopenharmony_ci //u_fprintf(file, "<3"); 4382e5b6d6dSopenharmony_ci if(pretty) { 4392e5b6d6dSopenharmony_ci result.append(" "); 4402e5b6d6dSopenharmony_ci } 4412e5b6d6dSopenharmony_ci result.append(" <<< "); 4422e5b6d6dSopenharmony_ci break; 4432e5b6d6dSopenharmony_ci case UCOL_SECONDARY: 4442e5b6d6dSopenharmony_ci //u_fprintf(file, "<2"); 4452e5b6d6dSopenharmony_ci if(pretty) { 4462e5b6d6dSopenharmony_ci result.append(" "); 4472e5b6d6dSopenharmony_ci } 4482e5b6d6dSopenharmony_ci result.append(" << "); 4492e5b6d6dSopenharmony_ci break; 4502e5b6d6dSopenharmony_ci case UCOL_PRIMARY: 4512e5b6d6dSopenharmony_ci //u_fprintf(file, "<1"); 4522e5b6d6dSopenharmony_ci if(pretty) { 4532e5b6d6dSopenharmony_ci result.append(" "); 4542e5b6d6dSopenharmony_ci } 4552e5b6d6dSopenharmony_ci result.append(" < "); 4562e5b6d6dSopenharmony_ci break; 4572e5b6d6dSopenharmony_ci case UCOL_OFF: 4582e5b6d6dSopenharmony_ci result.append(" >? "); 4592e5b6d6dSopenharmony_ci break; 4602e5b6d6dSopenharmony_ci default: 4612e5b6d6dSopenharmony_ci result.append(" ?! "); 4622e5b6d6dSopenharmony_ci break; 4632e5b6d6dSopenharmony_ci } 4642e5b6d6dSopenharmony_ci } 4652e5b6d6dSopenharmony_ci return result; 4662e5b6d6dSopenharmony_ci} 4672e5b6d6dSopenharmony_ci 4682e5b6d6dSopenharmony_ciLine * 4692e5b6d6dSopenharmony_ciLine::nextInteresting() { 4702e5b6d6dSopenharmony_ci Line *result = this->next; 4712e5b6d6dSopenharmony_ci while(result && result->strength != UCOL_IDENTICAL) { 4722e5b6d6dSopenharmony_ci result = result->next; 4732e5b6d6dSopenharmony_ci } 4742e5b6d6dSopenharmony_ci return result; 4752e5b6d6dSopenharmony_ci} 4762e5b6d6dSopenharmony_ci 4772e5b6d6dSopenharmony_civoid 4782e5b6d6dSopenharmony_ciLine::append(const UChar* n, int32_t length) 4792e5b6d6dSopenharmony_ci{ 4802e5b6d6dSopenharmony_ci u_strncat(name, n, length); 4812e5b6d6dSopenharmony_ci name[len+length] = 0; 4822e5b6d6dSopenharmony_ci len += length; 4832e5b6d6dSopenharmony_ci UChar32 end; 4842e5b6d6dSopenharmony_ci U16_GET(n, 0, length-1, length, end); 4852e5b6d6dSopenharmony_ci lastCC = u_getCombiningClass(end); 4862e5b6d6dSopenharmony_ci} 4872e5b6d6dSopenharmony_ci 4882e5b6d6dSopenharmony_civoid 4892e5b6d6dSopenharmony_ciLine::append(const UChar n) 4902e5b6d6dSopenharmony_ci{ 4912e5b6d6dSopenharmony_ci name[len] = n; 4922e5b6d6dSopenharmony_ci name[len+1] = 0; 4932e5b6d6dSopenharmony_ci len++; 4942e5b6d6dSopenharmony_ci lastCC = u_getCombiningClass(n); 4952e5b6d6dSopenharmony_ci} 4962e5b6d6dSopenharmony_ci 4972e5b6d6dSopenharmony_civoid 4982e5b6d6dSopenharmony_ciLine::append(const Line &l) 4992e5b6d6dSopenharmony_ci{ 5002e5b6d6dSopenharmony_ci append(l.name, l.len); 5012e5b6d6dSopenharmony_ci lastCC = l.lastCC; 5022e5b6d6dSopenharmony_ci} 5032e5b6d6dSopenharmony_ci 5042e5b6d6dSopenharmony_civoid 5052e5b6d6dSopenharmony_ciLine::clear() 5062e5b6d6dSopenharmony_ci{ 5072e5b6d6dSopenharmony_ci name[0] = 0; 5082e5b6d6dSopenharmony_ci len = 0; 5092e5b6d6dSopenharmony_ci} 5102e5b6d6dSopenharmony_ci 5112e5b6d6dSopenharmony_ciint32_t 5122e5b6d6dSopenharmony_ciLine::write(char *buff, int32_t, UErrorCode &) 5132e5b6d6dSopenharmony_ci{ 5142e5b6d6dSopenharmony_ci /* 5152e5b6d6dSopenharmony_ci UChar name[25]; 5162e5b6d6dSopenharmony_ci int32_t len; 5172e5b6d6dSopenharmony_ci UChar expansionString[25]; 5182e5b6d6dSopenharmony_ci int32_t expLen; 5192e5b6d6dSopenharmony_ci 5202e5b6d6dSopenharmony_ci UColAttributeValue strength; 5212e5b6d6dSopenharmony_ci UColAttributeValue strengthFromEmpty; 5222e5b6d6dSopenharmony_ci UColAttributeValue cumulativeStrength; 5232e5b6d6dSopenharmony_ci UColAttributeValue expStrength; 5242e5b6d6dSopenharmony_ci 5252e5b6d6dSopenharmony_ci Line *previous; 5262e5b6d6dSopenharmony_ci Line *next; 5272e5b6d6dSopenharmony_ci 5282e5b6d6dSopenharmony_ci UBool isContraction; 5292e5b6d6dSopenharmony_ci UBool isExpansion; 5302e5b6d6dSopenharmony_ci UBool isRemoved; 5312e5b6d6dSopenharmony_ci UBool isReset; 5322e5b6d6dSopenharmony_ci 5332e5b6d6dSopenharmony_ci int32_t expIndex; 5342e5b6d6dSopenharmony_ci uint8_t firstCC; 5352e5b6d6dSopenharmony_ci uint8_t lastCC; 5362e5b6d6dSopenharmony_ci*/ 5372e5b6d6dSopenharmony_ci int32_t resLen = 0; 5382e5b6d6dSopenharmony_ci int32_t i = 0; 5392e5b6d6dSopenharmony_ci sprintf(buff+resLen, "%04X", name[0]); 5402e5b6d6dSopenharmony_ci resLen += 4; 5412e5b6d6dSopenharmony_ci for(i = 1; i < len; i++) { 5422e5b6d6dSopenharmony_ci sprintf(buff+resLen, " %04X", name[i]); 5432e5b6d6dSopenharmony_ci resLen += 5; 5442e5b6d6dSopenharmony_ci } 5452e5b6d6dSopenharmony_ci sprintf(buff+resLen, "/"); 5462e5b6d6dSopenharmony_ci resLen += 1; 5472e5b6d6dSopenharmony_ci 5482e5b6d6dSopenharmony_ci i = 0; 5492e5b6d6dSopenharmony_ci if(expLen) { 5502e5b6d6dSopenharmony_ci sprintf(buff+resLen, "%04X", expansionString[0]); 5512e5b6d6dSopenharmony_ci resLen += 4; 5522e5b6d6dSopenharmony_ci for(i = 1; i < expLen; i++) { 5532e5b6d6dSopenharmony_ci sprintf(buff+resLen, " %04X", expansionString[i]); 5542e5b6d6dSopenharmony_ci resLen += 5; 5552e5b6d6dSopenharmony_ci } 5562e5b6d6dSopenharmony_ci } 5572e5b6d6dSopenharmony_ci sprintf(buff+resLen, "; "); 5582e5b6d6dSopenharmony_ci resLen += 2; 5592e5b6d6dSopenharmony_ci 5602e5b6d6dSopenharmony_ci sprintf(buff+resLen, "%02i ", strength); 5612e5b6d6dSopenharmony_ci resLen += 3; 5622e5b6d6dSopenharmony_ci sprintf(buff+resLen, "%02i", strengthFromEmpty); 5632e5b6d6dSopenharmony_ci resLen += 2; 5642e5b6d6dSopenharmony_ci sprintf(buff+resLen, "%02i", cumulativeStrength); 5652e5b6d6dSopenharmony_ci resLen += 2; 5662e5b6d6dSopenharmony_ci sprintf(buff+resLen, "%02i", expStrength); 5672e5b6d6dSopenharmony_ci resLen += 2; 5682e5b6d6dSopenharmony_ci 5692e5b6d6dSopenharmony_ci // Various flags. The only interesting ones are isReset and isRemoved. We will not output removed lines 5702e5b6d6dSopenharmony_ci //sprintf(buff+resLen, "%1i%1i%1i%1i ", isContraction, isExpansion, isRemoved, isReset); 5712e5b6d6dSopenharmony_ci //resLen += 5; 5722e5b6d6dSopenharmony_ci sprintf(buff+resLen, "%1i%1i ", isRemoved, isReset); 5732e5b6d6dSopenharmony_ci resLen += 3; 5742e5b6d6dSopenharmony_ci 5752e5b6d6dSopenharmony_ci // first and last CC 5762e5b6d6dSopenharmony_ci // can be calculated on reading 5772e5b6d6dSopenharmony_ci //sprintf(buff+resLen, "%03i %03i ", firstCC, lastCC); 5782e5b6d6dSopenharmony_ci //resLen += 8; 5792e5b6d6dSopenharmony_ci 5802e5b6d6dSopenharmony_ci sprintf(buff+resLen, "%08X", expIndex); 5812e5b6d6dSopenharmony_ci resLen += 8; 5822e5b6d6dSopenharmony_ci 5832e5b6d6dSopenharmony_ci buff[resLen] = 0; 5842e5b6d6dSopenharmony_ci 5852e5b6d6dSopenharmony_ci return resLen; 5862e5b6d6dSopenharmony_ci} 5872e5b6d6dSopenharmony_ci 5882e5b6d6dSopenharmony_civoid 5892e5b6d6dSopenharmony_ciLine::initFromString(const char *buff, int32_t, UErrorCode &) 5902e5b6d6dSopenharmony_ci{ 5912e5b6d6dSopenharmony_ci int32_t bufIndex = 0; 5922e5b6d6dSopenharmony_ci int32_t i = 0; 5932e5b6d6dSopenharmony_ci 5942e5b6d6dSopenharmony_ci sscanf(buff+bufIndex, "%04X", &name[i]); 5952e5b6d6dSopenharmony_ci i++; 5962e5b6d6dSopenharmony_ci bufIndex += 4; 5972e5b6d6dSopenharmony_ci while(buff[bufIndex] != '/') { 5982e5b6d6dSopenharmony_ci sscanf(buff+bufIndex, " %04X", &name[i]); 5992e5b6d6dSopenharmony_ci i++; 6002e5b6d6dSopenharmony_ci bufIndex += 5; 6012e5b6d6dSopenharmony_ci } 6022e5b6d6dSopenharmony_ci len = i; 6032e5b6d6dSopenharmony_ci name[len] = 0; 6042e5b6d6dSopenharmony_ci bufIndex++; 6052e5b6d6dSopenharmony_ci 6062e5b6d6dSopenharmony_ci if(i > 1) { 6072e5b6d6dSopenharmony_ci isContraction = true; 6082e5b6d6dSopenharmony_ci } else { 6092e5b6d6dSopenharmony_ci isContraction = false; 6102e5b6d6dSopenharmony_ci } 6112e5b6d6dSopenharmony_ci 6122e5b6d6dSopenharmony_ci if(buff[bufIndex] == ';') { 6132e5b6d6dSopenharmony_ci isExpansion = false; 6142e5b6d6dSopenharmony_ci bufIndex += 2; 6152e5b6d6dSopenharmony_ci expansionString[0] = 0; 6162e5b6d6dSopenharmony_ci expLen = 0; 6172e5b6d6dSopenharmony_ci } else { 6182e5b6d6dSopenharmony_ci i = 0; 6192e5b6d6dSopenharmony_ci sscanf(buff+bufIndex, "%04X", &expansionString[i]); 6202e5b6d6dSopenharmony_ci i++; 6212e5b6d6dSopenharmony_ci bufIndex += 4; 6222e5b6d6dSopenharmony_ci while(buff[bufIndex] != ';') { 6232e5b6d6dSopenharmony_ci sscanf(buff+bufIndex, " %04X", &expansionString[i]); 6242e5b6d6dSopenharmony_ci i++; 6252e5b6d6dSopenharmony_ci bufIndex += 5; 6262e5b6d6dSopenharmony_ci } 6272e5b6d6dSopenharmony_ci expLen = i; 6282e5b6d6dSopenharmony_ci expansionString[expLen] = 0; 6292e5b6d6dSopenharmony_ci bufIndex += 2; 6302e5b6d6dSopenharmony_ci } 6312e5b6d6dSopenharmony_ci sscanf(buff+bufIndex, "%02i ", &strength); 6322e5b6d6dSopenharmony_ci bufIndex += 3; 6332e5b6d6dSopenharmony_ci sscanf(buff+bufIndex, "%02i", &strengthFromEmpty); 6342e5b6d6dSopenharmony_ci bufIndex += 2; 6352e5b6d6dSopenharmony_ci sscanf(buff+bufIndex, "%02i", &cumulativeStrength); 6362e5b6d6dSopenharmony_ci bufIndex += 2; 6372e5b6d6dSopenharmony_ci sscanf(buff+bufIndex, "%02i", &expStrength); 6382e5b6d6dSopenharmony_ci bufIndex += 2; 6392e5b6d6dSopenharmony_ci 6402e5b6d6dSopenharmony_ci sscanf(buff+bufIndex, "%1i%1i ", &isRemoved, &isReset); 6412e5b6d6dSopenharmony_ci bufIndex += 3; 6422e5b6d6dSopenharmony_ci 6432e5b6d6dSopenharmony_ci sscanf(buff+bufIndex, "%08X", &expIndex); 6442e5b6d6dSopenharmony_ci bufIndex += 8; 6452e5b6d6dSopenharmony_ci 6462e5b6d6dSopenharmony_ci // calculate first and last CC 6472e5b6d6dSopenharmony_ci UChar32 c; 6482e5b6d6dSopenharmony_ci U16_GET(name, 0, 0, len, c); 6492e5b6d6dSopenharmony_ci firstCC = u_getCombiningClass(c); 6502e5b6d6dSopenharmony_ci U16_GET(name, 0, len-1, len, c); 6512e5b6d6dSopenharmony_ci lastCC = u_getCombiningClass(c); 6522e5b6d6dSopenharmony_ci} 6532e5b6d6dSopenharmony_ci 6542e5b6d6dSopenharmony_civoid 6552e5b6d6dSopenharmony_ciLine::swapCase(UChar *string, int32_t &sLen) 6562e5b6d6dSopenharmony_ci{ 6572e5b6d6dSopenharmony_ci UChar32 c = 0; 6582e5b6d6dSopenharmony_ci int32_t i = 0, j = 0; 6592e5b6d6dSopenharmony_ci UChar buff[256]; 6602e5b6d6dSopenharmony_ci UBool isError = false; 6612e5b6d6dSopenharmony_ci while(i < sLen) { 6622e5b6d6dSopenharmony_ci U16_NEXT(string, i, sLen, c); 6632e5b6d6dSopenharmony_ci if(u_isUUppercase(c)) { 6642e5b6d6dSopenharmony_ci c = u_tolower(c); 6652e5b6d6dSopenharmony_ci } else if(u_isULowercase(c)) { 6662e5b6d6dSopenharmony_ci c = u_toupper(c); 6672e5b6d6dSopenharmony_ci } 6682e5b6d6dSopenharmony_ci U16_APPEND(buff, j, 256, c, isError); 6692e5b6d6dSopenharmony_ci } 6702e5b6d6dSopenharmony_ci buff[j] = 0; 6712e5b6d6dSopenharmony_ci u_strcpy(string, buff); 6722e5b6d6dSopenharmony_ci sLen = j; 6732e5b6d6dSopenharmony_ci} 6742e5b6d6dSopenharmony_ci 6752e5b6d6dSopenharmony_ci 6762e5b6d6dSopenharmony_civoid 6772e5b6d6dSopenharmony_ciLine::swapCase() 6782e5b6d6dSopenharmony_ci{ 6792e5b6d6dSopenharmony_ci swapCase(name, len); 6802e5b6d6dSopenharmony_ci swapCase(expansionString, expLen); 6812e5b6d6dSopenharmony_ci} 6822e5b6d6dSopenharmony_ci 6832e5b6d6dSopenharmony_ciUnicodeString 6842e5b6d6dSopenharmony_ciLine::dumpSortkey() 6852e5b6d6dSopenharmony_ci{ 6862e5b6d6dSopenharmony_ci 6872e5b6d6dSopenharmony_ci char buffer[256]; 6882e5b6d6dSopenharmony_ci char *buff = buffer; 6892e5b6d6dSopenharmony_ci *buff = 0; 6902e5b6d6dSopenharmony_ci uint8_t *key = sortKey; 6912e5b6d6dSopenharmony_ci if(sortKey) { 6922e5b6d6dSopenharmony_ci while(*key) { 6932e5b6d6dSopenharmony_ci sprintf(buff, "%02X ", *key); 6942e5b6d6dSopenharmony_ci key++; 6952e5b6d6dSopenharmony_ci buff += 3; 6962e5b6d6dSopenharmony_ci if(buff - buffer > 252) { 6972e5b6d6dSopenharmony_ci break; 6982e5b6d6dSopenharmony_ci } 6992e5b6d6dSopenharmony_ci } 7002e5b6d6dSopenharmony_ci } 7012e5b6d6dSopenharmony_ci return UnicodeString(buffer); 7022e5b6d6dSopenharmony_ci} 7032e5b6d6dSopenharmony_ci 704