Browse Source

list, argv: faux_list_index(), faux_argv_index()

Serj Kalichev 2 years ago
parent
commit
8f7c7b0df3
6 changed files with 120 additions and 1 deletions
  1. 2 1
      faux/argv.h
  2. 19 0
      faux/argv/argv.c
  3. 50 0
      faux/argv/testc_argv.c
  4. 2 0
      faux/list.h
  5. 46 0
      faux/list/list.c
  6. 1 0
      faux/testc_module/testc_module.c

+ 2 - 1
faux/argv.h

@@ -17,10 +17,11 @@ faux_argv_t *faux_argv_new(void);
 void faux_argv_free(faux_argv_t *fargv);
 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);
 const char *faux_argv_each(faux_argv_node_t **iter);
 const char *faux_argv_current(faux_argv_node_t *iter);
-ssize_t faux_argv_len(faux_argv_t *fargv);
+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);

+ 19 - 0
faux/argv/argv.c

@@ -250,3 +250,22 @@ bool_t faux_argv_add(faux_argv_t *fargv, const char *arg)
 
 	return BOOL_TRUE;
 }
+
+
+/** @brief Gets argument by index.
+ *
+ * @param [in] fargv Allocated argv object.
+ * @return String or NULL on error.
+ */
+const char *faux_argv_index(const faux_argv_t *fargv, size_t index)
+{
+	const char *res = NULL;
+
+	assert(fargv);
+	if (!fargv)
+		return NULL;
+
+	res = (const char *)faux_list_index(fargv->list, index);
+
+	return res;
+}

+ 50 - 0
faux/argv/testc_argv.c

@@ -74,6 +74,7 @@ int testc_faux_argv_parse(void)
 	return retval;
 }
 
+
 int testc_faux_argv_is_continuable(void)
 {
 	faux_argv_t *fargv = NULL;
@@ -101,3 +102,52 @@ int testc_faux_argv_is_continuable(void)
 
 	return retval;
 }
+
+
+int testc_faux_argv_index(void)
+{
+	faux_argv_t *fargv = NULL;
+	const char* line = "arg0 arg1 arg2";
+	const char* etalon[] = {
+		"arg0",
+		"arg1",
+		"arg2",
+		NULL
+		 };
+	int retval = 0;
+	ssize_t num = 0;
+	ssize_t num_etalon = 3;
+	size_t index = 0;
+
+	printf("Line   : [%s]\n", line);
+
+	fargv = faux_argv_new();
+	num = faux_argv_parse(fargv, line);
+	if (num != num_etalon) {
+		printf("Error: Can't parse line\n");
+		faux_argv_free(fargv);
+		return -1;
+	}
+
+	for (index = 0; index < num; index++) {
+		int r = -1;
+		const char *res = NULL;
+		printf("Etalon %ld : [%s]\n", index, etalon[index]);
+		res = faux_argv_index(fargv, index);
+		if (!res) {
+			printf("The faux_argv_index() return value is NULL\n");
+			break;
+		} else {
+			printf("Result %ld : [%s]\n", index, res);
+		}
+		r = strcmp(etalon[index], res);
+		if (r < 0) {
+			printf("Not equal %ld\n", index);
+			retval = -1;
+		}
+	}
+
+	faux_argv_free(fargv);
+
+	return retval;
+}

+ 2 - 0
faux/list.h

@@ -73,6 +73,8 @@ void *faux_list_find(const faux_list_t *list,
 	faux_list_kcmp_fn matchFn, const void *userkey);
 void *faux_list_kfind(const faux_list_t *list,
 	const void *userkey);
+faux_list_node_t *faux_list_index_node(const faux_list_t *list, size_t index);
+void *faux_list_index(const faux_list_t *list, size_t index);
 
 C_DECL_END
 

+ 46 - 0
faux/list/list.c

@@ -714,3 +714,49 @@ void *faux_list_kfind(const faux_list_t *list,
 {
 	return faux_list_find(list, list->kcmpFn, userkey);
 }
+
+
+/** @brief Gets list node by index.
+ *
+ * Note getting item by index is not effective operation for list.
+ *
+ * @param [in] list List.
+ * @param [in] index Item's index.
+ * @return List node by index or NULL on error.
+ */
+faux_list_node_t *faux_list_index_node(const faux_list_t *list, size_t index)
+{
+	faux_list_node_t *iter = NULL;
+	size_t i = 0;
+
+	assert(list);
+	if (!list)
+		return NULL;
+	if (index >= list->len)
+		return NULL;
+
+	iter = list->head;
+	for (i = 0; i < index; i++)
+		iter = faux_list_next_node(iter);
+
+	return iter;
+}
+
+
+/** @brief Gets list item by index.
+ *
+ * Note getting item by index is not effective operation for list.
+ *
+ * @param [in] list List.
+ * @param [in] index Item's index.
+ * @return List node's data by index or NULL on error.
+ */
+void *faux_list_index(const faux_list_t *list, size_t index)
+{
+	faux_list_node_t *res =
+		faux_list_index_node(list, index);
+	if (!res)
+		return NULL;
+
+	return faux_list_data(res);
+}

+ 1 - 0
faux/testc_module/testc_module.c

@@ -23,6 +23,7 @@ const char *testc_module[][2] = {
 	// argv
 	{"testc_faux_argv_parse", "Parse string to arguments"},
 	{"testc_faux_argv_is_continuable", "Is line continuable"},
+	{"testc_faux_argv_index", "Get argument by index"},
 
 	// time
 	{"testc_faux_nsec_timespec_conversion", "Converts nsec from/to struct timespec"},