Browse Source

kpargv: Check if entry already exists within pargv

Serj Kalichev 2 years ago
parent
commit
5daacb8bd8
3 changed files with 28 additions and 1 deletions
  1. 1 0
      klish/kpargv.h
  2. 25 1
      klish/ksession/kpargv.c
  3. 2 0
      klish/ksession/ksession_parse.c

+ 1 - 0
klish/kpargv.h

@@ -36,6 +36,7 @@ ssize_t kpargv_pargs_len(const kpargv_t *pargv);
 bool_t kpargv_pargs_is_empty(const kpargv_t *pargv);
 bool_t kpargv_add_parg(kpargv_t *pargv, kparg_t *parg);
 kparg_t *kpargv_pargs_last(const kpargv_t *pargv);
+kparg_t *kpargv_entry_exists(const kpargv_t *pargv, const void *entry);
 
 C_DECL_END
 

+ 25 - 1
klish/ksession/kpargv.c

@@ -7,6 +7,7 @@
 
 #include <faux/list.h>
 #include <klish/khelper.h>
+//#include <klish/kentry.h>
 #include <klish/kpargv.h>
 
 
@@ -24,6 +25,16 @@ KNESTED_ITER(pargv, parg);
 KNESTED_EACH(pargv, parg);
 
 
+int kpargv_pargs_kcompare(const void *key, const void *list_item)
+{
+	const kentry_t *f = (const kentry_t *)key;
+	const kparg_t *s = (const kparg_t *)list_item;
+	if (f == kparg_entry(s))
+		return 0;
+	return 1;
+}
+
+
 kpargv_t *kpargv_new()
 {
 	kpargv_t *pargv = NULL;
@@ -35,7 +46,7 @@ kpargv_t *kpargv_new()
 
 	// Parsed arguments list
 	pargv->pargs = faux_list_new(FAUX_LIST_UNSORTED, FAUX_LIST_NONUNIQUE,
-		NULL, NULL, (void (*)(void *))kparg_free);
+		NULL, kpargv_pargs_kcompare, (void (*)(void *))kparg_free);
 	assert(pargv->pargs);
 
 	return pargv;
@@ -63,3 +74,16 @@ kparg_t *kpargv_pargs_last(const kpargv_t *pargv)
 
 	return (kparg_t *)faux_list_data(faux_list_tail(pargv->pargs));
 }
+
+
+kparg_t *kpargv_entry_exists(const kpargv_t *pargv, const void *entry)
+{
+	assert(pargv);
+	if (!pargv)
+		return NULL;
+	assert(entry);
+	if (!entry)
+		return NULL;
+
+	return (kparg_t *)faux_list_kfind(pargv->pargs, entry);
+}

+ 2 - 0
klish/ksession/ksession_parse.c

@@ -118,6 +118,8 @@ static kparse_status_e ksession_parse_arg(kentry_t *current_entry,
 		while ((nested = kentry_entrys_each(&iter))) {
 			kparse_status_e nrc = KPARSE_NOTFOUND;
 			size_t num = 0;
+			if (kpargv_entry_exists(pargv, nested))
+				continue;
 			for (num = 0; num < kentry_max(nested); num++) {
 				nrc = ksession_parse_arg(nested, argv_iter, pargv);
 				if (nrc != KPARSE_INPROGRESS)