summaryrefslogtreecommitdiffstats
path: root/ini/ini_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'ini/ini_config.c')
-rw-r--r--ini/ini_config.c167
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