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 "./args.h"
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "../lists/lists.h"
|
||||||
#include "../string_utils/string_utils.h"
|
#include "../string_utils/string_utils.h"
|
||||||
#include "../vars/vars.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,
|
int args_handler(int argc, char **argv, struct args_options *options,
|
||||||
struct hash_map *vars)
|
struct hash_map *vars)
|
||||||
{
|
{
|
||||||
|
|
@ -15,8 +70,7 @@ int args_handler(int argc, char **argv, struct args_options *options,
|
||||||
options->pretty_print = false;
|
options->pretty_print = false;
|
||||||
options->verbose = false;
|
options->verbose = false;
|
||||||
|
|
||||||
int arg_index = 1;
|
struct list *args_list = NULL;
|
||||||
char index_str[11];
|
|
||||||
|
|
||||||
set_var_copy(vars, "0", argv[0]);
|
set_var_copy(vars, "0", argv[0]);
|
||||||
|
|
||||||
|
|
@ -61,14 +115,13 @@ int args_handler(int argc, char **argv, struct args_options *options,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// All remaining arguments are treated as additional arguments
|
// All remaining arguments are treated as additional arguments
|
||||||
int_to_str(arg_index++, index_str);
|
args_list = list_append(args_list, argv[i]);
|
||||||
set_var_copy(vars, index_str, argv[i]);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int_to_str(arg_index - 1, index_str);
|
args_in_var(vars, args_list);
|
||||||
set_var_copy(vars, "#", index_str);
|
list_destroy(args_list);
|
||||||
|
|
||||||
if (options->type == INPUT_UNDEFINED)
|
if (options->type == INPUT_UNDEFINED)
|
||||||
options->type = INPUT_STDIN;
|
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);
|
// struct list *list_split(struct list *list, size_t index);
|
||||||
// END PROTO list_split
|
// 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 */
|
#endif /* ! LISTS_H */
|
||||||
|
|
|
||||||
|
|
@ -115,3 +115,13 @@ void list_deep_destroy(struct list *l)
|
||||||
elt = next_elt;
|
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