Browse Source

xml: PTYPE fix

Serj Kalichev 1 year ago
parent
commit
8f2739b3db
2 changed files with 83 additions and 83 deletions
  1. 18 8
      klish.xsd
  2. 65 75
      klish/xml-helper/load.c

+ 18 - 8
klish.xsd

@@ -25,17 +25,17 @@
 	<xs:element name="ACTION" type="action_t"/>
 	<xs:element name="ENTRY" type="entry_t"/>
 	<xs:element name="VIEW" type="view_t"/> <!-- Wrapper -->
+	<xs:element name="NSPACE" type="nspace_t"/> <!-- Wrapper -->
 	<xs:element name="COMMAND" type="command_t"/> <!-- Wrapper -->
+	<xs:element name="SUBCOMMAND" type="param_t"/> <!-- Wrapper -->
+	<xs:element name="FILTER" type="command_t"/> <!-- Wrapper -->
 	<xs:element name="COND" type="command_t"/> <!-- Wrapper -->
 	<xs:element name="COMPL" type="command_t"/> <!-- Wrapper -->
 	<xs:element name="HELP" type="command_t"/> <!-- Wrapper -->
-	<xs:element name="FILTER" type="command_t"/> <!-- Wrapper -->
 	<xs:element name="PTYPE" type="ptype_t"/> <!-- Wrapper -->
 	<xs:element name="PARAM" type="param_t"/> <!-- Wrapper -->
 	<xs:element name="SWITCH" type="param_t"/> <!-- Wrapper -->
-	<xs:element name="SUBCOMMAND" type="param_t"/> <!-- Wrapper -->
 	<xs:element name="MULTI" type="param_t"/> <!-- Wrapper -->
-	<xs:element name="NSPACE" type="nspace_t"/> <!-- Wrapper -->
 
 
 <!--
@@ -316,21 +316,31 @@
 * name="<string>" - A textual name for this type. This name can be used to
 *	reference this type within a PARAM's ptype attribute.
 *
-* help="<string>" - Help string.
+* [help="<string>"] - Help string.
 *
 ********************************************************
 -->
-	<xs:complexType name="ptype_t">
-		<xs:sequence>
+
+	<xs:group name="ptype_group_t">
+		<xs:choice>
 			<xs:element ref="ACTION" minOccurs="0" maxOccurs="unbounded"/>
 			<xs:element ref="ENTRY" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="NSPACE" 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:choice>
+	</xs:group>
+
+	<xs:complexType name="ptype_t">
+		<xs:sequence>
+			<xs:group ref="ptype_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="help" type="xs:string" use="optional"/>
 	</xs:complexType>
 
 
-
 <!--
 *******************************************************
 * <VIEW> defines the contents of a specific CLI view.

+ 65 - 75
klish/xml-helper/load.c

@@ -581,7 +581,7 @@ static bool_t process_view(const kxml_node_t *element, void *parent,
 	ientry.ref = NULL;
 	ientry.value = NULL;
 	ientry.restore = "false";
-	ientry.order = "true";
+	ientry.order = "false";
 	ientry.filter = "false";
 
 	// Parent must be a KLISH tag
@@ -607,6 +607,69 @@ err:
 }
 
 
+// It's a namespace for really different objects but not for VIEWs only.
+static bool_t process_nspace(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));
+
+	// Mandatory NSPACE name
+	ientry.name = kxml_node_attr(element, "name");
+	if (!ientry.name) {
+		faux_error_sprintf(error, TAG": NSPACE without name");
+		return BOOL_FALSE;
+	}
+	ientry.help = kxml_node_attr(element, "help");
+	ientry.container = kxml_node_attr(element, "container");
+	ientry.mode = "common";
+	ientry.purpose = kxml_node_attr(element, "common");;
+	ientry.min = kxml_node_attr(element, "min");
+	ientry.max = kxml_node_attr(element, "max");
+	ientry.ref = kxml_node_attr(element, "ref");
+	if (!ientry.ref) {
+		faux_error_sprintf(error, TAG": NSPACE without reference");
+		return BOOL_FALSE;
+	}
+	ientry.value = kxml_node_attr(element, "value");
+	ientry.restore = kxml_node_attr(element, "restore");
+	ientry.order = kxml_node_attr(element, "order");
+	ientry.filter = "false";
+
+	if (	(KTAG_PLUGIN == parent_tag) ||
+//		(KTAG_HOTKEY == parent_tag) ||
+		(KTAG_ACTION == parent_tag)
+		) {
+		faux_error_sprintf(error,
+			TAG": Tag \"%s\" can't contain NSPACE tag",
+			kxml_tag_name(parent_tag));
+		kentry_free(entry);
+		goto err;
+	}
+
+	if (!(entry = add_entry_to_hierarchy(parent_tag, parent, &ientry, error)))
+		goto err;
+
+	// Don't process NSPACE child elements
+
+	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.min);
+	kxml_node_attr_free(ientry.max);
+	kxml_node_attr_free(ientry.ref);
+	kxml_node_attr_free(ientry.value);
+	kxml_node_attr_free(ientry.restore);
+	kxml_node_attr_free(ientry.order);
+
+	return res;
+}
+
+
 static bool_t process_ptype(const kxml_node_t *element, void *parent,
 	faux_error_t *error)
 {
@@ -624,7 +687,7 @@ static bool_t process_ptype(const kxml_node_t *element, void *parent,
 	ientry.help = kxml_node_attr(element, "help");
 	ientry.container = "true";
 	ientry.mode = "sequence";
-	ientry.purpose = "common";
+	ientry.purpose = "ptype";
 	ientry.min = "1";
 	ientry.max = "1";
 	ientry.ref = kxml_node_attr(element, "ref");
@@ -817,76 +880,3 @@ err:
 
 
 
-static bool_t process_nspace(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 NSPACE name
-	ientry.name = kxml_node_attr(element, "name");
-	if (!ientry.name) {
-		faux_error_sprintf(error, TAG": NSPACE 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.purpose = kxml_node_attr(element, "common");;
-	ientry.min = kxml_node_attr(element, "min");
-	ientry.max = kxml_node_attr(element, "max");
-	ientry.ref = kxml_node_attr(element, "ref");
-	ientry.value = kxml_node_attr(element, "value");
-	ientry.restore = kxml_node_attr(element, "restore");
-	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_VIEW != parent_tag) &&
-		(KTAG_PARAM != parent_tag) &&
-		(KTAG_SWITCH != parent_tag) &&
-		(KTAG_SUBCOMMAND != parent_tag) &&
-		(KTAG_MULTI != parent_tag) &&
-		(KTAG_ENTRY != parent_tag)) {
-		faux_error_sprintf(error,
-			TAG": Tag \"%s\" can't contain NSPACE tag",
-			kxml_tag_name(parent_tag));
-		kentry_free(entry);
-		goto err;
-	}
-	if (!kentry_add_entrys(parent_entry, entry)) {
-		faux_error_sprintf(error,
-			TAG": Can't add NSPACE \"%s\" to ENTRY \"%s\". "
-			"Probably duplication",
-			kentry_name(entry), kentry_name(parent_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.ref);
-	kxml_node_attr_free(ientry.value);
-	kxml_node_attr_free(ientry.restore);
-	kxml_node_attr_free(ientry.order);
-
-	return res;
-}
-
-