diff options
Diffstat (limited to 'ini/ini_config.c')
-rw-r--r-- | ini/ini_config.c | 167 |
1 files changed, 166 insertions, 1 deletions
diff --git a/ini/ini_config.c b/ini/ini_config.c index 7ed82b1..f1e7cfd 100644 --- a/ini/ini_config.c +++ b/ini/ini_config.c @@ -24,16 +24,181 @@ #include <errno.h> #include <string.h> #include <stdlib.h> +#include <ctype.h> #include "config.h" #include "trace.h" #include "collection.h" #include "collection_tools.h" #include "path_utils.h" #include "ini_defines.h" -#include "ini_parse.h" #include "ini_metadata.h" #include "ini_config.h" +/* Temporarily move the parsing function here */ +/* THIS FUNCTION WILL BE REMOVED AS SOON AS WE SWITCH TO THE NEW INTERFACE */ +/* Reads a line from the file */ +int read_line(FILE *file, + char *buf, + int read_size, + char **key, char **value, + int *length, + int *ext_error) +{ + + char *res; + int len; + char *buffer; + int i; + char *eq; + + TRACE_FLOW_STRING("read_line", "Entry"); + + *ext_error = 0; + + buffer = buf; + + /* Get data from file */ + res = fgets(buffer, read_size - 1, file); + if (res == NULL) { + TRACE_ERROR_STRING("Read nothing", ""); + return RET_EOF; + } + + /* Make sure the buffer is NULL terminated */ + buffer[read_size - 1] = '\0'; + + len = strlen(buffer); + if (len == 0) { + TRACE_ERROR_STRING("Nothing was read.", ""); + return RET_EMPTY; + } + + /* Added \r just in case we deal with Windows in future */ + if ((buffer[len - 1] != '\n') && (buffer[len - 1] != '\r')) { + TRACE_ERROR_STRING("String it too big!", ""); + *ext_error = ERR_LONGDATA; + return RET_ERROR; + } + + /* Ingnore comments */ + if ((*buffer == ';') || (*buffer == '#')) { + TRACE_FLOW_STRING("Comment", buf); + return RET_COMMENT; + } + + TRACE_INFO_STRING("BUFFER before trimming:", buffer); + + /* Trucate trailing spaces and CRs */ + /* Make sure not to step before the beginning */ + while (len && isspace(buffer[len - 1])) { + buffer[len - 1] = '\0'; + len--; + } + + TRACE_INFO_STRING("BUFFER after trimming trailing spaces:", buffer); + + /* Trucate leading spaces */ + while (isspace(*buffer)) { + buffer++; + len--; + } + + TRACE_INFO_STRING("BUFFER after trimming leading spaces:", buffer); + TRACE_INFO_NUMBER("BUFFER length:", len); + + /* Empty line */ + if (len == 0) { + TRACE_FLOW_STRING("Empty line", buf); + return RET_EMPTY; + } + + /* Section */ + if (*buffer == '[') { + if (buffer[len-1] != ']') { + TRACE_ERROR_STRING("Invalid format for section", buf); + *ext_error = ERR_NOCLOSESEC; + return RET_ERROR; + } + buffer++; + len--; + while (isspace(*buffer)) { + buffer++; + len--; + } + if (len == 0) { + TRACE_ERROR_STRING("Invalid format for section", buf); + *ext_error = ERR_NOSECTION; + return RET_ERROR; + } + + buffer[len - 1] = '\0'; + len--; + while (isspace(buffer[len - 1])) { + buffer[len - 1] = '\0'; + len--; + } + if (len >= MAX_KEY) { + TRACE_ERROR_STRING("Section name is too long", buf); + *ext_error = ERR_SECTIONLONG; + return RET_ERROR; + } + + *key = buffer; + return RET_SECTION; + } + + /* Assume we are dealing with the K-V here */ + /* Find "=" */ + eq = strchr(buffer, '='); + if (eq == NULL) { + TRACE_ERROR_STRING("No equal sign", buf); + *ext_error = ERR_NOEQUAL; + return RET_INVALID; + } + + len -= eq-buffer; + + /* Strip spaces around "=" */ + i = eq - buffer - 1; + while ((i >= 0) && isspace(buffer[i])) i--; + if (i < 0) { + TRACE_ERROR_STRING("No key", buf); + *ext_error = ERR_NOKEY; + return RET_INVALID; + } + + /* Copy key into provided buffer */ + if(i >= MAX_KEY) { + TRACE_ERROR_STRING("Key name is too long", buf); + *ext_error = ERR_LONGKEY; + return RET_INVALID; + } + *key = buffer; + buffer[i + 1] = '\0'; + TRACE_INFO_STRING("KEY:", *key); + + eq++; + len--; + while (isspace(*eq)) { + eq++; + len--; + } + + *value = eq; + /* Make sure we include trailing 0 into data */ + *length = len + 1; + + TRACE_INFO_STRING("VALUE:", *value); + TRACE_INFO_NUMBER("LENGTH:", *length); + + TRACE_FLOW_STRING("read_line", "Exit"); + return RET_PAIR; +} + +/************************************************************/ +/* REMOVE FUNCTION ABOVE */ +/************************************************************/ + /***************************************************************************/ /* Function to read single ini file and pupulate |