Merge branch 'development'
[NeonServV5.git] / src / ConfigParser.c
index 061e2488d34d35c7fd66bf21c09292dd42554572..050d6b48d77fbc11fe6a328df76eb5ce0861393c 100644 (file)
@@ -1,5 +1,5 @@
-/* ConfigParser.c - NeonServ v5.2
- * Copyright (C) 2011  Philipp Kreil (pk910)
+/* ConfigParser.c - NeonServ v5.6
+ * Copyright (C) 2011-2012  Philipp Kreil (pk910)
  * 
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -16,6 +16,7 @@
  */
 
 #include "ConfigParser.h"
+#include "tools.h"
 
 #define ENTRYTYPE_BLOCK   1
 #define ENTRYTYPE_STRING  2
@@ -156,9 +157,15 @@ static char *parse_config_recursive(struct ConfigEntry *centry, char *buffer, in
         }
         if(flags & PARSER_FLAG_COMMAND) {
             int found_command = 0;
+            char *tmp_buffer;
             switch(*buffer) {
                 case '/':
-                    buffer = strstr(buffer, "\n");
+                    tmp_buffer = buffer;
+                    buffer = strchr(buffer, '\r');
+                    if(!buffer)
+                        buffer = strchr(tmp_buffer, '\n');
+                    if(!buffer)
+                        buffer = tmp_buffer + strlen(tmp_buffer)-1;
                     found_command = 1;
                     break;
                 case '*':
@@ -299,6 +306,52 @@ char *get_string_field(char *field_path) {
         return NULL;
 }
 
+char **get_all_fieldnames(char *block_path) {
+    struct ConfigEntry *centry = root_entry;
+    char *a, *b = block_path;
+    struct ConfigEntry *subentry;
+    while((a = strstr(b, ".")) && centry) {
+        if(centry->type == ENTRYTYPE_BLOCK) {
+            int found = 0;
+            for(subentry = centry->value; subentry; subentry = subentry->next) {
+                if(!stricmplen(subentry->name, b, a-b)) {
+                    centry = subentry;
+                    found = 1;
+                    break;
+                }
+            }
+            if(!found)
+                return NULL;
+        } else
+            return NULL;
+        b = a+1;
+    }
+    if(centry->type == ENTRYTYPE_BLOCK) {
+        int found = 0;
+        for(subentry = centry->value; subentry; subentry = subentry->next) {
+            if(!stricmp(subentry->name, b)) {
+                centry = subentry;
+                found = 1;
+                break;
+            }
+        }
+        if(!found)
+            return NULL;
+    } else
+        return NULL;
+    if(centry->type != ENTRYTYPE_BLOCK) return NULL;
+    int count = 0;
+    for(subentry = centry->value; subentry; subentry = subentry->next) {
+        count++;
+    }
+    char **fieldnames = calloc(count+1, sizeof(char *));
+    count = 0;
+    for(subentry = centry->value; subentry; subentry = subentry->next) {
+        fieldnames[count++] = subentry->name;
+    }
+    return fieldnames;
+}
+
 void free_loaded_config() {
     if(root_entry) {
         free_entry_rekursiv(root_entry, 1);