Bläddra i källkod

entry: Parse ENTRY within XML file

Serj Kalichev 2 år sedan
förälder
incheckning
a536787e4d
1 ändrade filer med 119 tillägg och 4 borttagningar
  1. 119 4
      klish/xml-helper/load.c

+ 119 - 4
klish/xml-helper/load.c

@@ -37,7 +37,8 @@ static kxml_process_fn
 	process_ptype,
 	process_plugin,
 	process_nspace,
-	process_klish;
+	process_klish,
+	process_entry;
 
 // Different TAGs types
 typedef enum {
@@ -53,7 +54,8 @@ typedef enum {
 	KTAG_PLUGIN,
 	KTAG_NSPACE,
 	KTAG_KLISH,
-	KTAG_MAX
+	KTAG_ENTRY,
+	KTAG_MAX,
 } ktags_e;
 
 static const char * const kxml_tags[] = {
@@ -68,7 +70,8 @@ static const char * const kxml_tags[] = {
 	"PTYPE",
 	"PLUGIN",
 	"NSPACE",
-	"KLISH"
+	"KLISH",
+	"ENTRY",
 };
 
 static kxml_process_fn *kxml_handlers[] = {
@@ -83,7 +86,8 @@ static kxml_process_fn *kxml_handlers[] = {
 	process_ptype,
 	process_plugin,
 	process_nspace,
-	process_klish
+	process_klish,
+	process_entry,
 };
 
 
@@ -621,6 +625,17 @@ static bool_t process_action(const kxml_node_t *element, void *parent,
 			kaction_free(action);
 			goto err;
 		}
+	} else if (KTAG_ENTRY == parent_tag) {
+		kentry_t *entry = (kentry_t *)parent;
+		if (!kentry_add_action(entry, action)) {
+			faux_error_sprintf(error,
+				TAG": Can't add ACTION #%d to ENTRY \"%s\". "
+				"Probably duplication",
+				kentry_actions_len(entry) + 1,
+				kentry_name(entry));
+			kaction_free(action);
+			goto err;
+		}
 	} else {
 		faux_error_sprintf(error,
 			TAG": Tag \"%s\" can't contain ACTION tag",
@@ -685,3 +700,103 @@ err:
 
 	return res;
 }
+
+
+static bool_t process_entry(const kxml_node_t *element, void *parent,
+	faux_error_t *error)
+{
+	ientry_t ientry = {};
+	kentry_t *entry = NULL;
+	bool_t res = BOOL_FALSE;
+	ktags_e parent_tag = kxml_node_tag(kxml_node_parent(element));
+	kentry_t *parent_entry = (kentry_t *)parent;
+
+	// Mandatory entry name
+	ientry.name = kxml_node_attr(element, "name");
+	if (!ientry.name) {
+		faux_error_sprintf(error, TAG": entry without name");
+		return BOOL_FALSE;
+	}
+
+	ientry.help = kxml_node_attr(element, "help");
+	ientry.container = kxml_node_attr(element, "container");
+	ientry.mode = kxml_node_attr(element, "mode");
+	ientry.min = kxml_node_attr(element, "min");
+	ientry.max = kxml_node_attr(element, "max");
+	ientry.ptype = kxml_node_attr(element, "ptype");
+	ientry.ref = kxml_node_attr(element, "ref");
+	ientry.value = kxml_node_attr(element, "value");
+	ientry.restore = kxml_node_attr(element, "restore");
+
+	// Parent must be a KLISH or ENTRY tag
+	if ((parent_tag != KTAG_KLISH) && (parent_tag != KTAG_ENTRY)) {
+		faux_error_sprintf(error,
+			TAG": Tag \"%s\" can't contain ENTRY tag",
+			kxml_tag_name(parent_tag));
+		goto err;
+	}
+	if (!parent_entry) {
+		faux_error_sprintf(error,
+			TAG": Broken parent object for ENTRY \"%s\"",
+			ientry.name);
+		goto err;
+	}
+
+	if (KTAG_KLISH == parent_tag) { // High level ENTRY
+		// Does such ENTRY already exist
+		entry = kscheme_find_entry((kscheme_t *)parent, ientry.name);
+		if (entry) {
+			if (!ientry_parse(&ientry, entry, error))
+				goto err;
+		} else { // New entry object
+			entry = ientry_load(&ientry, error);
+			if (!entry)
+				goto err;
+			if (!kscheme_add_entry((kscheme_t *)parent, entry)) {
+				faux_error_sprintf(error, TAG": Can't add entry \"%s\". "
+					"Probably duplication",
+					kentry_name(entry));
+				kentry_free(entry);
+				goto err;
+			}
+		}
+	} else { // ENTRY within ENTRY
+		// Does such ENTRY already exist
+		entry = kentry_find_entry(parent_entry, ientry.name);
+		if (entry) {
+			if (!ientry_parse(&ientry, entry, error))
+				goto err;
+		} else { // New entry object
+			entry = ientry_load(&ientry, error);
+			if (!entry)
+				goto err;
+			kentry_set_parent(entry, parent_entry);
+			if (!kentry_add_entry(parent_entry, entry)) {
+				faux_error_sprintf(error, TAG": Can't add entry \"%s\". "
+					"Probably duplication",
+					kentry_name(entry));
+				kentry_free(entry);
+				goto err;
+			}
+		}
+	}
+
+	if (!process_children(element, entry, error))
+		goto err;
+
+	res = BOOL_TRUE;
+err:
+	kxml_node_attr_free(ientry.name);
+	kxml_node_attr_free(ientry.help);
+	kxml_node_attr_free(ientry.container);
+	kxml_node_attr_free(ientry.mode);
+	kxml_node_attr_free(ientry.min);
+	kxml_node_attr_free(ientry.max);
+	kxml_node_attr_free(ientry.ptype);
+	kxml_node_attr_free(ientry.ref);
+	kxml_node_attr_free(ientry.value);
+	kxml_node_attr_free(ientry.restore);
+
+	return res;
+}
+