X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=blobdiff_plain;f=src%2FConfigParser.c;h=050d6b48d77fbc11fe6a328df76eb5ce0861393c;hp=f87081b7fa173fd3f01f2ecdca6233c5c5cb5eaf;hb=HEAD;hpb=44436a96352a38631237978c9fd431cef3d85cfb diff --git a/src/ConfigParser.c b/src/ConfigParser.c index f87081b..050d6b4 100644 --- a/src/ConfigParser.c +++ b/src/ConfigParser.c @@ -1,5 +1,5 @@ -/* ConfigParser.c - NeonServ v5.3 - * 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);