From 07111b3ca9344eb2e619442aa2c12c68c69660e4 Mon Sep 17 00:00:00 2001 From: Markus Scherer Date: Fri, 26 Sep 2003 20:50:41 +0000 Subject: [PATCH] ICU-2235 leave the string table in data.h order so that swapping need not resort it, and swapping testing can still test for identity X-SVN-Rev: 13222 --- icu4c/source/tools/genpname/genpname.cpp | 74 +++++++++++------------- 1 file changed, 35 insertions(+), 39 deletions(-) diff --git a/icu4c/source/tools/genpname/genpname.cpp b/icu4c/source/tools/genpname/genpname.cpp index de671be4c97..3b3db171d0d 100644 --- a/icu4c/source/tools/genpname/genpname.cpp +++ b/icu4c/source/tools/genpname/genpname.cpp @@ -9,13 +9,13 @@ */ #include -#include #include "unicode/utypes.h" #include "unicode/putil.h" #include "unicode/uclean.h" #include "cmemory.h" #include "cstring.h" #include "filestrm.h" +#include "uarrsort.h" #include "unewdata.h" #include "uoptions.h" #include "uprops.h" @@ -215,9 +215,12 @@ public: NameToEnumEntry(int32_t a, int32_t b) { nameIndex=a; enumValue=b; } }; -// Sort function for NameToEnumEntry (sort by name index) -U_CAPI int compareNameToEnumEntry(const void* e1, const void* e2) { - return ((NameToEnumEntry*)e1)->nameIndex - ((NameToEnumEntry*)e2)->nameIndex; +// Sort function for NameToEnumEntry (sort by name) +U_CAPI int32_t +compareNameToEnumEntry(const void * /*context*/, const void* e1, const void* e2) { + return + STRING_TABLE[((NameToEnumEntry*)e1)->nameIndex]. + compare(STRING_TABLE[((NameToEnumEntry*)e2)->nameIndex]); } //---------------------------------------------------------------------- @@ -246,7 +249,8 @@ public: }; // Sort function for EnumToNameGroupEntry (sort by name index) -U_CAPI int compareEnumToNameGroupEntry(const void* e1, const void* e2) { +U_CAPI int32_t +compareEnumToNameGroupEntry(const void * /*context*/, const void* e1, const void* e2) { return ((EnumToNameGroupEntry*)e1)->enumValue - ((EnumToNameGroupEntry*)e2)->enumValue; } @@ -277,7 +281,8 @@ public: }; // Sort function for EnumToValueEntry (sort by enum) -U_CAPI int compareEnumToValueEntry(const void* e1, const void* e2) { +U_CAPI int32_t +compareEnumToValueEntry(const void * /*context*/, const void* e1, const void* e2) { return ((EnumToValueEntry*)e1)->enumValue - ((EnumToValueEntry*)e2)->enumValue; } @@ -898,11 +903,6 @@ static UDataInfo dataInfo = { {VERSION_0, VERSION_1, VERSION_2, VERSION_3} /* Unicode version */ }; -// Glue for C<->C++ -U_CAPI int compareAliasNames(const void* elem1, const void* elem2) { - return ((const AliasName*)elem1)->compare(*(const AliasName*)elem2); -} - class genpname { // command-line options @@ -977,8 +977,14 @@ NameToEnumEntry* genpname::createNameIndex(const AliasList& list, NameToEnumEntry(names[j], p.enumValue); } } - qsort((void*) nameIndex, nameIndexCount, sizeof(nameIndex[0]), - compareNameToEnumEntry); + + /* + * use a stable sort to ensure consistent results between + * genpname.cpp and the propname.cpp swapping code + */ + UErrorCode errorCode = U_ZERO_ERROR; + uprv_sortArray(nameIndex, nameIndexCount, sizeof(nameIndex[0]), + compareNameToEnumEntry, NULL, TRUE, &errorCode); if (debug>1) { printf("Alias names: %d\n", nameIndexCount); for (i=0; i1) { printf("Property enums: %d\n", count); for (i=0; i1) { printf("String pool: %d\n", STRING_COUNT); - } - for (i=0; i1) { - if (i != 0) printf(", "); + for (i=0; i1) { printf("\n\n"); } - // ------------------------------------------------------------ - // Fixup the NAME_GROUP indices so they match the sorted order - for (i=0; i