Browse Source

faux_argv_dup()

Serj Kalichev 1 year ago
parent
commit
9b40c78382
3 changed files with 37 additions and 0 deletions
  1. 1 0
      faux/argv.h
  2. 35 0
      faux/argv/argv.c
  3. 1 0
      faux/faux.map

+ 1 - 0
faux/argv.h

@@ -14,6 +14,7 @@ typedef faux_list_node_t faux_argv_node_t;
 C_DECL_BEGIN
 
 faux_argv_t *faux_argv_new(void);
+faux_argv_t *faux_argv_dup(const faux_argv_t *origin);
 void faux_argv_free(faux_argv_t *fargv);
 void faux_argv_set_quotes(faux_argv_t *fargv, const char *quotes);
 

+ 35 - 0
faux/argv/argv.c

@@ -40,6 +40,41 @@ faux_argv_t *faux_argv_new(void)
 }
 
 
+/** @brief Duplicate existing argv object.
+ *
+ * @param [in] fargv Allocated and initialized argv object.
+ * @return Allocated and initialized duplicate or NULL on error.
+ */
+faux_argv_t *faux_argv_dup(const faux_argv_t *origin)
+{
+	faux_argv_t *fargv = NULL;
+	faux_list_t *list = NULL;
+	faux_argv_node_t *iter = NULL;
+	const char *arg = NULL;
+
+	assert(origin);
+	if (!origin)
+		return NULL;
+
+	fargv = faux_argv_new();
+	assert(fargv);
+	if (!fargv)
+		return NULL;
+
+	// Copy all fields but list must be recreated
+	list = fargv->list;
+	*fargv = *origin;
+	fargv->list = list;
+
+	// Copy list
+	iter = faux_argv_iter(origin);
+	while ((arg = faux_argv_each(&iter)))
+		faux_argv_add(fargv, arg);
+
+	return fargv;
+}
+
+
 /** @brief Frees the argv object object.
  *
  * After using the argv object must be freed. Function frees argv object.

+ 1 - 0
faux/faux.map

@@ -3,6 +3,7 @@ FAUX_2.0 {
 	global:
 
 		faux_argv_new;
+		faux_argv_dup;
 		faux_argv_free;
 		faux_argv_set_quotes;
 		faux_argv_iter;