Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
[fw/altos] / src / scheme / test / ao_scheme_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_scheme.h"
16 #include <stdio.h>
17
18 static FILE *ao_scheme_file;
19 static int newline = 1;
20
21 static char save_file[] = "scheme.image";
22
23 int
24 ao_scheme_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_scheme_pool, 1, AO_SCHEME_POOL_TOTAL, save);
33         fclose(save);
34         return 1;
35 }
36
37 int
38 ao_scheme_os_restore_save(struct ao_scheme_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_scheme_os_save), 1, restore);
49         fclose(restore);
50         if (ret != 1)
51                 return 0;
52         return 1;
53 }
54
55 int
56 ao_scheme_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_scheme_pool, 1, AO_SCHEME_POOL_TOTAL, restore);
66         fclose(restore);
67         if (ret != AO_SCHEME_POOL_TOTAL)
68                 return 0;
69         return 1;
70 }
71
72 int
73 ao_scheme_getc(void)
74 {
75         int c;
76
77         if (ao_scheme_file)
78                 return getc(ao_scheme_file);
79
80         if (newline) {
81                 if (ao_scheme_read_stack)
82                         printf("+ ");
83                 else
84                         printf("> ");
85                 newline = 0;
86         }
87         c = getchar();
88         if (c == '\n')
89                 newline = 1;
90         return c;
91 }
92
93 int
94 main (int argc, char **argv)
95 {
96         (void) argc;
97
98         while (*++argv) {
99                 ao_scheme_file = fopen(*argv, "r");
100                 if (!ao_scheme_file) {
101                         perror(*argv);
102                         exit(1);
103                 }
104                 ao_scheme_read_eval_print();
105                 fclose(ao_scheme_file);
106                 ao_scheme_file = NULL;
107         }
108         ao_scheme_read_eval_print();
109
110         printf ("collects: full: %d incremental %d\n",
111                 ao_scheme_collects[AO_SCHEME_COLLECT_FULL],
112                 ao_scheme_collects[AO_SCHEME_COLLECT_INCREMENTAL]);
113
114         printf ("freed: full %d incremental %d\n",
115                 ao_scheme_freed[AO_SCHEME_COLLECT_FULL],
116                 ao_scheme_freed[AO_SCHEME_COLLECT_INCREMENTAL]);
117
118         printf("loops: full %d incremental %d\n",
119                 ao_scheme_loops[AO_SCHEME_COLLECT_FULL],
120                 ao_scheme_loops[AO_SCHEME_COLLECT_INCREMENTAL]);
121
122         printf("loops per collect: full %f incremental %f\n",
123                (double) ao_scheme_loops[AO_SCHEME_COLLECT_FULL] /
124                (double) ao_scheme_collects[AO_SCHEME_COLLECT_FULL],
125                (double) ao_scheme_loops[AO_SCHEME_COLLECT_INCREMENTAL] /
126                (double) ao_scheme_collects[AO_SCHEME_COLLECT_INCREMENTAL]);
127
128         printf("freed per collect: full %f incremental %f\n",
129                (double) ao_scheme_freed[AO_SCHEME_COLLECT_FULL] /
130                (double) ao_scheme_collects[AO_SCHEME_COLLECT_FULL],
131                (double) ao_scheme_freed[AO_SCHEME_COLLECT_INCREMENTAL] /
132                (double) ao_scheme_collects[AO_SCHEME_COLLECT_INCREMENTAL]);
133
134         printf("freed per loop: full %f incremental %f\n",
135                (double) ao_scheme_freed[AO_SCHEME_COLLECT_FULL] /
136                (double) ao_scheme_loops[AO_SCHEME_COLLECT_FULL],
137                (double) ao_scheme_freed[AO_SCHEME_COLLECT_INCREMENTAL] /
138                (double) ao_scheme_loops[AO_SCHEME_COLLECT_INCREMENTAL]);
139 }