]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/tools/toolutil/flagparser.c
ICU-491.11.1.tar.gz
[apple/icu.git] / icuSources / tools / toolutil / flagparser.c
index 41ec9c9ce6105638f16883bb8cefb79e1d896320..318cfd974416cc7d08b84be0bf2ff6116d2b0b34 100644 (file)
@@ -1,5 +1,5 @@
 /******************************************************************************
- *   Copyright (C) 2009-2010, International Business Machines
+ *   Copyright (C) 2009-2011, International Business Machines
  *   Corporation and others.  All Rights Reserved.
  *******************************************************************************
  */
 
 static int32_t currentBufferSize = DEFAULT_BUFFER_SIZE;
 
-static void extractFlag(char* buffer, int32_t bufferSize, char* flag, int32_t flagSize, UErrorCode *status);
+static int32_t extractFlag(char* buffer, int32_t bufferSize, char* flag, int32_t flagSize, const char ** flagNames, int32_t numOfFlags, UErrorCode *status);
 static int32_t getFlagOffset(const char *buffer, int32_t bufferSize);
 
 /*
  * Opens the given fileName and reads in the information storing the data in flagBuffer.
  */
 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) {
     char* buffer = uprv_malloc(sizeof(char) * currentBufferSize);
+    char* tmpFlagBuffer = uprv_malloc(sizeof(char) * flagBufferSize);
     UBool allocateMoreSpace = FALSE;
-    int32_t i;
+    int32_t index, i;
     int32_t result = 0;
 
     FileStream *f = T_FileStream_open(fileName, "r");
@@ -44,15 +45,19 @@ parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize,
             uprv_free(buffer);
             buffer = uprv_malloc(sizeof(char) * currentBufferSize);
             if (buffer == NULL) {
+                uprv_free(tmpFlagBuffer);
                 *status = U_MEMORY_ALLOCATION_ERROR;
                 return -1;
             }
         }
-        for (i = 0; i < numOfFlags; i++) {
+        for (i = 0; i < numOfFlags;) {
             if (T_FileStream_readLine(f, buffer, currentBufferSize) == NULL) {
-                *status = U_FILE_ACCESS_ERROR;
+                /* End of file reached. */
                 break;
             }
+            if (buffer[0] == '#') {
+                continue;
+            }
 
             if (uprv_strlen(buffer) == (currentBufferSize - 1) && buffer[currentBufferSize-2] != '\n') {
                 /* Allocate more space for buffer if it didnot read the entrire line */
@@ -60,7 +65,7 @@ parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize,
                 T_FileStream_rewind(f);
                 break;
             } else {
-                extractFlag(buffer, currentBufferSize, flagBuffer[i], flagBufferSize, status);
+                index = extractFlag(buffer, currentBufferSize, tmpFlagBuffer, flagBufferSize, flagNames, numOfFlags, status);
                 if (U_FAILURE(*status)) {
                     if (*status == U_BUFFER_OVERFLOW_ERROR) {
                         result = currentBufferSize;
@@ -68,11 +73,23 @@ parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize,
                         result = -1;
                     }
                     break;
+                } else {
+                    if (flagNames != NULL) {
+                        if (index >= 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,10 +105,10 @@ 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;
+    int32_t offset=0;
     UBool bufferWritten = FALSE;
 
     if (buffer[0] != 0) {
@@ -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>0) {
+        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;
 }
 
 /*