feat(vars): $@ and $* init
This commit is contained in:
parent
00c2b9c979
commit
32d38c0d13
3 changed files with 74 additions and 6 deletions
|
|
@ -1,12 +1,67 @@
|
|||
#define _POSIX_C_SOURCE 200809L
|
||||
#include "./args.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "../lists/lists.h"
|
||||
#include "../string_utils/string_utils.h"
|
||||
#include "../vars/vars.h"
|
||||
|
||||
static void strlen_acc(void *acc, void *data)
|
||||
{
|
||||
size_t *len = (size_t *)acc;
|
||||
char *str = (char *)data;
|
||||
*len += strlen(str);
|
||||
}
|
||||
|
||||
static char *concat_list_str(struct list *list)
|
||||
{
|
||||
char *res = NULL;
|
||||
size_t total_len = list_length(list) + 1; // + spaces + null terminator
|
||||
|
||||
list_fold(list, &total_len, strlen_acc);
|
||||
|
||||
res = malloc(total_len);
|
||||
if (res != NULL)
|
||||
{
|
||||
res[0] = 0;
|
||||
for (struct list *it = list; it != NULL; it = it->next)
|
||||
{
|
||||
strcat(res, (char *)it->data);
|
||||
if (it->next != NULL)
|
||||
strcat(res, " ");
|
||||
}
|
||||
res[total_len - 1] = 0;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static void args_in_var(struct hash_map *vars, struct list *args_list)
|
||||
{
|
||||
int arg_index = 1;
|
||||
char index_str[11];
|
||||
|
||||
for (struct list *it = args_list; it != NULL; it = it->next)
|
||||
{
|
||||
int_to_str(arg_index++, index_str);
|
||||
set_var_copy(vars, index_str, (char *)it->data);
|
||||
}
|
||||
|
||||
char *concated_args = concat_list_str(args_list);
|
||||
set_var_copy(vars, "*", concated_args);
|
||||
|
||||
char *key = strdup("@");
|
||||
set_var(vars, key, concated_args, NULL);
|
||||
// key and concated_args consumed by hash_map
|
||||
|
||||
int_to_str(arg_index - 1, index_str);
|
||||
set_var_copy(vars, "#", index_str);
|
||||
}
|
||||
|
||||
int args_handler(int argc, char **argv, struct args_options *options,
|
||||
struct hash_map *vars)
|
||||
{
|
||||
|
|
@ -15,8 +70,7 @@ int args_handler(int argc, char **argv, struct args_options *options,
|
|||
options->pretty_print = false;
|
||||
options->verbose = false;
|
||||
|
||||
int arg_index = 1;
|
||||
char index_str[11];
|
||||
struct list *args_list = NULL;
|
||||
|
||||
set_var_copy(vars, "0", argv[0]);
|
||||
|
||||
|
|
@ -61,14 +115,13 @@ int args_handler(int argc, char **argv, struct args_options *options,
|
|||
else
|
||||
{
|
||||
// All remaining arguments are treated as additional arguments
|
||||
int_to_str(arg_index++, index_str);
|
||||
set_var_copy(vars, index_str, argv[i]);
|
||||
args_list = list_append(args_list, argv[i]);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
int_to_str(arg_index - 1, index_str);
|
||||
set_var_copy(vars, "#", index_str);
|
||||
args_in_var(vars, args_list);
|
||||
list_destroy(args_list);
|
||||
|
||||
if (options->type == INPUT_UNDEFINED)
|
||||
options->type = INPUT_STDIN;
|
||||
|
|
|
|||
|
|
@ -107,4 +107,9 @@ int list_find(struct list *list, void *value);
|
|||
// struct list *list_split(struct list *list, size_t index);
|
||||
// END PROTO list_split
|
||||
|
||||
/**
|
||||
* @brief: Folds the list from left to right using func and an accumulator.
|
||||
*/
|
||||
void list_fold(struct list *list, void *acc, void (*func)(void *, void *));
|
||||
|
||||
#endif /* ! LISTS_H */
|
||||
|
|
|
|||
|
|
@ -115,3 +115,13 @@ void list_deep_destroy(struct list *l)
|
|||
elt = next_elt;
|
||||
}
|
||||
}
|
||||
|
||||
void list_fold(struct list *list, void *acc, void (*func)(void *, void *))
|
||||
{
|
||||
struct list *elt = list;
|
||||
while (elt != NULL)
|
||||
{
|
||||
func(acc, elt->data);
|
||||
elt = elt->next;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue