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("&amp;");
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("&nbsp;/&nbsp;");
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("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;");
4022e5b6d6dSopenharmony_ci      break;
4032e5b6d6dSopenharmony_ci    case UCOL_QUATERNARY:
4042e5b6d6dSopenharmony_ci      result.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt;&lt;&nbsp;");
4052e5b6d6dSopenharmony_ci      break;
4062e5b6d6dSopenharmony_ci    case UCOL_TERTIARY:
4072e5b6d6dSopenharmony_ci      result.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt;&nbsp;");
4082e5b6d6dSopenharmony_ci      break;
4092e5b6d6dSopenharmony_ci    case UCOL_SECONDARY:
4102e5b6d6dSopenharmony_ci      result.append("&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&nbsp;");
4112e5b6d6dSopenharmony_ci      break;
4122e5b6d6dSopenharmony_ci    case UCOL_PRIMARY:
4132e5b6d6dSopenharmony_ci      result.append("&nbsp;&nbsp;&lt;&nbsp;");
4142e5b6d6dSopenharmony_ci      break;
4152e5b6d6dSopenharmony_ci    case UCOL_OFF:
4162e5b6d6dSopenharmony_ci      result.append("&nbsp;&gt;?&nbsp;");
4172e5b6d6dSopenharmony_ci      break;
4182e5b6d6dSopenharmony_ci    default:
4192e5b6d6dSopenharmony_ci      result.append("&nbsp;?!&nbsp;");
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