ref: 8aa062755760b61f9131a0411e9125bafddc0a4f
dir: /jsstate.c/
#include "js.h" #include "jsobject.h" #include "jsrun.h" #include "jsstate.h" void js_loadstring(js_State *J, const char *source) { jsR_loadscript(J, "(string)", source); } void js_loadfile(js_State *J, const char *filename) { FILE *f; char *s; int n, t; f = fopen(filename, "r"); if (!f) { js_error(J, "cannot open file: '%s'", filename); } if (fseek(f, 0, SEEK_END) < 0) { fclose(f); js_error(J, "cannot seek in file: '%s'", filename); } n = ftell(f); fseek(f, 0, SEEK_SET); s = malloc(n + 1); /* add space for string terminator */ if (!s) { fclose(f); js_error(J, "cannot allocate storage for file contents: '%s'", filename); } t = fread(s, 1, n, f); if (t != n) { free(s); fclose(f); js_error(J, "cannot read data from file: '%s'", filename); } s[n] = 0; /* zero-terminate string containing file data */ if (js_try(J)) { free(s); fclose(f); js_throw(J); } jsR_loadscript(J, filename, s); free(s); fclose(f); js_endtry(J); } int js_dostring(js_State *J, const char *source) { if (js_try(J)) { fprintf(stderr, "libjs: %s\n", js_tostring(J, -1)); return 1; } js_loadstring(J, source); js_pushglobal(J); js_call(J, 0); js_pop(J, 1); js_endtry(J); return 0; } int js_dofile(js_State *J, const char *filename) { if (js_try(J)) { fprintf(stderr, "libjs: %s\n", js_tostring(J, -1)); return 1; } js_loadfile(J, filename); js_pushglobal(J); js_call(J, 0); js_pop(J, 1); js_endtry(J); return 0; } js_State *js_newstate(void) { js_State *J = malloc(sizeof *J); memset(J, 0, sizeof(*J)); J->gcmark = 1; J->G = jsR_newobject(J, JS_COBJECT, NULL); J->E = jsR_newenvironment(J, J->G, NULL); jsB_init(J); return J; }