Browse Source

xml: process_param()

Serj Kalichev 1 year ago
parent
commit
710de0f77c
2 changed files with 49 additions and 42 deletions
  1. 19 6
      klish.xsd
  2. 30 36
      klish/xml-helper/load.c

+ 19 - 6
klish.xsd

@@ -440,8 +440,18 @@
 -->
 	<xs:group name="param_group_t">
 		<xs:choice>
-			<xs:element ref="PARAM"/>
-			<xs:element ref="ENTRY"/>
+			<xs:element ref="ACTION" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="ENTRY" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="PTYPE" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="VIEW" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="COMMAND" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="FILTER" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="PARAM" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="COND" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="COMPL" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="HELP" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="SWITCH" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="SEQ" minOccurs="0" maxOccurs="unbounded"/>
 		</xs:choice>
 	</xs:group>
 
@@ -451,15 +461,17 @@
 			<xs:group ref="param_group_t" minOccurs="0" maxOccurs="unbounded"/>
 		</xs:sequence>
 		<xs:attribute name="name" type="xs:string" use="required"/>
-		<xs:attribute name="help" type="xs:string" use="required"/>
-		<xs:attribute name="ptype" type="xs:string" use="required"/>
+		<xs:attribute name="help" type="xs:string" use="optional"/>
+		<xs:attribute name="ptype" type="xs:string" use="optional"/>
 		<xs:attribute name="mode" type="entry_mode_t" use="optional" default="sequence"/>
-		<xs:attribute name="order" type="xs:boolean" use="optional" default="false"/>
+		<xs:attribute name="min" type="xs:string" use="optional" default="1"/>
+		<xs:attribute name="max" type="xs:string" use="optional" default="1"/>
+		<xs:attribute name="ref" type="xs:string" use="optional"/>
 		<xs:attribute name="value" type="xs:string" use="optional"/>
+		<xs:attribute name="order" type="xs:boolean" use="optional" default="false"/>
 	</xs:complexType>
 
 
-
 <!--
 *******************************************************
 * <COMMAND> is used to define a command within the CLI.
@@ -506,6 +518,7 @@
 		</xs:sequence>
 		<xs:attribute name="name" type="xs:string" use="optional"/>
 		<xs:attribute name="help" type="xs:string" use="optional"/>
+		<xs:attribute name="mode" type="entry_mode_t" use="optional" default="sequence"/>
 		<xs:attribute name="ref" type="xs:string" use="optional"/>
 		<xs:attribute name="value" type="xs:string" use="optional"/>
 		<xs:attribute name="restore" type="xs:boolean" use="optional" default="false"/>

+ 30 - 36
klish/xml-helper/load.c

@@ -652,9 +652,8 @@ static bool_t process_param(const kxml_node_t *element, void *parent,
 	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;
-	kentry_t *entry_add_to = parent_entry;
+	ktags_e tag = kxml_node_tag(element);
+	bool_t is_mode = BOOL_FALSE;
 
 	// Mandatory PARAM name
 	ientry.name = kxml_node_attr(element, "name");
@@ -663,8 +662,27 @@ static bool_t process_param(const kxml_node_t *element, void *parent,
 		return BOOL_FALSE;
 	}
 	ientry.help = kxml_node_attr(element, "help");
-	ientry.container = kxml_node_attr(element, "container");
-	ientry.mode = kxml_node_attr(element, "mode");
+	// Container
+	if (KTAG_PARAM == tag)
+		ientry.container = "false";
+	else
+		ientry.container = "true"; // SWITCH, SEQ
+	// Mode
+	switch (tag) {
+	case KTAG_PARAM:
+		ientry.mode = kxml_node_attr(element, "mode");
+		is_mode = BOOL_TRUE;
+		break;
+	case KTAG_SWITCH:
+		ientry.mode = "switch";
+		break;
+	case KTAG_SEQ:
+		ientry.mode = "sequence";
+		break;
+	default:
+		ientry.mode = "empty";
+		break;
+	}
 	ientry.purpose = "common";
 	ientry.min = kxml_node_attr(element, "min");
 	ientry.max = kxml_node_attr(element, "max");
@@ -674,29 +692,12 @@ static bool_t process_param(const kxml_node_t *element, void *parent,
 	ientry.order = kxml_node_attr(element, "order");
 	ientry.filter = "false";
 
-	entry = ientry_load(&ientry, error);
-	if (!entry)
-		goto err;
-
-	if ((KTAG_COMMAND != parent_tag) &&
-		(KTAG_PARAM != parent_tag) &&
-		(KTAG_ENTRY != parent_tag) &&
-		(KTAG_SWITCH != parent_tag) &&
-		(KTAG_SEQ != parent_tag) &&
-		(KTAG_COND != parent_tag) &&
-		(KTAG_COMPL != parent_tag) &&
-		(KTAG_HELP != parent_tag) &&
-		(KTAG_PTYPE != parent_tag)) {
-		faux_error_sprintf(error,
-			TAG": Tag \"%s\" can't contain PARAM tag",
-			kxml_tag_name(parent_tag));
-		kentry_free(entry);
+	if (!(entry = add_entry_to_hierarchy(element, parent, &ientry, error)))
 		goto err;
-	}
 
 	// Add newly created entry to special container in 'sequence' mode if
 	// parent entry can has 'switch' mode.
-	if (kentry_mode(parent_entry) == KENTRY_MODE_SWITCH) {
+/*	if (kentry_mode(parent_entry) == KENTRY_MODE_SWITCH) {
 		const char *seq_entry_name = "__sequence";
 		kentry_t *seq_entry = kentry_find_entry(parent_entry, seq_entry_name);
 		if (!seq_entry) {
@@ -708,15 +709,7 @@ static bool_t process_param(const kxml_node_t *element, void *parent,
 		}
 		entry_add_to = seq_entry;
 	}
-	if (!kentry_add_entrys(entry_add_to, entry)) {
-		faux_error_sprintf(error,
-			TAG": Can't add PARAM \"%s\" to ENTRY \"%s\". "
-			"Probably duplication",
-			kentry_name(entry_add_to), kentry_name(entry_add_to));
-		kentry_free(entry);
-		goto err;
-	}
-
+*/
 	if (!process_children(element, entry, error))
 		goto err;
 
@@ -724,8 +717,8 @@ static bool_t process_param(const kxml_node_t *element, void *parent,
 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);
+	if (is_mode)
+		kxml_node_attr_free(ientry.mode);
 	kxml_node_attr_free(ientry.min);
 	kxml_node_attr_free(ientry.max);
 	kxml_node_attr_free(ientry.ref);
@@ -775,7 +768,7 @@ static bool_t process_command(const kxml_node_t *element, void *parent,
 	}
 	ientry.help = kxml_node_attr(element, "help");
 	ientry.container = "false";
-	ientry.mode = "sequence";
+	ientry.mode = kxml_node_attr(element, "mode");
 	// Purpose
 	switch (tag) {
 	case KTAG_COND:
@@ -822,6 +815,7 @@ err:
 	if (is_name)
 		kxml_node_attr_free(ientry.name);
 	kxml_node_attr_free(ientry.help);
+	kxml_node_attr_free(ientry.mode);
 	kxml_node_attr_free(ientry.ref);
 	if ((KTAG_FILTER == tag) || (KTAG_COMMAND == tag)) {
 		kxml_node_attr_free(ientry.value);