RPA Toolkit
added --dump-alias. Work on the RJS.
[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 static int debuginfo = 0;
17 static int parseinfo = 0;
18 static int compileonly = 0;
19 static int debugcompileonly = 0;
20
21
22 void rjs_unmap_file(rstr_t *buf)
23 {
24         if (buf) {
25                 munmap(buf->str, buf->size);
26                 r_free(buf);
27         }
28 }
29
30
31 rstr_t *rjs_map_file(const char *filename)
32 {
33         struct stat st;
34         rstr_t *str;
35         char *buffer;
36
37
38         int fd = open(filename, O_RDONLY);
39         if (fd < 0) {
40                 return (void*)0;
41         }
42         if (fstat(fd, &st) < 0) {
43                 close(fd);
44                 return (void*)0;
45         }
46         buffer = (char*)mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
47         if (buffer == (void*)-1) {
48                 close(fd);
49                 return (void*)0;
50         }
51         str = (rstr_t *)r_malloc(sizeof(*str));
52         if (!str)
53                 goto error;
54         r_memset(str, 0, sizeof(*str));
55         str->str = buffer;
56         str->size = st.st_size;
57         close(fd);
58         return str;
59
60 error:
61         munmap(buffer, st.st_size);
62         close(fd);
63         return str;
64 }
65
66
67 int main(int argc, char *argv[])
68 {
69         rint i;
70         rstr_t *script = NULL, *unmapscript = NULL;
71         rstr_t line;
72         rjs_engine_t *jse = rjs_engine_create();
73
74         for (i = 1; i < argc; i++) {
75                 if (r_strcmp(argv[i], "-L") == 0) {
76
77                 } else if (r_strcmp(argv[i], "-d") == 0) {
78                         debuginfo = 1;
79                 } else if (r_strcmp(argv[i], "-p") == 0) {
80                         parseinfo = 1;
81                 } else if (r_strcmp(argv[i], "-C") == 0) {
82                         debugcompileonly = 1;
83                 } else if (r_strcmp(argv[i], "-c") == 0) {
84                         compileonly = 1;
85                 } else if (r_strcmp(argv[i], "-m") == 0) {
86
87                 }
88         }
89
90
91         for (i = 1; i < argc; i++) {
92                 if (r_strcmp(argv[i], "-e") == 0) {
93                         if (++i < argc) {
94                                 line.str = argv[i];
95                                 line.size = r_strlen(argv[i]);
96                                 script = &line;
97                         }
98                         goto exec;
99                 }
100         }
101
102         for (i = 1; i < argc; i++) {
103                 if (r_strcmp(argv[i], "-f") == 0) {
104                         if (++i < argc) {
105                                 script = rjs_map_file(argv[i]);
106                                 if (script) {
107                                         unmapscript = script;
108                                 }
109                         }
110                         goto exec;
111                 }
112         }
113
114 exec:
115         if (!script)
116                 goto end;
117         if (parseinfo) {
118                 rjs_engine_dumpast(jse, script->str, script->size);
119         }
120
121         if (debugcompileonly) {
122                 jse->debugcompile = 1;
123                 rjs_engine_compile(jse, script->str, script->size);
124                 jse->debugcompile = 0;
125         }
126
127 end:
128         rjs_engine_destroy(jse);
129         if (unmapscript)
130                 rjs_unmap_file(unmapscript);
131         if (debuginfo)
132                 fprintf(stdout, "\nRJS Version: %s, memory: %ld KB (leaked %ld Bytes)\n", rjs_version(), (rlong)r_debug_get_maxmem()/1000, (rlong)r_debug_get_allocmem());
133         return 0;
134 }