Index: source/tools/gennorm2/n2builder.cpp |
diff --git a/source/tools/gennorm2/n2builder.cpp b/source/tools/gennorm2/n2builder.cpp |
index 843b1f703572f6075a8966e1c861090df77d8a33..a2c47f4a9dab6f55208ecfd154457e24b7d52f1e 100644 |
--- a/source/tools/gennorm2/n2builder.cpp |
+++ b/source/tools/gennorm2/n2builder.cpp |
@@ -1,7 +1,7 @@ |
/* |
******************************************************************************* |
* |
-* Copyright (C) 2009-2012, International Business Machines |
+* Copyright (C) 2009-2014, International Business Machines |
* Corporation and others. All Rights Reserved. |
* |
******************************************************************************* |
@@ -33,14 +33,14 @@ |
#include "unicode/uniset.h" |
#include "unicode/unistr.h" |
#include "unicode/ustring.h" |
+#include "charstr.h" |
#include "hash.h" |
#include "normalizer2impl.h" |
#include "toolutil.h" |
#include "unewdata.h" |
#include "utrie2.h" |
#include "uvectr32.h" |
- |
-#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) |
+#include "writesrc.h" |
#if !UCONFIG_NO_NORMALIZATION |
@@ -70,7 +70,7 @@ public: |
HangulIterator() : rangeIndex(0) {} |
const Range *nextRange() { |
- if(rangeIndex<LENGTHOF(ranges)) { |
+ if(rangeIndex<UPRV_LENGTHOF(ranges)) { |
return ranges+rangeIndex++; |
} else { |
return NULL; |
@@ -170,7 +170,8 @@ enumRangeHandler(const void *context, UChar32 start, UChar32 end, uint32_t value |
U_CDECL_END |
Normalizer2DataBuilder::Normalizer2DataBuilder(UErrorCode &errorCode) : |
- phase(0), overrideHandling(OVERRIDE_PREVIOUS), optimization(OPTIMIZE_NORMAL) { |
+ phase(0), overrideHandling(OVERRIDE_PREVIOUS), optimization(OPTIMIZE_NORMAL), |
+ norm16TrieLength(0) { |
memset(unicodeVersion, 0, sizeof(unicodeVersion)); |
normTrie=utrie2_open(0, 0, &errorCode); |
normMem=utm_open("gennorm2 normalization structs", 10000, 0x110100, sizeof(Norm)); |
@@ -1145,23 +1146,15 @@ void Normalizer2DataBuilder::processData() { |
if(minCP>=0x10000) { |
indexes[Normalizer2Impl::IX_MIN_COMP_NO_MAYBE_CP]=U16_LEAD(minCP); |
} |
-} |
- |
-void Normalizer2DataBuilder::writeBinaryFile(const char *filename) { |
- processData(); |
- IcuToolErrorCode errorCode("gennorm2/writeBinaryFile()"); |
utrie2_freeze(norm16Trie, UTRIE2_16_VALUE_BITS, errorCode); |
- int32_t norm16TrieLength=utrie2_serialize(norm16Trie, NULL, 0, errorCode); |
+ norm16TrieLength=utrie2_serialize(norm16Trie, NULL, 0, errorCode); |
if(errorCode.get()!=U_BUFFER_OVERFLOW_ERROR) { |
fprintf(stderr, "gennorm2 error: unable to freeze/serialize the normalization trie - %s\n", |
errorCode.errorName()); |
exit(errorCode.reset()); |
} |
errorCode.reset(); |
- LocalArray<uint8_t> norm16TrieBytes(new uint8_t[norm16TrieLength]); |
- utrie2_serialize(norm16Trie, norm16TrieBytes.getAlias(), norm16TrieLength, errorCode); |
- errorCode.assertSuccess(); |
int32_t offset=(int32_t)sizeof(indexes); |
indexes[Normalizer2Impl::IX_NORM_TRIE_OFFSET]=offset; |
@@ -1194,6 +1187,16 @@ void Normalizer2DataBuilder::writeBinaryFile(const char *filename) { |
u_versionFromString(unicodeVersion, U_UNICODE_VERSION); |
} |
memcpy(dataInfo.dataVersion, unicodeVersion, 4); |
+} |
+ |
+void Normalizer2DataBuilder::writeBinaryFile(const char *filename) { |
+ processData(); |
+ |
+ IcuToolErrorCode errorCode("gennorm2/writeBinaryFile()"); |
+ LocalArray<uint8_t> norm16TrieBytes(new uint8_t[norm16TrieLength]); |
+ utrie2_serialize(norm16Trie, norm16TrieBytes.getAlias(), norm16TrieLength, errorCode); |
+ errorCode.assertSuccess(); |
+ |
UNewDataMemory *pData= |
udata_create(NULL, NULL, filename, &dataInfo, |
haveCopyright ? U_COPYRIGHT_STRING : NULL, errorCode); |
@@ -1211,6 +1214,7 @@ void Normalizer2DataBuilder::writeBinaryFile(const char *filename) { |
fprintf(stderr, "gennorm2: error %s writing the output file\n", errorCode.errorName()); |
exit(errorCode.reset()); |
} |
+ int32_t totalSize=indexes[Normalizer2Impl::IX_TOTAL_SIZE]; |
if(writtenSize!=totalSize) { |
fprintf(stderr, "gennorm2 error: written size %ld != calculated size %ld\n", |
(long)writtenSize, (long)totalSize); |
@@ -1218,6 +1222,74 @@ void Normalizer2DataBuilder::writeBinaryFile(const char *filename) { |
} |
} |
+void |
+Normalizer2DataBuilder::writeCSourceFile(const char *filename) { |
+ processData(); |
+ |
+ IcuToolErrorCode errorCode("gennorm2/writeCSourceFile()"); |
+ const char *basename=findBasename(filename); |
+ CharString path(filename, (int32_t)(basename-filename), errorCode); |
+ CharString dataName(basename, errorCode); |
+ const char *extension=strrchr(basename, '.'); |
+ if(extension!=NULL) { |
+ dataName.truncate((int32_t)(extension-basename)); |
+ } |
+ errorCode.assertSuccess(); |
+ |
+ LocalArray<uint8_t> norm16TrieBytes(new uint8_t[norm16TrieLength]); |
+ utrie2_serialize(norm16Trie, norm16TrieBytes.getAlias(), norm16TrieLength, errorCode); |
+ errorCode.assertSuccess(); |
+ |
+ FILE *f=usrc_create(path.data(), basename, "icu/source/tools/gennorm2/n2builder.cpp"); |
+ if(f==NULL) { |
+ fprintf(stderr, "gennorm2/writeCSourceFile() error: unable to create the output file %s\n", |
+ filename); |
+ exit(U_FILE_ACCESS_ERROR); |
+ return; |
+ } |
+ char line[100]; |
+ sprintf(line, "static const UVersionInfo %s_formatVersion={", dataName.data()); |
+ usrc_writeArray(f, line, dataInfo.formatVersion, 8, 4, "};\n"); |
+ sprintf(line, "static const UVersionInfo %s_dataVersion={", dataName.data()); |
+ usrc_writeArray(f, line, dataInfo.dataVersion, 8, 4, "};\n\n"); |
+ sprintf(line, "static const int32_t %s_indexes[Normalizer2Impl::IX_COUNT]={\n", |
+ dataName.data()); |
+ usrc_writeArray(f, |
+ line, |
+ indexes, 32, Normalizer2Impl::IX_COUNT, |
+ "\n};\n\n"); |
+ sprintf(line, "static const uint16_t %s_trieIndex[%%ld]={\n", dataName.data()); |
+ usrc_writeUTrie2Arrays(f, |
+ line, NULL, |
+ norm16Trie, |
+ "\n};\n\n"); |
+ sprintf(line, "static const uint16_t %s_extraData[%%ld]={\n", dataName.data()); |
+ usrc_writeArray(f, |
+ line, |
+ extraData.getBuffer(), 16, extraData.length(), |
+ "\n};\n\n"); |
+ sprintf(line, "static const uint8_t %s_smallFCD[%%ld]={\n", dataName.data()); |
+ usrc_writeArray(f, |
+ line, |
+ smallFCD, 8, sizeof(smallFCD), |
+ "\n};\n\n"); |
+ /*fputs( // TODO |
+ "static const UCaseProps %s_singleton={\n" |
+ " NULL,\n" |
+ " %s_indexes,\n" |
+ " %s_extraData,\n" |
+ " %s_smallFCD,\n", |
+ f);*/ |
+ sprintf(line, "static const UTrie2 %s_trie={\n", dataName.data()); |
+ char line2[100]; |
+ sprintf(line2, "%s_trieIndex", dataName.data()); |
+ usrc_writeUTrie2Struct(f, |
+ line, |
+ norm16Trie, line2, NULL, |
+ "};\n"); |
+ fclose(f); |
+} |
+ |
U_NAMESPACE_END |
#endif /* #if !UCONFIG_NO_NORMALIZATION */ |