Browse Source

scheme: Add 'filter' attr to entry.

Serj Kalichev 2 years ago
parent
commit
d9bce0a661
7 changed files with 69 additions and 3 deletions
  1. 1 0
      klish/ientry.h
  2. 10 0
      klish/ischeme/ientry.c
  3. 3 0
      klish/kentry.h
  4. 8 0
      klish/kscheme/kentry.c
  5. 7 2
      klish/kscheme/kscheme.c
  6. 32 1
      klish/ksession/kexec.c
  7. 8 0
      klish/xml-helper/load.c

+ 1 - 0
klish/ientry.h

@@ -24,6 +24,7 @@ struct ientry_s {
 	char *value;
 	char *restore;
 	char *order;
+	char *filter;
 	ientry_t * (*entrys)[]; // Nested entrys
 	iaction_t * (*actions)[];
 };

+ 10 - 0
klish/ischeme/ientry.c

@@ -119,6 +119,16 @@ bool_t ientry_parse(const ientry_t *info, kentry_t *entry, faux_error_t *error)
 		}
 	}
 
+	// Filter
+	if (!faux_str_is_empty(info->filter)) {
+		bool_t b = BOOL_FALSE;
+		if (!faux_conv_str2bool(info->filter, &b) ||
+			!kentry_set_filter(entry, b)) {
+			faux_error_add(error, TAG": Illegal 'filter' attribute");
+			retcode = BOOL_FALSE;
+		}
+	}
+
 	return retcode;
 }
 

+ 3 - 0
klish/kentry.h

@@ -73,6 +73,9 @@ bool_t kentry_set_restore(kentry_t *entry, bool_t restore);
 // Order
 bool_t kentry_order(const kentry_t *entry);
 bool_t kentry_set_order(kentry_t *entry, bool_t order);
+// Filter
+bool_t kentry_filter(const kentry_t *entry);
+bool_t kentry_set_filter(kentry_t *entry, bool_t filter);
 
 // Nested ENTRY list
 faux_list_t *kentry_entrys(const kentry_t *entry);

+ 8 - 0
klish/kscheme/kentry.c

@@ -25,6 +25,7 @@ struct kentry_s {
 	char *value; // Additional info
 	bool_t restore; // Should entry restore its depth while execution
 	bool_t order; // Is entry ordered
+	bool_t filter; // Is entry filter. Filter can't have inline actions.
 	faux_list_t *entrys; // Nested ENTRYs
 	faux_list_t *actions; // Nested ACTIONs
 };
@@ -82,6 +83,10 @@ KSET_BOOL(entry, restore);
 KGET_BOOL(entry, order);
 KSET_BOOL(entry, order);
 
+// Filter
+KGET_BOOL(entry, filter);
+KSET_BOOL(entry, filter);
+
 // Nested ENTRYs list
 KGET(entry, faux_list_t *, entrys);
 static KCMP_NESTED(entry, entry, name);
@@ -127,6 +132,7 @@ kentry_t *kentry_new(const char *name)
 	entry->value = NULL;
 	entry->restore = BOOL_FALSE;
 	entry->order = BOOL_FALSE;
+	entry->filter = BOOL_FALSE;
 
 	// ENTRY list
 	entry->entrys = faux_list_new(FAUX_LIST_UNSORTED, FAUX_LIST_UNIQUE,
@@ -210,6 +216,8 @@ bool_t kentry_link(kentry_t *dst, const kentry_t *src)
 	// ref_str - orig
 	// value - orig
 	// restore - orig
+	// order - orig
+	dst->filter = src->filter;
 	dst->entrys = src->entrys;
 	dst->actions = src->actions;
 

+ 7 - 2
klish/kscheme/kscheme.c

@@ -217,15 +217,20 @@ ksym_t *kscheme_find_sym(const kscheme_t *scheme, const char *name)
 }
 
 
