+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;
+}
+