diff --git a/icu4c/source/tools/pkgdata/pkgdata.cpp b/icu4c/source/tools/pkgdata/pkgdata.cpp index 54c8d06d7a9..9819dd93fe6 100644 --- a/icu4c/source/tools/pkgdata/pkgdata.cpp +++ b/icu4c/source/tools/pkgdata/pkgdata.cpp @@ -99,6 +99,7 @@ U_CDECL_END #define LARGE_BUFFER_MAX_SIZE 2048 #define SMALL_BUFFER_MAX_SIZE 512 +#define SMALL_BUFFER_FLAG_NAMES 32 #define BUFFER_PADDING_SIZE 20 static void loadLists(UPKGOptions *o, UErrorCode *status); @@ -187,6 +188,7 @@ static UOption options[]={ /*19*/ UOPTION_DEF( "quiet", 'q', UOPT_NO_ARG) }; +/* This enum and the following char array should be kept in sync. */ enum { GENCCODE_ASSEMBLY_TYPE, SO_EXT, @@ -207,6 +209,25 @@ enum { INSTALL_CMD, PKGDATA_FLAGS_SIZE }; +static const char* FLAG_NAMES[PKGDATA_FLAGS_SIZE] = { + "GENCCODE_ASSEMBLY_TYPE", + "SO", + "SOBJ", + "A", + "LIBPREFIX", + "LIB_EXT_ORDER", + "COMPILE", + "LIBFLAGS", + "GENLIB", + "LDICUDTFLAGS", + "LD_SONAME", + "RPATH_FLAGS", + "BIR_LDFLAGS", + "AR", + "ARFLAGS", + "RANLIB", + "INSTALL_CMD" +}; static char **pkgDataFlags = NULL; enum { @@ -789,7 +810,7 @@ static int32_t initializePkgDataFlags(UPKGOptions *o) { fprintf(stdout, "# Reading options file %s\n", o->options); } status = U_ZERO_ERROR; - tmpResult = parseFlagsFile(o->options, pkgDataFlags, currentBufferSize, (int32_t)PKGDATA_FLAGS_SIZE, &status); + tmpResult = parseFlagsFile(o->options, pkgDataFlags, currentBufferSize, FLAG_NAMES, (int32_t)PKGDATA_FLAGS_SIZE, &status); if (status == U_BUFFER_OVERFLOW_ERROR) { for (int32_t i = 0; i < PKGDATA_FLAGS_SIZE; i++) { uprv_free(pkgDataFlags[i]); @@ -801,9 +822,9 @@ static int32_t initializePkgDataFlags(UPKGOptions *o) { } #endif if(o->verbose) { - fprintf(stdout, "# pkgDataFlags="); - for(int32_t i=0;i0)?',':' ',pkgDataFlags[i]); + fprintf(stdout, "# pkgDataFlags=\n"); + for(int32_t i=0;i= 0) { + uprv_strcpy(flagBuffer[index], tmpFlagBuffer); + } else { + /* No match found. Skip it. */ + continue; + } + } else { + uprv_strcpy(flagBuffer[i++], tmpFlagBuffer); + } } } } } while (allocateMoreSpace && U_SUCCESS(*status)); + uprv_free(tmpFlagBuffer); uprv_free(buffer); T_FileStream_close(f); @@ -88,8 +105,8 @@ parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize, /* * Extract the setting after the '=' and store it in flag excluding the newline character. */ -static void extractFlag(char* buffer, int32_t bufferSize, char* flag, int32_t flagSize, UErrorCode *status) { - int32_t i; +static int32_t extractFlag(char* buffer, int32_t bufferSize, char* flag, int32_t flagSize, const char **flagNames, int32_t numOfFlags, UErrorCode *status) { + int32_t i, index = -1; char *pBuffer; int32_t offset; UBool bufferWritten = FALSE; @@ -101,7 +118,7 @@ static void extractFlag(char* buffer, int32_t bufferSize, char* flag, int32_t fl for(i = 0;;i++) { if (i >= flagSize) { *status = U_BUFFER_OVERFLOW_ERROR; - return; + return -1; } if (pBuffer[i+1] == 0) { /* Indicates a new line character. End here. */ @@ -119,6 +136,18 @@ static void extractFlag(char* buffer, int32_t bufferSize, char* flag, int32_t fl if (!bufferWritten) { flag[0] = 0; } + + if (flagNames != NULL) { + offset--; /* Move offset back 1 because of '='*/ + for (i = 0; i < numOfFlags; i++) { + if (uprv_strncmp(buffer, flagNames[i], offset) == 0) { + index = i; + break; + } + } + } + + return index; } /* diff --git a/icu4c/source/tools/toolutil/flagparser.h b/icu4c/source/tools/toolutil/flagparser.h index 64056ed7a79..32a51e3d2ac 100644 --- a/icu4c/source/tools/toolutil/flagparser.h +++ b/icu4c/source/tools/toolutil/flagparser.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2009-2010, International Business Machines +* Copyright (C) 2009-2011, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -25,6 +25,6 @@ #include "unicode/utypes.h" U_CAPI int32_t U_EXPORT2 -parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize, int32_t numOfFlags, UErrorCode *status); +parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize, const char ** flagNames, int32_t numOfFlags, UErrorCode *status); #endif