/*
*******************************************************************************
-* Copyright (C) 2010, International Business Machines
+* Copyright (C) 2010-2011, International Business Machines
* Corporation and others. All Rights Reserved.
*******************************************************************************
* file name: charstr.cpp
return TRUE;
}
+CharString &CharString::appendPathPart(const StringPiece &s, UErrorCode &errorCode) {
+ if(U_FAILURE(errorCode)) {
+ return *this;
+ }
+ if(s.length()==0) {
+ return *this;
+ }
+ char c;
+ if(len>0 && (c=buffer[len-1])!=U_FILE_SEP_CHAR && c!=U_FILE_ALT_SEP_CHAR) {
+ append(U_FILE_SEP_CHAR, errorCode);
+ }
+ append(s, errorCode);
+ return *this;
+}
+
U_NAMESPACE_END
CharString &appendInvariantChars(const UnicodeString &s, UErrorCode &errorCode);
+ /**
+ * Appends a filename/path part, e.g., a directory name.
+ * First appends a U_FILE_SEP_CHAR if necessary.
+ * Does nothing if s is empty.
+ */
+ CharString &appendPathPart(const StringPiece &s, UErrorCode &errorCode);
+
private:
MaybeStackArray<char, 40> buffer;
int32_t len;
}
U_CAPI void U_EXPORT2
-u_versionToString(UVersionInfo versionArray, char *versionString) {
+u_versionToString(const UVersionInfo versionArray, char *versionString) {
uint16_t count, part;
uint8_t field;
* @stable ICU 2.4
*/
U_STABLE void U_EXPORT2
-u_versionToString(UVersionInfo versionArray, char *versionString);
+u_versionToString(const UVersionInfo versionArray, char *versionString);
/**
* Gets the ICU release version. The version array stores the version information
cp;ABF9;-Alpha;gc=Nd;-IDS;InSC=Other;lb=NU;na=MEETEI MAYEK DIGIT NINE;nt=De;nv=9;SB=NU;WB=NU;-XIDS
cp;ABFA..ABFF;age=NA;-Alpha;gc=Cn;-Gr_Base;-IDC;-IDS;InSC=Other;lb=XX;SB=XX;sc=Zzzz;WB=XX;-XIDC;-XIDS
-block;AC00..D7AF;age=2.0;Alpha;blk=Hangul;ea=W;gc=Lo;GCB=LVT;Gr_Base;IDC;IDS;lb=H3;NFD_QC=N;NFKD_QC=N;SB=LE;sc=Hang;WB=LE;XIDC;XIDS
+block;AC00..D7AF;age=2.0;Alpha;blk=Hangul;dt=Can;ea=W;gc=Lo;GCB=LVT;Gr_Base;IDC;IDS;lb=H3;NFD_QC=N;NFKD_QC=N;SB=LE;sc=Hang;WB=LE;XIDC;XIDS
# AC00..D7A3 Hangul Syllables
algnamesrange;AC00..D7A3;hangul
cp;AC00;GCB=LV;lb=H2
cp;D750;GCB=LV;lb=H2
cp;D76C;GCB=LV;lb=H2
cp;D788;GCB=LV;lb=H2
-cp;D7A4..D7AF;age=NA;-Alpha;ea=N;gc=Cn;GCB=XX;-Gr_Base;-IDC;-IDS;lb=XX;NFD_QC=Y;NFKD_QC=Y;SB=XX;sc=Zzzz;WB=XX;-XIDC;-XIDS
+cp;D7A4..D7AF;age=NA;-Alpha;dt=None;ea=N;gc=Cn;GCB=XX;-Gr_Base;-IDC;-IDS;lb=XX;NFD_QC=Y;NFKD_QC=Y;SB=XX;sc=Zzzz;WB=XX;-XIDC;-XIDS
block;D7B0..D7FF;age=5.2;Alpha;blk=Jamo_Ext_B;ea=W;gc=Lo;GCB=T;Gr_Base;IDC;IDS;lb=JT;SB=LE;sc=Hang;WB=LE;XIDC;XIDS
# D7B0..D7FF Hangul Jamo Extended-B
UniProps::UniProps()
: start(U_SENTINEL), end(U_SENTINEL),
bmg(U_SENTINEL),
- numericValue(NULL),
- name(NULL), uni1Name(NULL), nameAlias(NULL) {
+ digitValue(-1), numericValue(NULL),
+ name(NULL), nameAlias(NULL) {
memset(binProps, 0, sizeof(binProps));
memset(intProps, 0, sizeof(intProps));
memset(age, 0, 4);
"property",
"binary",
"value",
- "default",
+ "defaults",
"block",
"cp",
"algnamesrange"
if(!parseCodePointRange(field, start, end, errorCode)) { return NULL; }
UniProps *props;
switch(lineType) {
- case DEFAULT_LINE:
+ case DEFAULTS_LINE:
if(defaultLineIndex>=0) {
fprintf(stderr,
"error in preparsed UCD: second line with default properties on line %ld\n",
field, (long)lineNumber);
errorCode=U_PARSE_ERROR;
} else if(prop<UCHAR_INT_LIMIT) {
- int32_t value;
- if((value=pnames->getPropertyValueEnum(prop, v))==UCHAR_INVALID_CODE) {
+ int32_t value=pnames->getPropertyValueEnum(prop, v);
+ if(value==UCHAR_INVALID_CODE && prop==UCHAR_CANONICAL_COMBINING_CLASS) {
+ // TODO: Make getPropertyValueEnum(UCHAR_CANONICAL_COMBINING_CLASS, v) work.
+ char *end;
+ unsigned long ccc=uprv_strtoul(v, &end, 10);
+ if(v<end && *end==0 && ccc<=254) {
+ value=(int32_t)ccc;
+ }
+ }
+ if(value==UCHAR_INVALID_CODE) {
fprintf(stderr,
"error in preparsed UCD: '%s' is not a valid value on line %ld\n",
field, (long)lineNumber);
errorCode=U_PARSE_ERROR;
} else {
- props.intProps[prop]=value;
+ props.intProps[prop-UCHAR_INT_START]=value;
}
+ } else if(*v=='<' && lineType==DEFAULTS_LINE) {
+ // Ignore default values like <code point>.
+ return TRUE;
} else {
+ char c;
switch(prop) {
case UCHAR_NUMERIC_VALUE:
props.numericValue=v;
+ c=*v;
+ if('0'<=c && c<='9' && v[1]==0) {
+ props.digitValue=c-'0';
+ } else {
+ props.digitValue=-1;
+ }
break;
case UCHAR_NAME:
props.name=v;
break;
- case UCHAR_UNICODE_1_NAME:
- props.uni1Name=v;
- break;
case UCHAR_AGE:
u_versionFromString(props.age, v); // Writes 0.0.0.0 if v is not numeric.
break;
UniProps();
~UniProps();
+ int32_t getIntProp(int32_t prop) const { return intProps[prop-UCHAR_INT_START]; }
+
UChar32 start, end;
UBool binProps[UCHAR_BINARY_LIMIT];
int32_t intProps[UCHAR_INT_LIMIT-UCHAR_INT_START];
UVersionInfo age;
UChar32 bmg;
+ int32_t digitValue;
const char *numericValue;
const char *name;
- const char *uni1Name;
const char *nameAlias;
UnicodeString cf;
};
VALUE_LINE,
/** defaults;0000..10FFFF;age=NA;bc=L;... */
- DEFAULT_LINE,
+ DEFAULTS_LINE,
/** block;0000..007F;age=1.1;blk=ASCII;ea=Na;... */
BLOCK_LINE,
/** cp;0030;AHex;bc=EN;gc=Nd;na=DIGIT ZERO;... */
const UVersionInfo &getUnicodeVersion() const { return ucdVersion; }
/** Returns TRUE if the current line has property values. */
- UBool lineHasPropertyValues() const { return DEFAULT_LINE<=lineType && lineType<=CP_LINE; }
+ UBool lineHasPropertyValues() const { return DEFAULTS_LINE<=lineType && lineType<=CP_LINE; }
/**
* Parses properties from the current line.