]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/tools/toolutil/flagparser.c
ICU-57132.0.1.tar.gz
[apple/icu.git] / icuSources / tools / toolutil / flagparser.c
index 318cfd974416cc7d08b84be0bf2ff6116d2b0b34..fac18e2ffdb28c878b86d96607c259b315c6cfb1 100644 (file)
@@ -1,5 +1,5 @@
 /******************************************************************************
- *   Copyright (C) 2009-2011, International Business Machines
+ *   Copyright (C) 2009-2015, International Business Machines
  *   Corporation and others.  All Rights Reserved.
  *******************************************************************************
  */
@@ -21,21 +21,24 @@ static int32_t getFlagOffset(const char *buffer, int32_t bufferSize);
  */
 U_CAPI int32_t U_EXPORT2
 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);
+    char* buffer = NULL;
+    char* tmpFlagBuffer = NULL;
     UBool allocateMoreSpace = FALSE;
-    int32_t index, i;
+    int32_t idx, i;
     int32_t result = 0;
 
     FileStream *f = T_FileStream_open(fileName, "r");
     if (f == NULL) {
         *status = U_FILE_ACCESS_ERROR;
-        return -1;
+        goto parseFlagsFile_cleanup;
     }
+    
+    buffer = uprv_malloc(sizeof(char) * currentBufferSize);
+    tmpFlagBuffer = uprv_malloc(sizeof(char) * flagBufferSize);
 
-    if (buffer == NULL) {
+    if (buffer == NULL || tmpFlagBuffer == NULL) {
         *status = U_MEMORY_ALLOCATION_ERROR;
-        return -1;
+        goto parseFlagsFile_cleanup;
     }
 
     do {
@@ -45,9 +48,8 @@ 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;
+                goto parseFlagsFile_cleanup;
             }
         }
         for (i = 0; i < numOfFlags;) {
@@ -65,7 +67,7 @@ parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize,
                 T_FileStream_rewind(f);
                 break;
             } else {
-                index = extractFlag(buffer, currentBufferSize, tmpFlagBuffer, flagBufferSize, flagNames, numOfFlags, status);
+                idx = extractFlag(buffer, currentBufferSize, tmpFlagBuffer, flagBufferSize, flagNames, numOfFlags, status);
                 if (U_FAILURE(*status)) {
                     if (*status == U_BUFFER_OVERFLOW_ERROR) {
                         result = currentBufferSize;
@@ -75,8 +77,8 @@ parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize,
                     break;
                 } else {
                     if (flagNames != NULL) {
-                        if (index >= 0) {
-                            uprv_strcpy(flagBuffer[index], tmpFlagBuffer);
+                        if (idx >= 0) {
+                            uprv_strcpy(flagBuffer[idx], tmpFlagBuffer);
                         } else {
                             /* No match found.  Skip it. */
                             continue;
@@ -89,10 +91,15 @@ parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize,
         }
     } while (allocateMoreSpace && U_SUCCESS(*status));
 
+parseFlagsFile_cleanup:
     uprv_free(tmpFlagBuffer);
     uprv_free(buffer);
 
     T_FileStream_close(f);
+    
+    if (U_FAILURE(*status) && *status != U_BUFFER_OVERFLOW_ERROR) {
+        return -1;
+    }
 
     if (U_SUCCESS(*status) && result == 0) {
         currentBufferSize = DEFAULT_BUFFER_SIZE;
@@ -106,7 +113,7 @@ parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize,
  * Extract the setting after the '=' and store it in flag excluding the newline character.
  */
 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;
+    int32_t i, idx = -1;
     char *pBuffer;
     int32_t offset=0;
     UBool bufferWritten = FALSE;
@@ -141,13 +148,13 @@ static int32_t extractFlag(char* buffer, int32_t bufferSize, char* flag, int32_t
         offset--;  /* Move offset back 1 because of '='*/
         for (i = 0; i < numOfFlags; i++) {
             if (uprv_strncmp(buffer, flagNames[i], offset) == 0) {
-                index = i;
+                idx = i;
                 break;
             }
         }
     }
 
-    return index;
+    return idx;
 }
 
 /*