Browse Source

faux_argv_line()

Serj Kalichev 1 year ago
parent
commit
6ca3792be2
3 changed files with 39 additions and 0 deletions
  1. 2 0
      faux/argv.h
  2. 36 0
      faux/argv/argv.c
  3. 1 0
      faux/faux.map

+ 2 - 0
faux/argv.h

@@ -33,6 +33,8 @@ void faux_argv_del_continuable(faux_argv_t *fargv);
 
 bool_t faux_argv_is_last(faux_argv_node_t *iter);
 
+char *faux_argv_line(const faux_argv_t *fargv);
+
 C_DECL_END
 
 #endif				/* _faux_argv_h */

+ 36 - 0
faux/argv/argv.c

@@ -327,3 +327,39 @@ const char *faux_argv_index(const faux_argv_t *fargv, size_t index)
 
 	return res;
 }
+
+
+/** @brief Gets whole text line (concatinated arguments).
+ *
+ * TODO: Now args with spaces is printed simply with quotes. It must be fixed
+ * later because arg can contain quotes itself.
+ *
+ * @param [in] fargv Allocated argv object.
+ * @return String or NULL on error.
+ */
+char *faux_argv_line(const faux_argv_t *fargv)
+{
+	bool_t is_first_arg = BOOL_TRUE;
+	char *line = NULL;
+	faux_argv_node_t *iter = NULL;
+	const char *arg = NULL;
+
+	iter = faux_argv_iter(fargv);
+	while ((arg = faux_argv_each(&iter))) {
+		bool_t space_found = BOOL_FALSE;
+
+		if (is_first_arg)
+			is_first_arg = BOOL_FALSE;
+		else
+			faux_str_cat(&line, " ");
+		if (faux_str_chars(arg, " \t"))
+			space_found = BOOL_TRUE;
+		if (space_found)
+			faux_str_cat(&line, "\"");
+		faux_str_cat(&line, arg);
+		if (space_found)
+			faux_str_cat(&line, "\"");
+	}
+
+	return line;
+}

+ 1 - 0
faux/faux.map

@@ -17,6 +17,7 @@ FAUX_2.0 {
 		faux_argv_is_last;
 		faux_argv_add;
 		faux_argv_index;
+		faux_argv_line;
 
 		faux_async_new;
 		faux_async_free;