summaryrefslogtreecommitdiffstats
path: root/args.h
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-08-17 06:37:10 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-08-17 06:37:10 -0700
commit9d481651d4f20d186ffda0a8680c043e656949b8 (patch)
treea192078b11cae5a652f026758e7ae2b7b32cac25 /args.h
parente1ddd69be814fa9fdaa2a0d2086c831f812e3cfa (diff)
downloadtxr-9d481651d4f20d186ffda0a8680c043e656949b8.tar.gz
txr-9d481651d4f20d186ffda0a8680c043e656949b8.tar.bz2
txr-9d481651d4f20d186ffda0a8680c043e656949b8.zip
Start of new way of handling variable arguments.
* Makefile (OBJS): Add args.o object. * args.c: New file. * args.h: New file.
Diffstat (limited to 'args.h')
-rw-r--r--args.h83
1 files changed, 83 insertions, 0 deletions
diff --git a/args.h b/args.h
new file mode 100644
index 00000000..e748bb71
--- /dev/null
+++ b/args.h
@@ -0,0 +1,83 @@
+/* Copyright 2009-2015
+ * Kaz Kylheku <kaz@kylheku.com>
+ * Vancouver, Canada
+ * All rights reserved.
+ *
+ * Redistribution of this software in source and binary forms, with or without
+ * modification, is permitted provided that the following two conditions are met.
+ *
+ * Use of this software in any manner constitutes agreement with the disclaimer
+ * which follows the two conditions.
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DAMAGES, HOWEVER CAUSED,
+ * AND UNDER ANY THEORY OF LIABILITY, ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+struct args {
+ cnum argc;
+ cnum fill;
+ val list;
+ val arg[1];
+};
+
+typedef int arg_index;
+
+#define ARGS_MAX 1024
+
+#define args_alloc(N) \
+ (coerce(struct args *, \
+ alloca(offsetof(struct args, arg) + (N)*sizeof (val))))
+
+cnum args_limit(val name, cnum in);
+
+INLINE void args_init(struct args *args, cnum argc)
+{
+ args->argc = argc;
+ args->fill = 0;
+ args->list = nil;
+}
+
+INLINE void args_init_list(struct args *args, cnum argc, val list)
+{
+ args->argc = argc;
+ args->fill = 0;
+ args->list = list;
+}
+
+INLINE val args_add(struct args *args, val arg)
+{
+ return args->arg[args->fill++] = arg;
+}
+
+void args_add_list(struct args *args, val list);
+
+val args_add_checked(val name, struct args *args, val arg);
+
+INLINE int args_more(struct args *args, cnum index)
+{
+ return index < args->fill;
+}
+
+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);
+}
+
+INLINE val args_get(struct args *args, cnum *arg_index)
+{
+ return args->arg[(*arg_index)++];
+}
+
+val args_get_checked(val name, struct args *args, cnum *arg_index);