src/server/config/serverconfig.c

changeset 419
f1d29785ad2d
parent 418
b7dcc9c4f270
child 422
76f2f5d532d0
--- a/src/server/config/serverconfig.c	Mon Nov 07 17:59:44 2022 +0100
+++ b/src/server/config/serverconfig.c	Mon Nov 07 22:30:12 2022 +0100
@@ -294,6 +294,12 @@
                     obj->text_begin = new_textbegin;
                 } else {
                     // normal line containing a directive, space or comment
+                    
+                    // add it to parent node
+                    current->text_begin = line_cp;
+                    CFG_NODE_ADD(&parent->children_begin, &parent->children_end, current);
+                    
+                    // validate after CFG_NODE_ADD, because now current->prev is set
                     if(current->type == CONFIG_NODE_DIRECTIVE &&
                        parser->validateDirective &&
                        parser->validateDirective(parser, current))
@@ -301,9 +307,6 @@
                         err = 1;
                         break;
                     }
-                    // add it to parent node
-                    current->text_begin = line_cp;
-                    CFG_NODE_ADD(&parent->children_begin, &parent->children_end, current);
                 }
                 
                 // obj points to the previous node that started as a directive
@@ -478,3 +481,26 @@
     }
     return 0;
 }
+
+ConfigNode* serverconfig_previous_dir_or_obj(ConfigNode *node) {
+    node = node->prev;
+    while(node) {
+        if(node->type == CONFIG_NODE_DIRECTIVE || node->type == CONFIG_NODE_OBJECT) {
+            return node;
+        }
+        node = node->prev;
+    }
+    return NULL;
+}
+
+size_t serverconfig_children_count(ConfigNode *node, ConfigNodeType type) {
+    size_t count = 0;
+    node = node->children_begin;
+    while(node) {
+        if(node->type == type) {
+            count++;
+        }
+        node = node->next;
+    }
+    return count;
+}

mercurial