api refactoring
[m6w6/ext-psi] / src / types / impl_args.h
1 #ifndef _PSI_TYPES_IMPL_ARGS_H
2 #define _PSI_TYPES_IMPL_ARGS_H
3
4 typedef struct impl_args {
5 impl_arg **args;
6 size_t count;
7 impl_vararg vararg;
8 } impl_args;
9
10 static inline impl_args *init_impl_args(impl_arg *arg) {
11 impl_args *args = calloc(1, sizeof(*args));
12 if (arg) {
13 args->count = 1;
14 args->args = calloc(1, sizeof(*args->args));
15 args->args[0] = arg;
16 }
17 return args;
18 }
19
20 static inline impl_args *add_impl_arg(impl_args *args, impl_arg *arg) {
21 args->args = realloc(args->args, ++args->count * sizeof(*args->args));
22 args->args[args->count-1] = arg;
23 return args;
24 }
25
26 static inline void free_impl_args(impl_args *args) {
27 size_t i;
28
29 for (i = 0; i < args->count; ++i) {
30 free_impl_arg(args->args[i]);
31 }
32 if (args->vararg.name) {
33 free_impl_arg(args->vararg.name);
34 }
35 free(args->args);
36 free(args);
37 }
38
39 #endif