RPA Toolkit
34a2c12be603adcd39205dfd8ef8530b2b160c9c
[rpatk.git] / rjs / rjsexec.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #include <sys/types.h>
6 #include <fcntl.h>
7 #include <unistd.h>
8 #include <sys/mman.h>
9
10 #include "rstring.h"
11 #include "rmem.h"
12 #include "rjs.h"
13 #include "rparecord.h"
14
15
16
17 void rjs_unmap_file(rstr_t *buf)
18 {
19         if (buf) {
20                 munmap(buf->str, buf->size);
21                 r_free(buf);
22         }
23 }
24
25
26 rstr_t *rjs_map_file(const char *filename)
27 {
28         struct stat st;
29         rstr_t *str;
30         char *buffer;
31
32
33         int fd = open(filename, O_RDONLY);
34         if (fd < 0) {
35                 return (void*)0;
36         }
37         if (fstat(fd, &st) < 0) {
38                 close(fd);
39                 return (void*)0;
40         }
41         buffer = (char*)mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
42         if (buffer == (void*)-1) {
43                 close(fd);
44                 return (void*)0;
45         }
46         str = (rstr_t *)r_malloc(sizeof(*str));
47         if (!str)
48                 goto error;
49         r_memset(str, 0, sizeof(*str));
50         str->str = buffer;
51         str->size = st.st_size;
52         close(fd);
53         return str;
54
55 error:
56         munmap(buffer, st.st_size);
57         close(fd);
58         return str;
59 }
60
61
62 int main(int argc, char *argv[])
63 {
64         rint i;
65         rlong res;
66         rstr_t *script = NULL, *unmapscript = NULL;
67         rjs_parser_t *parser = rjs_parser_create();
68         rarray_t *records = 0;
69
70         if (!parser)
71                 return 1;
72         r_printf("RJS Version: %s\n", rjs_version());
73
74         for (i = 1; i < argc; i++) {
75                 if (r_strcmp(argv[i], "-e") == 0) {
76                         if (++i < argc) {
77                                 rstr_t script = { argv[i], r_strlen(argv[i]) };
78                                 res = rjs_parser_exec(parser, script.str, script.size, &records);
79                         }
80                         goto exec;
81                 }
82         }
83
84         for (i = 1; i < argc; i++) {
85                 if (r_strcmp(argv[i], "-f") == 0) {
86                         if (++i < argc) {
87                                 script = rjs_map_file(argv[i]);
88                                 if (script) {
89                                         res = rjs_parser_exec(parser, script->str, script->size, &records);;
90                                         unmapscript = script;
91                                 }
92                         }
93                         goto exec;
94                 }
95         }
96
97 exec:
98         if (records) {
99                 rlong i;
100                 for (i = 0; i < r_array_length(records); i++)
101                         rpa_record_dump(records, i);
102         }
103         rjs_parser_destroy(parser);
104         if (unmapscript)
105                 rjs_unmap_file(unmapscript);
106         return 0;
107 }