icu4c/source/extra/uconv/uconv.vcxproj.filters -text
icu4c/source/i18n/i18n.vcxproj -text
icu4c/source/i18n/i18n.vcxproj.filters -text
+icu4c/source/i18n/numsys_impl.h -text
icu4c/source/io/io.vcxproj -text
icu4c/source/io/io.vcxproj.filters -text
icu4c/source/layout/layout.vcxproj -text
</Command>\r
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>\r
</CustomBuild>\r
+ <ClInclude Include="numsys_impl.h" />\r
<ClInclude Include="tzfmt.h" />\r
<ClInclude Include="tzgnames.h" />\r
<ClInclude Include="tznames.h" />\r
<ClCompile Include="bmsearch.cpp">\r
<Filter>collation</Filter>\r
</ClCompile>\r
- <ClCompile Include="bocsu.c">\r
- <Filter>collation</Filter>\r
- </ClCompile>\r
<ClCompile Include="coleitr.cpp">\r
<Filter>collation</Filter>\r
</ClCompile>\r
<ClCompile Include="tznames_impl.cpp">\r
<Filter>formatting</Filter>\r
</ClCompile>\r
+ <ClCompile Include="bocsu.cpp" />\r
</ItemGroup>\r
<ItemGroup>\r
<ClInclude Include="bocsu.h">\r
<ClInclude Include="tznames_impl.h">\r
<Filter>formatting</Filter>\r
</ClInclude>\r
+ <ClInclude Include="numsys_impl.h">\r
+ <Filter>formatting</Filter>\r
+ </ClInclude>\r
</ItemGroup>\r
<ItemGroup>\r
<ResourceCompile Include="i18n.rc">\r
#include "unicode/numsys.h"
#include "cstring.h"
#include "uresimp.h"
+#include "numsys_impl.h"
#if !UCONFIG_NO_FORMATTING
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(NumberingSystem)
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION(NumsysNameEnumeration)
/**
* Default Constructor.
return ( algorithmic );
}
+StringEnumeration* NumberingSystem::getAvailableNames(UErrorCode &status) {
+
+ static StringEnumeration* availableNames = NULL;
+
+ if (U_FAILURE(status)) {
+ return NULL;
+ }
+
+ if ( availableNames == NULL ) {
+ UVector *fNumsysNames = new UVector(status);
+ if (U_FAILURE(status)) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return NULL;
+ }
+
+ UErrorCode rbstatus = U_ZERO_ERROR;
+ UResourceBundle *numberingSystemsInfo = ures_openDirect(NULL, "numberingSystems", &rbstatus);
+ numberingSystemsInfo = ures_getByKey(numberingSystemsInfo,"numberingSystems",numberingSystemsInfo,&rbstatus);
+ if(U_FAILURE(rbstatus)) {
+ status = U_MISSING_RESOURCE_ERROR;
+ ures_close(numberingSystemsInfo);
+ return NULL;
+ }
+
+ while ( ures_hasNext(numberingSystemsInfo) ) {
+ UResourceBundle *nsCurrent = ures_getNextResource(numberingSystemsInfo,NULL,&rbstatus);
+ const char *nsName = ures_getKey(nsCurrent);
+ fNumsysNames->addElement(new UnicodeString(nsName),status);
+ ures_close(nsCurrent);
+ }
+
+ ures_close(numberingSystemsInfo);
+ availableNames = new NumsysNameEnumeration(fNumsysNames,status);
+
+ }
+
+ return availableNames;
+}
UBool NumberingSystem::isValidDigitString(const UnicodeString& str) {
}
return TRUE;
}
+
+NumsysNameEnumeration::NumsysNameEnumeration(UVector *fNameList, UErrorCode& /*status*/) {
+ pos=0;
+ fNumsysNames = fNameList;
+}
+
+const UnicodeString*
+NumsysNameEnumeration::snext(UErrorCode& status) {
+ if (U_SUCCESS(status) && pos < fNumsysNames->size()) {
+ return (const UnicodeString*)fNumsysNames->elementAt(pos++);
+ }
+ return NULL;
+}
+
+void
+NumsysNameEnumeration::reset(UErrorCode& /*status*/) {
+ pos=0;
+}
+
+int32_t
+NumsysNameEnumeration::count(UErrorCode& /*status*/) const {
+ return (fNumsysNames==NULL) ? 0 : fNumsysNames->size();
+}
+
+NumsysNameEnumeration::~NumsysNameEnumeration() {
+ delete fNumsysNames;
+}
U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
--- /dev/null
+/*\r
+*******************************************************************************\r
+* Copyright (C) 2011, International Business Machines Corporation and\r
+* others. All Rights Reserved. *\r
+*******************************************************************************\r
+*\r
+* File NUMSYS_IMPL.H\r
+*\r
+*******************************************************************************\r
+*/\r
+\r
+#ifndef __NUMSYS_IMPL_H__\r
+#define __NUMSYS_IMPL_H__\r
+\r
+#include "unicode/utypes.h"\r
+\r
+#if !UCONFIG_NO_FORMATTING\r
+ \r
+#include "unicode/numsys.h"\r
+#include "uvector.h"\r
+#include "unicode/strenum.h"\r
+\r
+U_NAMESPACE_BEGIN\r
+\r
+class NumsysNameEnumeration : public StringEnumeration {\r
+public:\r
+ NumsysNameEnumeration(UVector *fNumsysNames, UErrorCode& status);\r
+ virtual ~NumsysNameEnumeration();\r
+ static UClassID U_EXPORT2 getStaticClassID(void);\r
+ virtual UClassID getDynamicClassID(void) const;\r
+ virtual const UnicodeString* snext(UErrorCode& status);\r
+ virtual void reset(UErrorCode& status);\r
+ virtual int32_t count(UErrorCode& status) const;\r
+private:\r
+ int32_t pos;\r
+ UVector *fNumsysNames;\r
+};\r
+\r
+U_NAMESPACE_END\r
+\r
+#endif\r
+\r
+#endif\r
CASE(49,TestExponentParse);
CASE(50,TestExplicitParents);
CASE(51,TestLenientParse);
+ CASE(52,TestAvailableNumberingSystems);
default: name = ""; break;
}
}
}
}
+
+/**
+ * Test available numbering systems API.
+ */
+void NumberFormatTest::TestAvailableNumberingSystems() {
+ UErrorCode status = U_ZERO_ERROR;
+ StringEnumeration *availableNumberingSystems = NumberingSystem::getAvailableNames(status);
+
+ int32_t nsCount = availableNumberingSystems->count(status);
+ if ( nsCount < 36 ) {
+ errln("FAIL: Didn't get as many numbering systems as we had hoped for. Need at least 36, got %d",nsCount);
+ }
+
+ /* A relatively simple test of the API. We call getAvailableNames() and cycle through */
+ /* each name returned, attempting to create a numbering system based on that name and */
+ /* verifying that the name returned from the resulting numbering system is the same */
+ /* one that we initially thought. */
+
+ int32_t len;
+ for ( int32_t i = 0 ; i < nsCount ; i++ ) {
+ const char *nsname = availableNumberingSystems->next(&len,status);
+ NumberingSystem* ns = NumberingSystem::createInstanceByName(nsname,status);
+ if ( uprv_strcmp(nsname,ns->getName()) ) {
+ errln("FAIL: Numbering system name didn't match for name = %s\n",nsname);
+ }
+ }
+}
#endif /* #if !UCONFIG_NO_FORMATTING */
void TestExponentParse();
void TestExplicitParents();
+ void TestAvailableNumberingSystems();
+
private: