9 static void jsB_gc(js_State *J)
11 int report = js_toboolean(J, 1);
16 static void jsB_load(js_State *J)
18 const char *filename = js_tostring(J, 1);
19 int rv = js_dofile(J, filename);
20 js_pushboolean(J, !rv);
23 static void jsB_print(js_State *J)
25 unsigned int i, top = js_gettop(J);
26 for (i = 1; i < top; ++i) {
27 const char *s = js_tostring(J, i);
28 if (i > 1) putchar(' ');
35 static void jsB_write(js_State *J)
37 unsigned int i, top = js_gettop(J);
38 for (i = 1; i < top; ++i) {
39 const char *s = js_tostring(J, i);
40 if (i > 1) putchar(' ');
46 static void jsB_read(js_State *J)
48 const char *filename = js_tostring(J, 1);
53 f = fopen(filename, "rb");
55 js_error(J, "cannot open file: '%s'", filename);
58 if (fseek(f, 0, SEEK_END) < 0) {
60 js_error(J, "cannot seek in file: '%s'", filename);
66 js_error(J, "cannot tell in file: '%s'", filename);
69 if (fseek(f, 0, SEEK_SET) < 0) {
71 js_error(J, "cannot seek in file: '%s'", filename);
77 js_error(J, "cannot allocate storage for file contents: '%s'", filename);
80 t = fread(s, 1, n, f);
84 js_error(J, "cannot read data from file: '%s'", filename);
93 static void jsB_readline(js_State *J)
97 if (!fgets(line, sizeof line, stdin))
98 js_error(J, "cannot read line from stdin");
100 if (n > 0 && line[n-1] == '\n')
102 js_pushstring(J, line);
105 static void jsB_quit(js_State *J)
107 exit(js_tonumber(J, 1));
110 static const char *require_js =
111 "function require(name) {\n"
112 "var cache = require.cache;\n"
113 "if (name in cache) return cache[name];\n"
114 "var exports = {};\n"
115 "cache[name] = exports;\n"
116 "Function('exports', read(name+'.js'))(exports);\n"
119 "require.cache = Object.create(null);\n"
123 main(int argc, char **argv)
129 J = js_newstate(NULL, NULL, JS_STRICT);
131 js_newcfunction(J, jsB_gc, "gc", 0);
132 js_setglobal(J, "gc");
134 js_newcfunction(J, jsB_load, "load", 1);
135 js_setglobal(J, "load");
137 js_newcfunction(J, jsB_print, "print", 1);
138 js_setglobal(J, "print");
140 js_newcfunction(J, jsB_write, "write", 0);
141 js_setglobal(J, "write");
143 js_newcfunction(J, jsB_read, "read", 1);
144 js_setglobal(J, "read");
146 js_newcfunction(J, jsB_readline, "readline", 0);
147 js_setglobal(J, "readline");
149 js_newcfunction(J, jsB_quit, "quit", 1);
150 js_setglobal(J, "quit");
152 js_dostring(J, require_js, 0);
155 for (i = 1; i < argc; ++i) {
156 if (js_dofile(J, argv[i]))
162 while (fgets(line, sizeof line, stdin)) {
163 js_dostring(J, line, 1);