aboutsummaryrefslogtreecommitdiffstats
path: root/shell.c
diff options
context:
space:
mode:
authorClyne Sullivan <tullivan99@gmail.com>2018-01-29 20:19:22 -0500
committerClyne Sullivan <tullivan99@gmail.com>2018-01-29 20:19:22 -0500
commitb9ceb80c9caa2a4a1659615991e7daa0b1d9fb66 (patch)
treebc0720404a935018c75524555d90a320512398c6 /shell.c
parentaccef5f54c0a38b0de3c2dddbaf7b30c6d226541 (diff)
rewrite; a lot better now
Diffstat (limited to 'shell.c')
-rw-r--r--shell.c40
1 files changed, 28 insertions, 12 deletions
diff --git a/shell.c b/shell.c
index b19add8..578cabe 100644
--- a/shell.c
+++ b/shell.c
@@ -1,26 +1,42 @@
#include <parser.h>
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
-void test(stack_t *stack)
+void test(interpreter *it)
{
- printf("%s\n", stack[0]);
+ char *s = igetarg_string(it, 0);
+ if (s == 0)
+ s = "(null)";
+ printf("%s\n", s);
}
-int main(int argc, char *argv[])
+void quit(interpreter *it)
+{
+ (void)it;
+ exit(0);
+}
+
+int main()
{
interpreter interp;
- interpreter_init(&interp);
- interpreter_define_value(&interp, "answer", "42");
- interpreter_define_cfunc(&interp, "test", test);
+ iinit(&interp);
+ inew_integer(&interp, "answer", 42);
+ inew_cfunc(&interp, "put", test);
+ inew_cfunc(&interp, "exit", quit);
+
- if (argc > 1) {
- for (int i = 1; i < argc; i++) {
- int result = interpreter_doline(&interp, argv[i]);
- if (result != 0)
- printf("%d\n", result);
- }
+ char *line = 0;
+ unsigned int size;
+ int result;
+ while (1) {
+ getline(&line, &size, stdin);
+ *strchr(line, '\n') = '\0';
+ result = idoline(&interp, line);
+ if (result != 0)
+ printf("Error: %d\n", result);
}
return 0;