/****************************************************************************** * Copyright (C) 2009, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* */ #include "flagparser.h" #include "filestrm.h" #define LARGE_BUFFER_MAX_SIZE 2048 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 void U_EXPORT2 parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize, int32_t numOfFlags, UErrorCode *status) { char buffer[LARGE_BUFFER_MAX_SIZE]; int32_t i; FileStream *f = T_FileStream_open(fileName, "r"); if (f == NULL) { *status = U_FILE_ACCESS_ERROR; return; } for (i = 0; i < numOfFlags; i++) { if (T_FileStream_readLine(f, buffer, LARGE_BUFFER_MAX_SIZE) == NULL) { *status = U_FILE_ACCESS_ERROR; break; } extractFlag(buffer, LARGE_BUFFER_MAX_SIZE, flagBuffer[i], flagBufferSize, status); if (U_FAILURE(*status)) { break; } } T_FileStream_close(f); } /* * 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; }