Browse Source

argv: Reverse iterator and faux_argv_del()

Serj Kalichev 1 year ago
parent
commit
8d0805b6e4
3 changed files with 64 additions and 0 deletions
  1. 3 0
      faux/argv.h
  2. 58 0
      faux/argv/argv.c
  3. 3 0
      faux/faux.map

+ 3 - 0
faux/argv.h

@@ -20,12 +20,15 @@ void faux_argv_set_quotes(faux_argv_t *fargv, const char *quotes);
 
 ssize_t faux_argv_len(faux_argv_t *fargv);
 faux_argv_node_t *faux_argv_iter(const faux_argv_t *fargv);
+faux_argv_node_t *faux_argv_iterr(const faux_argv_t *fargv);
 const char *faux_argv_each(faux_argv_node_t **iter);
+const char *faux_argv_eachr(faux_argv_node_t **iter);
 const char *faux_argv_current(faux_argv_node_t *iter);
 const char *faux_argv_index(const faux_argv_t *fargv, size_t index);
 
 ssize_t faux_argv_parse(faux_argv_t *fargv, const char *str);
 bool_t faux_argv_add(faux_argv_t *fargv, const char *arg);
+bool_t faux_argv_del(faux_argv_t *fargv, faux_argv_node_t *node);
 
 bool_t faux_argv_is_continuable(const faux_argv_t *fargv);
 void faux_argv_set_continuable(faux_argv_t *fargv, bool_t continuable);

+ 58 - 0
faux/argv/argv.c

@@ -109,6 +109,25 @@ faux_argv_node_t *faux_argv_iter(const faux_argv_t *fargv)
 }
 
 
+/** @brief Initializes revert iterator to iterate through the entire argv object.
+ *
+ * Before iterating with the faux_argv_eachr() function the iterator must be
+ * initialized. This function do it.
+ *
+ * @param [in] fargv Allocated and initialized argv object.
+ * @return Initialized iterator.
+ * @sa faux_argv_eachr()
+ */
+faux_argv_node_t *faux_argv_iterr(const faux_argv_t *fargv)
+{
+	assert(fargv);
+	if (!fargv)
+		return NULL;
+
+	return (faux_argv_node_t *)faux_list_tail(fargv->list);
+}
+
+
 /** @brief Iterate entire argv object for arguments.
  *
  * Before iteration the iterator must be initialized by faux_argv_iter()
@@ -127,6 +146,24 @@ const char *faux_argv_each(faux_argv_node_t **iter)
 }
 
 
+/** @brief Reverse iterate entire argv object for arguments.
+ *
+ * Before iteration the iterator must be initialized by faux_argv_iterr()
+ * function. Doesn't use faux_argv_eachr() with uninitialized iterator.
+ *
+ * On each call function returns string (argument) and modifies iterator.
+ * Stop iteration when function returns NULL.
+ *
+ * @param [in,out] iter Iterator.
+ * @return String.
+ * @sa faux_argv_iterr()
+ */
+const char *faux_argv_eachr(faux_argv_node_t **iter)
+{
+	return (const char *)faux_list_eachr((faux_list_node_t **)iter);
+}
+
+
 /** @brief Get current argument by iterator.
  *
  * Before iteration the iterator must be initialized by faux_argv_iter()
@@ -310,6 +347,27 @@ bool_t faux_argv_add(faux_argv_t *fargv, const char *arg)
 }
 
 
+/** @brief Deletes argument from fargv object.
+ *
+ * @param [in] fargv Allocated argv object.
+ * @param [in] node Node to delete.
+ * @return BOOL_TRUE - success, BOOL_FALSE - error.
+ */
+bool_t faux_argv_del(faux_argv_t *fargv, faux_argv_node_t *node)
+{
+	assert(fargv);
+	if (!fargv)
+		return BOOL_FALSE;
+	assert(node);
+	if (!node)
+		return BOOL_FALSE;
+
+	faux_list_del(fargv->list, (faux_list_node_t *)node);
+
+	return BOOL_TRUE;
+}
+
+
 /** @brief Gets argument by index.
  *
  * @param [in] fargv Allocated argv object.

+ 3 - 0
faux/faux.map

@@ -7,7 +7,9 @@ FAUX_2.0 {
 		faux_argv_free;
 		faux_argv_set_quotes;
 		faux_argv_iter;
+		faux_argv_iterr;
 		faux_argv_each;
+		faux_argv_eachr;
 		faux_argv_current;
 		faux_argv_parse;
 		faux_argv_len;
@@ -16,6 +18,7 @@ FAUX_2.0 {
 		faux_argv_del_continuable;
 		faux_argv_is_last;
 		faux_argv_add;
+		faux_argv_del;
 		faux_argv_index;
 		faux_argv_line;