blob: 938e1e387db17da9fc7626b071a6fb42692516f4 [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 2009, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
package com.ibm.icu.impl.locale;
import com.ibm.icu.impl.locale.LanguageTag.ParseStatus;
public class Extension {
private char _key;
protected String _value;
protected Extension(char key) {
_key = key;
}
public char getKey() {
return _key;
}
public String getValue() {
return _value;
}
public String getID() {
return _key + LanguageTag.SEP + _value;
}
public String toString() {
return getID();
}
public static Extension create(StringTokenIterator itr, ParseStatus sts) {
if (sts.isError() || itr.isDone()) {
return null;
}
Extension ext = null;
String key = itr.current();
if (LanguageTag.isExtensionSingleton(key) || LanguageTag.isPrivateuseSingleton(key)) {
itr.next();
ext = create(key.charAt(0), itr, sts);
}
return ext;
}
public static Extension create(char key, StringTokenIterator val, ParseStatus sts) {
if (sts.isError()) {
return null;
}
if (val.isDone()) {
sts.errorIndex = val.currentStart();
sts.errorMsg = "Missing extension subtag for extension :" + key;
return null;
}
Extension ext = null;
key = AsciiUtil.toLower(key);
switch (key) {
case UnicodeLocaleExtension.SINGLETON:
ext = new UnicodeLocaleExtension();
break;
case PrivateuseExtension.SINGLETON:
ext = new PrivateuseExtension();
break;
default:
ext = new Extension(key);
break;
}
ext.setExtensionValue(val, sts);
if (ext.getValue() == null) {
// return null only when nothing parsed.
return null;
}
return ext;
}
protected void setExtensionValue(StringTokenIterator itr, ParseStatus sts) {
if (sts.isError() || itr.isDone()) {
_value = null;
return;
}
StringBuilder buf = new StringBuilder();
while (!itr.isDone()) {
String s = itr.current();
if (!LanguageTag.isExtensionSubtag(s)) {
break;
}
s = LanguageTag.canonicalizeExtensionSubtag(s);
if (buf.length() != 0) {
buf.append(LanguageTag.SEP);
}
buf.append(s);
sts.parseLength = itr.currentEnd();
itr.next();
}
if (buf.length() == 0) {
sts.errorIndex = itr.currentStart();
sts.errorMsg = "Invalid extension subtag: " + itr.current();
_value = null;
} else {
_value = buf.toString();
}
}
}