-bool_t kscheme_prepare_action_list(kscheme_t *scheme, faux_list_t *action_list,
+bool_t kscheme_prepare_action_list(kscheme_t *scheme, kentry_t *entry,
 	faux_error_t *error) {
 	faux_list_node_t *iter = NULL;
 	kaction_t *action = NULL;
 	bool_t retcode = BOOL_TRUE;
+	faux_list_t *action_list = NULL;
 
 	assert(scheme);
 	if (!scheme)
 		return BOOL_FALSE;
+	assert(entry);
+	if (!entry)
+		return BOOL_FALSE;
+	action_list = kentry_actions(entry);
 	assert(action_list);
 	if (!action_list)
 		return BOOL_FALSE;
@@ -336,7 +341,7 @@ bool_t kscheme_prepare_entry(kscheme_t *scheme, kentry_t *entry,
 	}
 
 	// ACTIONs
-	if (!kscheme_prepare_action_list(scheme, kentry_actions(entry), error))
+	if (!kscheme_prepare_action_list(scheme, entry, error))
 		retcode = BOOL_FALSE;
 
 	// Process nested ENTRYs

+ 32 - 1
klish/ksession/kexec.c

@@ -108,7 +108,38 @@ bool_t kexec_add(kexec_t *exec, kcontext_t *context)
 }
 
 
-bool_t kexec_execute(kexec_t *exec)
+/*
+static bool_t exec_action(kcontext_t context,
+{
+
+
+}
+
+
+static bool_t exec_action_sequence(kcontext_t *context)
+{
+	faux_list_node_t *iter = NULL;
+	faux_list_t *actions = NULL;
+
+	assert(context);
+	if (!context)
+		return BOOL_FALSE;
+
+	actions = 
+
+}
+*/
+
+/*
+static bool_t kexec_prepare(kexec_t *exec)
+{
+	exec = exec;
+
+	return BOOL_TRUE;
+}
+*/
+
+bool_t kexec_exec(kexec_t *exec)
 {
 	faux_list_node_t *iter = NULL;
 	kcontext_t *context = NULL;

+ 8 - 0
klish/xml-helper/load.c

@@ -331,6 +331,7 @@ static bool_t process_view(const kxml_node_t *element, void *parent,
 	ientry.value = NULL;
 	ientry.restore = "false";
 	ientry.order = "true";
+	ientry.filter = "false";
 
 	// Parent must be a KLISH tag
 	if (parent_tag != KTAG_KLISH) {
@@ -401,6 +402,7 @@ static bool_t process_ptype(const kxml_node_t *element, void *parent,
 	ientry.value = kxml_node_attr(element, "value");
 	ientry.restore = "false";
 	ientry.order = "true";
+	ientry.filter = "false";
 
 	// Parent must be a KLISH tag
 	if (parent_tag != KTAG_KLISH) {
@@ -513,6 +515,7 @@ static bool_t process_param(const kxml_node_t *element, void *parent,
 	ientry.value = kxml_node_attr(element, "value");
 	ientry.restore = "false";
 	ientry.order = kxml_node_attr(element, "order");
+	ientry.filter = "false";
 
 	entry = ientry_load(&ientry, error);
 	if (!entry)
@@ -596,6 +599,7 @@ static bool_t process_command(const kxml_node_t *element, void *parent,
 	ientry.value = kxml_node_attr(element, "value");
 	ientry.restore = kxml_node_attr(element, "restore");
 	ientry.order = kxml_node_attr(element, "order");
+	ientry.filter = kxml_node_attr(element, "filter");
 
 	entry = ientry_load(&ientry, error);
 	if (!entry)
@@ -631,6 +635,7 @@ err:
 	kxml_node_attr_free(ientry.value);
 	kxml_node_attr_free(ientry.restore);
 	kxml_node_attr_free(ientry.order);
+	kxml_node_attr_free(ientry.filter);
 
 	return res;
 }
@@ -718,6 +723,7 @@ static bool_t process_nspace(const kxml_node_t *element, void *parent,
 	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)
@@ -789,6 +795,7 @@ static bool_t process_entry(const kxml_node_t *element, void *parent,
 	ientry.value = kxml_node_attr(element, "value");
 	ientry.restore = kxml_node_attr(element, "restore");
 	ientry.order = kxml_node_attr(element, "order");
+	ientry.filter = kxml_node_attr(element, "filter");
 
 	// Parent must be a KLISH or ENTRY tag
 	if ((parent_tag != KTAG_KLISH) && (parent_tag != KTAG_ENTRY)) {
@@ -859,6 +866,7 @@ err:
 	kxml_node_attr_free(ientry.value);
 	kxml_node_attr_free(ientry.restore);
 	kxml_node_attr_free(ientry.order);
+	kxml_node_attr_free(ientry.filter);
 
 	return res;
 }