Browse Source

kentry: Field 'order'

Serj Kalichev 2 years ago
parent
commit
423297e093
3 changed files with 35 additions and 3 deletions
  1. 3 0
      klish/kentry.h
  2. 6 0
      klish/kscheme/kentry.c
  3. 26 3
      klish/ksession/ksession_parse.c

+ 3 - 0
klish/kentry.h

@@ -70,6 +70,9 @@ bool_t kentry_set_value(kentry_t *entry, const char *value);
 // Restore
 bool_t kentry_restore(const kentry_t *entry);
 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);
 
 // Nested ENTRY list
 faux_list_t *kentry_entrys(const kentry_t *entry);

+ 6 - 0
klish/kscheme/kentry.c

@@ -24,6 +24,7 @@ struct kentry_s {
 	char *ref_str; // Text reference to aliased ENTRY
 	char *value; // Additional info
 	bool_t restore; // Should entry restore its depth while execution
+	bool_t order; // Is entry ordered
 	faux_list_t *entrys; // Nested ENTRYs
 	faux_list_t *actions; // Nested ACTIONs
 };
@@ -77,6 +78,10 @@ KSET_STR(entry, value);
 KGET_BOOL(entry, restore);
 KSET_BOOL(entry, restore);
 
+// Order
+KGET_BOOL(entry, order);
+KSET_BOOL(entry, order);
+
 // Nested ENTRYs list
 KGET(entry, faux_list_t *, entrys);
 static KCMP_NESTED(entry, entry, name);
@@ -121,6 +126,7 @@ kentry_t *kentry_new(const char *name)
 	entry->ref_str = NULL;
 	entry->value = NULL;
 	entry->restore = BOOL_FALSE;
+	entry->order = BOOL_FALSE;
 
 	// ENTRY list
 	entry->entrys = faux_list_new(FAUX_LIST_UNSORTED, FAUX_LIST_UNIQUE,

+ 26 - 3
klish/ksession/ksession_parse.c

@@ -112,11 +112,34 @@ static kparse_status_e ksession_parse_arg(kentry_t *current_entry,
 	// SEQUENCE
 	} else if (KENTRY_MODE_SEQUENCE == mode) {
 		kentry_entrys_node_t *iter = kentry_entrys_iter(entry);
+		kentry_entrys_node_t *saved_iter = iter;
 		kentry_t *nested = NULL;
-		kparse_status_e nrc = KPARSE_NOTFOUND;
+
 		while ((nested = kentry_entrys_each(&iter))) {
-			if ((nrc = ksession_parse_arg(nested, argv_iter, pargv)))
-				retcode = KPARSE_INPROGRESS;
+			kparse_status_e nrc = KPARSE_NOTFOUND;
+			size_t num = 0;
+			for (num = 0; num < kentry_max(nested); num++) {
+				nrc = ksession_parse_arg(nested, argv_iter, pargv);
+				if (nrc != KPARSE_INPROGRESS)
+					break;
+			}
+			if ((nrc != KPARSE_INPROGRESS) && (nrc != KPARSE_NOTFOUND)) {
+				rc = nrc;
+				break;
+			}
+			// Not found all mandatory instances (NOTFOUND)
+			if (num < kentry_min(nested)) {
+				rc = KPARSE_NOTFOUND;
+				break;
+			}
+			// It's not an error if optional parameter is absend
+			rc = KPARSE_INPROGRESS;
+
+			// Mandatory or ordered parameter
+			if ((kentry_min(nested) > 0) ||
+				kentry_order(nested))
+				saved_iter = iter;
+			iter = saved_iter;
 		}
 	
 	}