57 lines
2.0 KiB
C
57 lines
2.0 KiB
C
|
#if 0
|
||
|
/*─────────────────────────────────────────────────────────────────╗
|
||
|
│ To the extent possible under law, Justine Tunney has waived │
|
||
|
│ all copyright and related or neighboring rights to this file, │
|
||
|
│ as it is written in the following disclaimers: │
|
||
|
│ • http://unlicense.org/ │
|
||
|
│ • http://creativecommons.org/publicdomain/zero/1.0/ │
|
||
|
╚─────────────────────────────────────────────────────────────────*/
|
||
|
#endif
|
||
|
#include "libc/calls/calls.h"
|
||
|
#include "libc/calls/struct/stat.h"
|
||
|
#include "libc/log/check.h"
|
||
|
#include "libc/mem/mem.h"
|
||
|
#include "libc/runtime/gc.h"
|
||
|
#include "libc/sysv/consts/o.h"
|
||
|
#include "third_party/duktape/duktape.h"
|
||
|
|
||
|
static duk_ret_t NativePrint(duk_context *ctx) {
|
||
|
duk_push_string(ctx, " ");
|
||
|
duk_insert(ctx, 0);
|
||
|
duk_join(ctx, duk_get_top(ctx) - 1);
|
||
|
fputs(duk_safe_to_string(ctx, -1), stdout);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static duk_ret_t NativeAdd(duk_context *ctx) {
|
||
|
int i, n;
|
||
|
double r;
|
||
|
n = duk_get_top(ctx);
|
||
|
for (r = i = 0; i < n; i++) r += duk_to_number(ctx, i);
|
||
|
duk_push_number(ctx, r);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
int main(int argc, char *argv[]) {
|
||
|
int fd;
|
||
|
struct stat st;
|
||
|
const char *code;
|
||
|
duk_context *ctx;
|
||
|
ctx = duk_create_heap_default();
|
||
|
duk_push_c_function(ctx, NativePrint, DUK_VARARGS);
|
||
|
duk_put_global_string(ctx, "NativePrint");
|
||
|
duk_push_c_function(ctx, NativeAdd, DUK_VARARGS);
|
||
|
duk_put_global_string(ctx, "NativeAdd");
|
||
|
|
||
|
CHECK_NE(-1, (fd = open("zip:examples/hello.js", O_RDONLY)));
|
||
|
CHECK_NE(-1, fstat(fd, &st));
|
||
|
CHECK_NOTNULL((code = gc(malloc(st.st_size))));
|
||
|
CHECK_EQ(st.st_size, read(fd, code, st.st_size));
|
||
|
CHECK_NE(-1, close(fd));
|
||
|
|
||
|
duk_eval_string(ctx, code);
|
||
|
duk_pop(ctx);
|
||
|
duk_destroy_heap(ctx);
|
||
|
return 0;
|
||
|
}
|