summaryrefslogtreecommitdiffstats
path: root/args.h
diff options
context:
space:
mode:
Diffstat (limited to 'args.h')
-rw-r--r--args.h93
1 files changed, 81 insertions, 12 deletions
diff --git a/args.h b/args.h
index e748bb71..e75193d6 100644
--- a/args.h
+++ b/args.h
@@ -33,7 +33,8 @@ struct args {
typedef int arg_index;
-#define ARGS_MAX 1024
+#define ARGS_MAX 32
+#define ARGS_MIN 4
#define args_alloc(N) \
(coerce(struct args *, \
@@ -41,18 +42,16 @@ typedef int arg_index;
cnum args_limit(val name, cnum in);
-INLINE void args_init(struct args *args, cnum argc)
+INLINE void args_init_list(struct args *args, cnum argc, val list)
{
args->argc = argc;
args->fill = 0;
- args->list = nil;
+ args->list = list;
}
-INLINE void args_init_list(struct args *args, cnum argc, val list)
+INLINE void args_init(struct args *args, cnum argc)
{
- args->argc = argc;
- args->fill = 0;
- args->list = list;
+ args_init_list(args, argc, nil);
}
INLINE val args_add(struct args *args, val arg)
@@ -60,24 +59,94 @@ INLINE val args_add(struct args *args, val arg)
return args->arg[args->fill++] = arg;
}
-void args_add_list(struct args *args, val list);
+INLINE void args_add2(struct args *args, val arg1, val arg2)
+{
+ val *arg = args->arg + args->fill;
+ args->fill += 2;
+ *arg++ = arg1;
+ *arg++ = arg2;
+}
+
+INLINE void args_add3(struct args *args, val arg1, val arg2, val arg3)
+{
+ val *arg = args->arg + args->fill;
+ args->fill += 3;
+ *arg++ = arg1;
+ *arg++ = arg2;
+ *arg++ = arg3;
+}
+
+INLINE void args_add4(struct args *args, val arg1, val arg2, val arg3, val arg4)
+{
+ val *arg = args->arg + args->fill;
+ args->fill += 4;
+ *arg++ = arg1;
+ *arg++ = arg2;
+ *arg++ = arg3;
+ *arg++ = arg4;
+}
val args_add_checked(val name, struct args *args, val arg);
INLINE int args_more(struct args *args, cnum index)
{
- return index < args->fill;
+ return index < args->fill || args->list;
+}
+
+INLINE int args_two_more(struct args *args, cnum index)
+{
+ return
+ index + 1 < args->fill ||
+ (index + 1 == args->fill && args->list) ||
+ cdr(args->list);
}
+void args_normalize(struct args *args, cnum fill);
+void args_normalize_fill(struct args *args, cnum minfill, cnum maxfill);
+
INLINE val args_get_list(struct args *args)
{
- extern val args_cons_list(struct args *args);
- return (args->fill == 0 || args->list) ? args->list : args_cons_list(args);
+ if (args->fill == 0)
+ return z(args->list);
+ args_normalize(args, 0);
+ return z(args->list);
+}
+
+INLINE val args_get_rest(struct args *args, cnum index)
+{
+ if (args->fill == index)
+ return z(args->list);
+ args_normalize(args, index);
+ return z(args->list);
+}
+
+
+INLINE val args_at(struct args *args, cnum arg_index)
+{
+ if (arg_index < args->fill)
+ return args->arg[arg_index];
+ return car(args->list);
+}
+
+INLINE val args_atz(struct args *args, cnum arg_index)
+{
+ if (arg_index < args->fill)
+ return z(args->arg[arg_index]);
+ return car(z(args->list));
}
INLINE val args_get(struct args *args, cnum *arg_index)
{
- return args->arg[(*arg_index)++];
+ if (*arg_index < args->fill)
+ return z(args->arg[(*arg_index)++]);
+ return pop(&args->list);
+}
+
+INLINE void args_clear(struct args *args)
+{
+ args->fill = 0;
}
val args_get_checked(val name, struct args *args, cnum *arg_index);
+struct args *args_copy(struct args *to, struct args *from);
+struct args *args_copy_zap(struct args *to, struct args *from);