Browse Source

kpargv: Reverse iterator

Serj Kalichev 1 year ago
parent
commit
33bf9c4b8a
3 changed files with 21 additions and 0 deletions
  1. 17 0
      klish/khelper.h
  2. 2 0
      klish/kpargv.h
  3. 2 0
      klish/ksession/kpargv.c

+ 17 - 0
klish/khelper.h

@@ -156,6 +156,16 @@
 	return (k##obj##_##nested##_node_t *)faux_list_head(inst->nested); \
 }
 
+#define _KNESTED_ITERR(obj, nested) \
+	k##obj##_##nested##_node_t *k##obj##_##nested##_iterr(const k##obj##_t *inst)
+#define KNESTED_ITERR(obj, nested) \
+	_KNESTED_ITERR(obj, nested) { \
+	assert(inst); \
+	if (!inst) \
+		return NULL; \
+	return (k##obj##_##nested##_node_t *)faux_list_tail(inst->nested); \
+}
+
 #define _KNESTED_EACH(obj, type, nested) \
 	type k##obj##_##nested##_each(k##obj##_##nested##_node_t **iter)
 #define KNESTED_EACH(obj, type, nested) \
@@ -163,6 +173,13 @@
 	return (type)faux_list_each((faux_list_node_t **)iter); \
 }
 
+#define _KNESTED_EACHR(obj, type, nested) \
+	type k##obj##_##nested##_eachr(k##obj##_##nested##_node_t **iter)
+#define KNESTED_EACHR(obj, type, nested) \
+	_KNESTED_EACHR(obj, type, nested) { \
+	return (type)faux_list_eachr((faux_list_node_t **)iter); \
+}
+
 
 C_DECL_BEGIN
 

+ 2 - 0
klish/kpargv.h

@@ -88,7 +88,9 @@ ssize_t kpargv_pargs_len(const kpargv_t *pargv);
 bool_t kpargv_pargs_is_empty(const kpargv_t *pargv);
 bool_t kpargv_add_pargs(kpargv_t *pargv, kparg_t *parg);
 kpargv_pargs_node_t *kpargv_pargs_iter(const kpargv_t *pargv);
+kpargv_pargs_node_t *kpargv_pargs_iterr(const kpargv_t *pargv);
 kparg_t *kpargv_pargs_each(kpargv_pargs_node_t **iter);
+kparg_t *kpargv_pargs_eachr(kpargv_pargs_node_t **iter);
 kparg_t *kpargv_pargs_last(const kpargv_t *pargv);
 kparg_t *kpargv_entry_exists(const kpargv_t *pargv, const void *entry);
 

+ 2 - 0
klish/ksession/kpargv.c

@@ -58,7 +58,9 @@ KADD_NESTED(pargv, kparg_t *, pargs);
 KNESTED_LEN(pargv, pargs);
 KNESTED_IS_EMPTY(pargv, pargs);
 KNESTED_ITER(pargv, pargs);
+KNESTED_ITERR(pargv, pargs);
 KNESTED_EACH(pargv, kparg_t *, pargs);
+KNESTED_EACHR(pargv, kparg_t *, pargs);
 
 // Completions
 KGET(pargv, faux_list_t *, completions);