Browse Source

xsd: Unfinished PARAM alias tags

Serj Kalichev 2 years ago
parent
commit
4765a468f1
4 changed files with 88 additions and 1 deletions
  1. 15 1
      klish.xsd
  2. 9 0
      klish/kparam.h
  3. 5 0
      klish/kscheme/kparam.c
  4. 59 0
      klish/ksession/ksession.c

+ 15 - 1
klish.xsd

@@ -239,7 +239,7 @@
 *	simply controls the conditional variable expansion for this 
 *	parameter.
 *
-* [mode] - Parameter mode. It can be "common", "switch" or "subcommand".
+* [mode] - Parameter mode. It can be "common", "switch", "subcommand", "multi".
 *
 * [prefix] - defines the prefix for an optional parameter. A prefix
 *	with this value on the command line will signify the presence
@@ -281,9 +281,23 @@
 			<xs:enumeration value="common"/>
 			<xs:enumeration value="switch"/>
 			<xs:enumeration value="subcommand"/>
+			<xs:enumeration value="multi"/>
 		</xs:restriction>
 	</xs:simpleType>
 
+	<xsd:group name="param_group_t">
+		<xsd:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="PARAM" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="SWITCH" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="SUBCOMMAND" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="MULTI" minOccurs="0" maxOccurs="unbounded"/>
+		</xsd:choice>
+	</xsd:group>
+
+	<!--  Permit any of these tags in any order in any number     -->
+	<xsd:choice minOccurs="0" maxOccurs="unbounded">
+
+
 	<xs:complexType name="param_t">
 		<xs:attribute name="name" type="xs:string" use="required"/>
 		<xs:attribute name="help" type="xs:string" use="required"/>

+ 9 - 0
klish/kparam.h

@@ -13,6 +13,13 @@ typedef struct kparam_s kparam_t;
 
 typedef faux_list_node_t kparam_params_node_t;
 
+typedef enum {
+	KPARAM_COMMON, // Common parameter
+	KPARAM_SUBCOMMAND, // The value of this parameter is its name
+	KPARAM_SWITCH, // User can choose one of nested parameters
+	KPARAM_MULTI, // Nested parameters can be used several times
+} kparam_mode_e;
+
 
 C_DECL_BEGIN
 
@@ -26,6 +33,8 @@ const char *kparam_ptype_ref(const kparam_t *param);
 bool_t kparam_set_ptype_ref(kparam_t *param, const char *ptype_ref);
 kptype_t *kparam_ptype(const kparam_t *param);
 bool_t kparam_set_ptype(kparam_t *param, kptype_t *ptype);
+kparam_mode_e kparam_mode(const kparam_t *param);
+bool_t kparam_set_mode(kparam_t *param, kparam_mode_e mode);
 
 // PARAMs
 faux_list_t *kparam_params(const kparam_t *param);

+ 5 - 0
klish/kscheme/kparam.c

@@ -15,6 +15,7 @@ struct kparam_s {
 	char *help;
 	char *ptype_ref; // Text reference to PTYPE
 	kptype_t *ptype; // Resolved PARAM's PTYPE
+	kparam_mode_e mode;
 	faux_list_t *params; // Nested parameters
 };
 
@@ -35,6 +36,10 @@ KSET_STR(param, ptype_ref);
 KGET(param, kptype_t *, ptype);
 KSET(param, kptype_t *, ptype);
 
+// Mode
+KGET(param, kparam_mode_e, mode);
+KSET(param, kparam_mode_e, mode);
+
 // PARAM list
 KGET(param, faux_list_t *, params);
 static KCMP_NESTED(param, param, name);

+ 59 - 0
klish/ksession/ksession.c

@@ -0,0 +1,59 @@
+/** @file ksession.c
+ */
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <faux/list.h>
+#include <klish/khelper.h>
+#include <klish/kcommand.h>
+#include <klish/kparam.h>
+#include <klish/ksession.h>
+
+
+struct ksession_s {
+	kscheme_t *scheme;
+	kpath_t *path;
+};
+
+
+// Scheme
+KGET(session, kscheme_t *, scheme);
+
+// Path
+KGET(session, kpath_t *, path);
+
+
+ksession_t *ksession_new()
+{
+	ksession_t *session = NULL;
+
+	session = faux_zmalloc(sizeof(*session));
+	assert(session);
+	if (!session)
+		return NULL;
+
+	// Parsed arguments list
+	session->pargs = faux_list_new(FAUX_LIST_UNSORTED, FAUX_LIST_NONUNIQUE,
+		NULL, NULL, (void (*)(void *))kparg_free);
+	assert(session->pargs);
+
+	return session;
+}
+
+
+void ksession_free(ksession_t *session)
+{
+	if (!session)
+		return;
+
+	faux_list_free(session->pargs);
+
+	free(session);
+}
+
+
+
+
+bool_t ksession_parse_command(const kscheme_t scheme,