annotate repl.c @ 800:299dffade145

buffer: use the common buffer test string for read-only tests Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Fri, 03 Apr 2020 15:11:57 -0400
parents 5cf0b7d1acf2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
141
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
1 /*
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
2 * Copyright (c) 2017 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
3 *
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
5 * of this software and associated documentation files (the "Software"), to deal
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
6 * in the Software without restriction, including without limitation the rights
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
8 * copies of the Software, and to permit persons to whom the Software is
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
9 * furnished to do so, subject to the following conditions:
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
10 *
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
11 * The above copyright notice and this permission notice shall be included in
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
12 * all copies or substantial portions of the Software.
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
13 *
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
20 * SOFTWARE.
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
21 */
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
22
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
23 #include <libtecla.h>
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
24
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
25 #include <jeffpc/types.h>
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
26 #include <jeffpc/sexpr.h>
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
27
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
28 static char *repl_read(GetLine *gl)
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
29 {
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
30 char *line;
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
31 size_t len;
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
32
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
33 line = gl_get_line(gl, "REPL> ", NULL, -1);
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
34 if (!line)
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
35 return NULL;
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
36
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
37 len = strlen(line);
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
38 if (line[len - 1] == '\n')
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
39 line[len - 1] = '\0';
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
40
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
41 return line;
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
42 }
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
43
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
44 static void repl_print(struct val *e)
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
45 {
343
5cf0b7d1acf2 sexpr: sexpr_dump* should propagate errors to the caller
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 223
diff changeset
46 int ret;
5cf0b7d1acf2 sexpr: sexpr_dump* should propagate errors to the caller
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 223
diff changeset
47
141
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
48 switch (e->type) {
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
49 case VT_BOOL:
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
50 case VT_INT:
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
51 case VT_CHAR:
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
52 case VT_STR:
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
53 /* atoms get printed as-is */
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
54 break;
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
55 case VT_CONS:
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
56 case VT_SYM:
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
57 /* more complex things get a ' prepended */
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
58 printf("'");
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
59 break;
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
60 }
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
61
343
5cf0b7d1acf2 sexpr: sexpr_dump* should propagate errors to the caller
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 223
diff changeset
62 ret = sexpr_dump_file(stdout, e, false);
5cf0b7d1acf2 sexpr: sexpr_dump* should propagate errors to the caller
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 223
diff changeset
63 if (ret)
5cf0b7d1acf2 sexpr: sexpr_dump* should propagate errors to the caller
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 223
diff changeset
64 printf("Error: %s", xstrerror(ret));
141
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
65 printf("\n");
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
66 }
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
67
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
68 int main(int argc, char **argv)
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
69 {
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
70 GetLine *gl;
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
71
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
72 gl = new_GetLine(1024, 1000);
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
73 if (!gl) {
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
74 fprintf(stderr, "Failed to initialize libtecla\n");
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
75 return 1;
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
76 }
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
77
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
78 for (;;) {
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
79 struct val *e;
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
80 char *line;
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
81
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
82 line = repl_read(gl);
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
83 if (!line)
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
84 break;
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
85
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
86 if (strlen(line) == 0)
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
87 continue;
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
88
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
89 e = sexpr_parse(line, strlen(line));
223
25bdbfb5dc52 sexpr: parsing failure shouldn't assert
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 175
diff changeset
90 if (IS_ERR(e)) {
25bdbfb5dc52 sexpr: parsing failure shouldn't assert
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 175
diff changeset
91 fprintf(stderr, "Failed to parse input: %s\n",
25bdbfb5dc52 sexpr: parsing failure shouldn't assert
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 175
diff changeset
92 xstrerror(PTR_ERR(e)));
25bdbfb5dc52 sexpr: parsing failure shouldn't assert
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 175
diff changeset
93 continue;
25bdbfb5dc52 sexpr: parsing failure shouldn't assert
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 175
diff changeset
94 }
141
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
95
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
96 e = sexpr_eval(e, NULL);
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
97
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
98 repl_print(e);
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
99
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
100 val_putref(e);
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
101 }
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
102
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
103 del_GetLine(gl);
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
104
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
105 return 0;
08416c57f077 sexpr: implement a simple REPL for the sexpr APIs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
106 }