altos/lisp: Add incremental collection
[fw/altos] / src / test / ao_lisp_test.c
1 /*
2  * Copyright © 2016 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  */
14
15 #include "ao_lisp.h"
16 #include <stdio.h>
17
18 static FILE *ao_lisp_file;
19 static int newline = 1;
20
21 static char save_file[] = "lisp.image";
22
23 int
24 ao_lisp_os_save(void)
25 {
26         FILE    *save = fopen(save_file, "w");
27
28         if (!save) {
29                 perror(save_file);
30                 return 0;
31         }
32         fwrite(ao_lisp_pool, 1, AO_LISP_POOL_TOTAL, save);
33         fclose(save);
34         return 1;
35 }
36
37 int
38 ao_lisp_os_restore_save(struct ao_lisp_os_save *save, int offset)
39 {
40         FILE    *restore = fopen(save_file, "r");
41         size_t  ret;
42
43         if (!restore) {
44                 perror(save_file);
45                 return 0;
46         }
47         fseek(restore, offset, SEEK_SET);
48         ret = fread(save, sizeof (struct ao_lisp_os_save), 1, restore);
49         fclose(restore);
50         if (ret != 1)
51                 return 0;
52         return 1;
53 }
54
55 int
56 ao_lisp_os_restore(void)
57 {
58         FILE    *restore = fopen(save_file, "r");
59         size_t  ret;
60
61         if (!restore) {
62                 perror(save_file);
63                 return 0;
64         }
65         ret = fread(ao_lisp_pool, 1, AO_LISP_POOL_TOTAL, restore);
66         fclose(restore);
67         if (ret != AO_LISP_POOL_TOTAL)
68                 return 0;
69         return 1;
70 }
71
72 int
73 ao_lisp_getc(void)
74 {
75         int c;
76
77         if (ao_lisp_file)
78                 return getc(ao_lisp_file);
79
80         if (newline) {
81                 printf("> ");
82                 newline = 0;
83         }
84         c = getchar();
85         if (c == '\n')
86                 newline = 1;
87         return c;
88 }
89
90 int
91 main (int argc, char **argv)
92 {
93         while (*++argv) {
94                 ao_lisp_file = fopen(*argv, "r");
95                 if (!ao_lisp_file) {
96                         perror(*argv);
97                         exit(1);
98                 }
99                 ao_lisp_read_eval_print();
100                 fclose(ao_lisp_file);
101                 ao_lisp_file = NULL;
102         }
103         ao_lisp_read_eval_print();
104         printf ("collects: full: %d incremental %d\n",
105                 ao_lisp_collects[AO_LISP_COLLECT_FULL],
106                 ao_lisp_collects[AO_LISP_COLLECT_INCREMENTAL]);
107         printf ("freed: full %d incremental %d\n",
108                 ao_lisp_freed[AO_LISP_COLLECT_FULL],
109                 ao_lisp_freed[AO_LISP_COLLECT_INCREMENTAL]);
110 }