Index: icu46/source/tools/toolutil/flagparser.c |
=================================================================== |
--- icu46/source/tools/toolutil/flagparser.c (revision 0) |
+++ icu46/source/tools/toolutil/flagparser.c (revision 0) |
@@ -0,0 +1,142 @@ |
+/****************************************************************************** |
+ * Copyright (C) 2009-2010, International Business Machines |
+ * Corporation and others. All Rights Reserved. |
+ ******************************************************************************* |
+ */ |
+ |
+#include "flagparser.h" |
+#include "filestrm.h" |
+#include "cstring.h" |
+#include "cmemory.h" |
+ |
+#define DEFAULT_BUFFER_SIZE 512 |
+ |
+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 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) { |
+ char* buffer = uprv_malloc(sizeof(char) * currentBufferSize); |
+ UBool allocateMoreSpace = FALSE; |
+ int32_t i; |
+ int32_t result = 0; |
+ |
+ FileStream *f = T_FileStream_open(fileName, "r"); |
+ if (f == NULL) { |
+ *status = U_FILE_ACCESS_ERROR; |
+ return -1; |
+ } |
+ |
+ if (buffer == NULL) { |
+ *status = U_MEMORY_ALLOCATION_ERROR; |
+ return -1; |
+ } |
+ |
+ do { |
+ if (allocateMoreSpace) { |
+ allocateMoreSpace = FALSE; |
+ currentBufferSize *= 2; |
+ uprv_free(buffer); |
+ buffer = uprv_malloc(sizeof(char) * currentBufferSize); |
+ if (buffer == NULL) { |
+ *status = U_MEMORY_ALLOCATION_ERROR; |
+ return -1; |
+ } |
+ } |
+ for (i = 0; i < numOfFlags; i++) { |
+ if (T_FileStream_readLine(f, buffer, currentBufferSize) == NULL) { |
+ *status = U_FILE_ACCESS_ERROR; |
+ break; |
+ } |
+ |
+ if (uprv_strlen(buffer) == (currentBufferSize - 1) && buffer[currentBufferSize-2] != '\n') { |
+ /* Allocate more space for buffer if it didnot read the entrire line */ |
+ allocateMoreSpace = TRUE; |
+ T_FileStream_rewind(f); |
+ break; |
+ } else { |
+ extractFlag(buffer, currentBufferSize, flagBuffer[i], flagBufferSize, status); |
+ if (U_FAILURE(*status)) { |
+ if (*status == U_BUFFER_OVERFLOW_ERROR) { |
+ result = currentBufferSize; |
+ } else { |
+ result = -1; |
+ } |
+ break; |
+ } |
+ } |
+ } |
+ } while (allocateMoreSpace && U_SUCCESS(*status)); |
+ |
+ uprv_free(buffer); |
+ |
+ T_FileStream_close(f); |
+ |
+ if (U_SUCCESS(*status) && result == 0) { |
+ currentBufferSize = DEFAULT_BUFFER_SIZE; |
+ } |
+ |
+ return result; |
+} |
+ |
+ |
+/* |
+ * 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; |
+ char *pBuffer; |
+ int32_t offset; |
+ UBool bufferWritten = FALSE; |
+ |
+ if (buffer[0] != 0) { |
+ /* Get the offset (i.e. position after the '=') */ |
+ offset = getFlagOffset(buffer, bufferSize); |
+ pBuffer = buffer+offset; |
+ for(i = 0;;i++) { |
+ if (i >= flagSize) { |
+ *status = U_BUFFER_OVERFLOW_ERROR; |
+ return; |
+ } |
+ if (pBuffer[i+1] == 0) { |
+ /* Indicates a new line character. End here. */ |
+ flag[i] = 0; |
+ break; |
+ } |
+ |
+ flag[i] = pBuffer[i]; |
+ if (i == 0) { |
+ bufferWritten = TRUE; |
+ } |
+ } |
+ } |
+ |
+ if (!bufferWritten) { |
+ flag[0] = 0; |
+ } |
+} |
+ |
+/* |
+ * Get the position after the '=' character. |
+ */ |
+static int32_t getFlagOffset(const char *buffer, int32_t bufferSize) { |
+ int32_t offset = 0; |
+ |
+ for (offset = 0; offset < bufferSize;offset++) { |
+ if (buffer[offset] == '=') { |
+ offset++; |
+ break; |
+ } |
+ } |
+ |
+ if (offset == bufferSize || (offset - 1) == bufferSize) { |
+ offset = 0; |
+ } |
+ |
+ return offset; |
+} |
Property changes on: icu46/source/tools/toolutil/flagparser.c |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |