summaryrefslogtreecommitdiffstats
path: root/args.h
diff options
context:
space:
mode:
Diffstat (limited to 'args.h')
-rw-r--r--args.h17
1 files changed, 14 insertions, 3 deletions
diff --git a/args.h b/args.h
index a9174699..efd49d61 100644
--- a/args.h
+++ b/args.h
@@ -40,18 +40,29 @@ typedef int arg_index;
(coerce(struct args *, \
alloca(offsetof(struct args, arg) + (N)*sizeof (val))))
-INLINE void args_init_list(struct args *args, cnum argc, val list)
+INLINE struct args *args_init_list(struct args *args, cnum argc, val list)
{
args->argc = argc;
args->fill = 0;
args->list = list;
+ return args;
}
-INLINE void args_init(struct args *args, cnum argc)
+INLINE struct args *args_init(struct args *args, cnum argc)
{
- args_init_list(args, argc, nil);
+ return args_init_list(args, argc, nil);
}
+#define args_decl_list(NAME, N, L) \
+ mem_t *NAME ## _mem = \
+ coerce(mem_t *, \
+ alloca(offsetof(struct args, arg) + (N)*sizeof (val))); \
+ struct args *NAME = args_init_list(coerce(struct args *, \
+ NAME ## _mem), N, L)
+
+#define args_decl(NAME, N) args_decl_list(NAME, N, nil)
+
+
INLINE val args_add(struct args *args, val arg)
{
return args->arg[args->fill++] = arg;