static const char *test_closure(void) { struct v7_val *v; struct v7 *v7 = v7_create(); ASSERT((v = v7_exec(v7, "function a(x){return function(y){return x*y}}")) != NULL); ASSERT((v = v7_exec(v7, "var f1 = a(5);")) != NULL); ASSERT((v = v7_exec(v7, "var f2 = a(7);")) != NULL); ASSERT((v = v7_exec(v7, "f1(3);")) != NULL); ASSERT(check_num(v7, v, 15.0)); ASSERT((v = v7_exec(v7, "f2(3);")) != NULL); ASSERT(check_num(v7, v, 21.0)); v7_destroy(&v7); return NULL; }
void sj_init_uart(struct v7 *v7) { v7_val_t uart = V7_UNDEFINED, uart_proto = V7_UNDEFINED, uart_ctor = V7_UNDEFINED; v7_own(v7, &uart); v7_own(v7, &uart_proto); v7_own(v7, &uart_ctor); uart = v7_mk_object(v7); uart_proto = v7_mk_object(v7); uart_ctor = v7_mk_function_with_proto(v7, UART_ctor, uart_proto); v7_def(v7, uart, "dev", ~0, _V7_DESC_HIDDEN(1), uart_ctor); v7_set_method(v7, uart_proto, "read", UART_read); v7_set_method(v7, uart_proto, "write", UART_write); v7_set_method(v7, uart_proto, "recv", UART_recv); v7_set(v7, v7_get_global(v7), "UART", ~0, uart); { enum v7_err rcode = v7_exec( v7, "UART.open = function (d) { return new UART.dev(d); }", NULL); assert(rcode == V7_OK); #if defined(NDEBUG) (void) rcode; #endif } v7_disown(v7, &uart_ctor); v7_disown(v7, &uart_proto); v7_disown(v7, &uart); }
void sj_init_uart(struct v7 *v7) { v7_val_t uart = v7_create_undefined(), uart_proto = v7_create_undefined(), uart_ctor = v7_create_undefined(); v7_own(v7, &uart); v7_own(v7, &uart_proto); v7_own(v7, &uart_ctor); uart = v7_create_object(v7); uart_proto = v7_create_object(v7); uart_ctor = v7_create_constructor(v7, uart_proto, UART_ctor); v7_set(v7, uart, "dev", ~0, V7_PROPERTY_HIDDEN, uart_ctor); v7_set_method(v7, uart_proto, "read", UART_read); v7_set_method(v7, uart_proto, "write", UART_write); v7_set_method(v7, uart_proto, "recv", UART_recv); v7_set(v7, v7_get_global(v7), "UART", ~0, 0, uart); { enum v7_err rcode = v7_exec( v7, "UART.open = function (d) { return new UART.dev(d); }", NULL); assert(rcode == V7_OK); #if defined(NDEBUG) (void) rcode; #endif } v7_disown(v7, &uart_ctor); v7_disown(v7, &uart_proto); v7_disown(v7, &uart); }
static void process_js(char *cmd) { s_sjp.char_processor = interrupt_char_processor; v7_val_t v; int res = v7_exec(s_sjp.v7, &v, cmd); if (res == V7_SYNTAX_ERROR) { printf("Syntax error: %s\n", v7_get_parser_error(s_sjp.v7)); } else if (res == V7_STACK_OVERFLOW) { printf("Stack overflow: %s\n", v7_get_parser_error(s_sjp.v7)); } else { if (res == V7_EXEC_EXCEPTION) { printf("Exec error:"); } v7_println(s_sjp.v7, v); #if V7_ENABLE__StackTrace if (res == V7_EXEC_EXCEPTION) { v7_fprint_stack_trace(stdout, s_sjp.v7, v); } #endif } v7_gc(s_sjp.v7, 0 /* full */); }
void sj_init_conf(struct v7 *v7, char *conf_str) { int i; const char *names[] = {"sys.json", "user.json"}; v7_val_t conf = v7_create_object(v7); v7_set(v7, v7_get_global_object(v7), "conf", ~0, 0, conf); if (conf_str != NULL) { v7_val_t res; enum v7_err err; /* * Usage of strlen in weird here * but we use snprintf as well. * TODO(alashkin): think about providing len * as function argument AND changing of snprintf to * something else */ size_t len = strlen(conf_str); char *f = (char *) malloc(len + 3); snprintf(f, len + 3, "(%s)", conf_str); /* TODO(mkm): simplify when we'll have a C json parse API */ err = v7_exec(v7, &res, f); free(f); if (err != V7_OK) { printf("exc parsing dev conf: %s\n", f); v7_println(v7, res); } else { v7_set(v7, conf, "dev", ~0, 0, res); } } for (i = 0; i < (int) sizeof(names) / sizeof(names[0]); i++) { const char *name = names[i]; v7_set(v7, conf, name, strlen(name) - 5, 0, load_conf(v7, name)); } }
static void ev_handler(struct ns_connection *nc, enum ns_event ev, void *p) { struct v7 *v7 = (struct v7 *) nc->server->server_data; struct v7_val *jsconn; printf("C handler: %p %d\n", nc, ev); // Call javascript event handler v7_exec(v7, "ev_handler"); jsconn = v7_push(v7, V7_OBJ); v7_push(v7, V7_NUM)->v.num = ev; v7_push(v7, V7_NUM)->v.num = (unsigned long) p; v7_set_num(jsconn, "nc", (unsigned long) nc); v7_set_str(jsconn, "recv_buf", nc->recv_iobuf.buf, nc->recv_iobuf.len); v7_set_str(jsconn, "send_buf", nc->send_iobuf.buf, nc->send_iobuf.len); v7_set_func(jsconn, "write", js_write); v7_set_func(jsconn, "close", js_close); v7_call(v7, v7_top(v7) - 4); // Exit if we receive string 'exit' if (ev == NS_RECV && (* (int *) p) == 4 && memcmp(nc->recv_iobuf.buf + nc->recv_iobuf.len - 4, "exit", 4) == 0) { s_received_signal = 1; } }
int main(int argc, char *argv[]) { struct v7 *v7 = v7_create(); int i, error_code; // Execute inline code for (i = 1; i < argc && argv[i][0] == '-'; i++) { if (strcmp(argv[i], "-e") == 0 && i + 1 < argc) { if ((error_code = v7_exec(v7, argv[i + 1])) != V7_OK) { fprintf(stderr, "Error executing [%s]: %s\n", argv[i + 1], v7_strerror(error_code)); } i++; } } // Execute files for (; i < argc; i++) { if ((error_code = v7_exec_file(v7, argv[i])) != V7_OK) { fprintf(stderr, "%s line %d: %s\n", argv[i], v7->pstate.line_no, v7_strerror(error_code)); } } v7_destroy(&v7); return EXIT_SUCCESS; }
static void process_js(char *cmd) { s_sjp.char_processor = interrupt_char_processor; char result_str[10]; v7_val_t v; int res = v7_exec(s_sjp.v7, &v, cmd); if (res == V7_SYNTAX_ERROR) { printf("Syntax error: %s\n", v7_get_parser_error(s_sjp.v7)); } else if (res == V7_STACK_OVERFLOW) { printf("Stack overflow: %s\n", v7_get_parser_error(s_sjp.v7)); } else { char *p = v7_to_json(s_sjp.v7, v, result_str, sizeof(result_str)); if (res == V7_EXEC_EXCEPTION) { printf("Exec error:"); } printf("%s\n", p); if (p != result_str) { free(p); } } v7_gc(s_sjp.v7, 0 /* full */); }
int main(void) { v7_val_t result; struct v7 *v7 = v7_create(); v7_exec(v7, "var sum = function(a, b) { return a + b; };", &result); call_sum(v7); v7_destroy(v7); return 0; }
int main(void) { struct v7 *v7 = v7_create(); v7_val_t result; v7_set_method(v7, v7_get_global_object(v7), "sum", &js_sum); v7_exec(v7, &result, "print(sum(1.2, 3.4))"); v7_destroy(v7); return 0; }
static const char *test_native_functions(void) { struct v7_val *v; struct v7 *v7 = v7_create(); ASSERT(v7_set(v7, v7_global(v7), "adder", v7_push_func(v7, adder)) == V7_OK); ASSERT((v = v7_exec(v7, "adder(1, 2, 3 + 4);")) != NULL); ASSERT(check_num(v7, v, 10.0)); v7_destroy(&v7); return NULL; }
static const char *test_native_functions(void) { static struct v7_val adder_func_obj; struct v7 *v7 = v7_create(); v7_init_func(&adder_func_obj, &adder); v7_setv(v7, v7_rootns(v7), V7_TYPE_STR, V7_TYPE_OBJ, "adder", 5, 0, &adder_func_obj); ASSERT(v7_exec(v7, "adder(1, 2, 3 + 4);") == V7_OK); ASSERT(check_num(v7, 10.0)); v7_destroy(&v7); return NULL; }
int main(void) { enum v7_err rcode = V7_OK; struct v7 *v7 = v7_create(); v7_val_t result; v7_set_method(v7, v7_get_global(v7), "sum", &js_sum); rcode = v7_exec(v7, "print(sum(1.2, 3.4))", &result); if (rcode != V7_OK) { v7_print_error(stderr, v7, "Evaluation error", result); } v7_destroy(v7); return (int) rcode; }
int main(void) { enum v7_err rcode = V7_OK; v7_val_t result; struct v7 *v7 = v7_create(); rcode = v7_exec(v7, "var sum = function(a, b) { return a + b; };", &result); if (rcode != V7_OK) { fprintf(stderr, "exec error: %d\n", (int)rcode); goto clean; } call_sum(v7); clean: v7_destroy(v7); return (int)rcode; }
int main(int argc, char *argv[]) { struct v7 *v7 = v7_create(); int i, error_code; v7_init_stdlib(v7); for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-e") == 0 && i + 1 < argc) { if ((error_code = v7_exec(v7, argv[i + 1])) != V7_OK) { fprintf(stderr, "Error executing [%s]: %d\n", argv[i + 1], error_code); } } } v7_destroy(&v7); return 0; }
static v7_val_t load_conf(struct v7 *v7, const char *name) { v7_val_t res; char *f; enum v7_err err; f = read_json_file(name); if (f == NULL) { printf("cannot read %s\n", name); return v7_create_object(v7); } err = v7_exec(v7, &res, f); free(f); if (err != V7_OK) { v7_println(v7, res); return v7_create_object(v7); } return res; }
int main(int argc, char *argv[]) { struct v7 *v7; int i, show_ast = 0; v7 = v7_create(); /* Execute inline code */ for (i = 1; i < argc && argv[i][0] == '-'; i++) { if (strcmp(argv[i], "-e") == 0 && i + 1 < argc) { if (show_ast) { dump_ast(argv[i + 1]); } else if (!v7_exec(v7, argv[i + 1])) { fprintf(stderr, "Error executing [%s]: %s\n", argv[i + 1], v7_get_error_string(v7)); } i++; } else if (strcmp(argv[i], static_show_ast_flag) == 0) { show_ast = 1; } else if (strcmp(argv[i], "-h") == 0) { show_usage(argv); } } /* Execute files */ for (; i < argc; i++) { if (show_ast) { size_t size; char *source_code; if ((source_code = read_file(argv[i], &size)) == NULL) { fprintf(stderr, "Cannot read [%s]\n", argv[i]); } else { dump_ast(source_code); free(source_code); } } else if (!v7_exec_file(v7, argv[i])) { fprintf(stderr, "%s\n", v7_get_error_string(v7)); } } v7_destroy(&v7); return EXIT_SUCCESS; }
static void server_eval(struct espconn *c, void *body, unsigned short size) { char *buf, *resp, *j; enum v7_err err; v7_val_t v; const char *code; buf = malloc(size + 1); snprintf(buf, size + 1, "%.*s", (int) size, body); err = v7_exec(v7, &v, buf); switch (err) { case V7_SYNTAX_ERROR: case V7_EXEC_EXCEPTION: code = "500 Eval error"; break; case V7_OK: code = "200 OK"; break; } switch (err) { case V7_SYNTAX_ERROR: j = malloc(512); strncpy(j, v7_get_parser_error(v7), 512); break; case V7_EXEC_EXCEPTION: case V7_OK: j = v7_to_json(v7, v, buf, sizeof(buf)); break; } int resp_len = strlen(code) + 13 + strlen(j) + 1; resp = malloc(resp_len); snprintf(resp, resp_len, "HTTP/1.1 %s\r\n\r\n%s", code, j); if (j != buf) free(j); free(buf); espconn_sent(c, resp, strlen(resp)); free(resp); }
enum v7_err v7_exec_file(struct v7 *v7, const char *path) { FILE *fp; char *p; size_t file_size; enum v7_err status = V7_INTERNAL_ERROR; if ((fp = fopen(path, "r")) == NULL) { } else if (fseek(fp, 0, SEEK_END) != 0 || (file_size = ftell(fp)) <= 0) { fclose(fp); } else if ((p = (char *) malloc(file_size + 1)) == NULL) { fclose(fp); } else { rewind(fp); fread(p, 1, file_size, fp); fclose(fp); p[file_size] = '\0'; v7->line_no = 1; status = v7_exec(v7, p); free(p); } return status; }
static const char *test_v7_exec(void) { struct v7 *v7 = v7_create(); ASSERT(v7_exec(v7, "") == V7_OK); ASSERT(v7_exec(v7, "-2;") == V7_OK); ASSERT(check_num(v7, -2.0)); ASSERT(v7_exec(v7, "3 + 4") == V7_OK); ASSERT(check_num(v7, 7.0)); ASSERT(v7_exec(v7, "123.456") == V7_OK); ASSERT(check_num(v7, 123.456)); ASSERT(v7_exec(v7, "NaN") == V7_OK); ASSERT(check_num(v7, NAN)); // TODO: fix infinity handling under MSVC6 #ifndef _WIN32 ASSERT(v7_exec(v7, "Infinity") == V7_OK); ASSERT(check_num(v7, INFINITY)); ASSERT(v7_exec(v7, "-Infinity") == V7_OK); ASSERT(check_num(v7, -INFINITY)); #endif ASSERT(v7_exec(v7, "2()") == V7_CALLED_NON_FUNCTION); ASSERT(v7_exec(v7, " 15 + 2 \r\n * 2 / 1 - 3 * 4 ; ") == V7_OK); ASSERT(v7_exec(v7, "( (5 ) );") == V7_OK); ASSERT(check_num(v7, 5.0)); ASSERT(v7_exec(v7, "(2 + (12 / 4));") == V7_OK); ASSERT(v7_top(v7)[-1]->type == V7_TYPE_NUM); ASSERT(v7_top(v7)[-1]->v.num == 5.0); ASSERT(v7_exec(v7, "1;2 7") == V7_OK); ASSERT(check_num(v7, 7.0)); ASSERT(v7_exec(v7, "a + 5") == V7_TYPE_ERROR); ASSERT(v7_exec(v7, "print();") == V7_OK); ASSERT(v7_exec(v7, "print(this);") == V7_OK); ASSERT(v7_exec(v7, "a = 7;") == V7_OK); ASSERT(check_num(v7, 7.0)); ASSERT(v7_exec(v7, "print(this);") == V7_OK); ASSERT(v7_exec(v7, "b = a + 3;") == V7_OK); ASSERT(check_num(v7, 10.0)); ASSERT(v7_exec(v7, "print(this);") == V7_OK); ASSERT(v7_exec(v7, "c = b * (a + 3) / 2;") == V7_OK); ASSERT(check_num(v7, 50.0)); ASSERT(v7_exec(v7, "print(this);") == V7_OK); ASSERT(v7_exec(v7, "var x = 12 + 2 - a + b+ 3 / 4 * a;") == V7_OK); ASSERT(v7_exec(v7, "b + 2; x + 3 + 1 z = x -2;") == V7_OK); ASSERT(v7_exec(v7, "x; var y, z;") == V7_OK); ASSERT(v7_exec(v7, "1 2 3") == V7_OK); ASSERT(v7_exec(v7, "var k = true;") == V7_OK); ASSERT(v7_top(v7)[-1]->type == V7_TYPE_BOOL); ASSERT(v7_top(v7)[-1]->v.num != 0.0); ASSERT(v7_exec(v7, "var blah = 'kuku';") == V7_OK); ASSERT(v7_top(v7)[-1]->type == V7_TYPE_STR); // Test that k.y does exist ASSERT(v7_exec(v7, "k = { y: 17 };") == V7_OK); ASSERT(v7_exec(v7, "k.y") == V7_OK); ASSERT(check_num(v7, 17.0)); v7_exec(v7, "print(this);"); // Delete k.y and make sure it's gone ASSERT(v7_exec(v7, "delete k.y;") == V7_OK); ASSERT(v7_exec(v7, "k.y;") == V7_OK); ASSERT(v7_top(v7)[-1]->type == V7_TYPE_UNDEF); ASSERT(v7_sp(v7) == 1); ASSERT(v7_exec(v7, "delete b; b;") == V7_OK); ASSERT(v7_top(v7)[-1]->type == V7_TYPE_UNDEF); ASSERT(v7_sp(v7) == 1); ASSERT(v7_exec(v7, "k = { key1: {x:3}, key2: ':-)', y: 5 };") == V7_OK); ASSERT(v7_top(v7)[-1]->type == V7_TYPE_OBJ); ASSERT(v7_sp(v7) == 1); ASSERT(v7_exec(v7, "k.x = 47;") == V7_OK); ASSERT(v7_exec(v7, "k.qwe = { foo: 5 };") == V7_OK); v7_exec(v7, "print(k);"); ASSERT(v7_exec(v7, "k.qwe.foo = 15;") == V7_OK); v7_exec(v7, "print(k);"); ASSERT(v7_exec(v7, "k.key1.x + 4") == V7_OK); ASSERT(check_num(v7, 7.0)); ASSERT(v7_exec(v7, "k.foo") == V7_OK); ASSERT(v7_top(v7)[-1]->type == V7_TYPE_UNDEF); ASSERT(v7_exec(v7, "var z = 'key1'; k[z]['x']") == V7_OK); ASSERT(check_num(v7, 3.0)); ASSERT(v7_exec(v7, "var stk = 1;") == V7_OK); ASSERT(check_num(v7, 1.0)); ASSERT(v7_exec(v7, "var f1 = function(x, y) { } ; ") == V7_OK); ASSERT(v7_sp(v7) > 0); ASSERT(v7_top(v7)[-1]->type == V7_TYPE_OBJ); ASSERT(memcmp(v7_top(v7)[-1]->v.func.source_code, "(x, y) { } ", 10) == 0); ASSERT(v7_exec(v7, "var f1 = function(x, y) { return x * y; };") == V7_OK); ASSERT(v7_is_class(v7_top(v7)[-1], V7_CLASS_FUNCTION)); ASSERT(v7_exec(v7, "f1(2, 3)") == V7_OK); ASSERT(check_num(v7, 6.0)); ASSERT(v7_exec(v7, "f1(12, 4) + 1;") == V7_OK); ASSERT(check_num(v7, 49.0)); ASSERT(v7_exec(v7, "f1(12, 4) * 2;") == V7_OK); ASSERT(check_num(v7, 96.0)); ASSERT(v7_exec(v7, "f = function(x,y,z) {print(this);};") == V7_OK); ASSERT(v7_sp(v7) == 1); ASSERT(v7_exec(v7, "f();") == V7_OK); ASSERT(v7_exec(v7, "f({});") == V7_OK); ASSERT(v7_exec(v7, "f(1, 2);") == V7_OK); ASSERT(v7_exec(v7, "f(123, {});") == V7_OK); ASSERT(v7_exec(v7, "if (0) f1 = 2; ") == V7_OK); ASSERT(v7_exec(v7, "if (5) { f1 = 3; f2 = function(){}; } ") == V7_OK); ASSERT(v7_exec(v7, "0 ? 1 : 2;") == V7_OK); ASSERT(check_num(v7, 2.0)); ASSERT(v7_exec(v7, "k = true ? 1 : 2;") == V7_OK); ASSERT(check_num(v7, 1.0)); ASSERT(v7_exec(v7, "var f = function(){var x=12; return x + 1;};") == V7_OK); ASSERT(v7_sp(v7) > 0); ASSERT(v7_exec(v7, "k = f(1,2,3);") == V7_OK); ASSERT(check_num(v7, 13.0)); ASSERT(v7_exec(v7, "(function() { return f() + 7; })()") == V7_OK); ASSERT(check_num(v7, 20.0)); ASSERT(v7_exec(v7, "var a = 1; if (a == 1) { a = 2; }; a;") == V7_OK); ASSERT(check_num(v7, 2.0)); ASSERT(v7_exec(v7, "var a = 'foo'; a == 'foo';") == V7_OK); ASSERT(check_bool(v7, 1.0)); ASSERT(v7_exec(v7, "a = { x: function(p) { print(this); } }") == V7_OK); ASSERT(v7_exec(v7, "a.x(2);") == V7_OK); ASSERT(v7_exec(v7, "74.toString()") == V7_OK); ASSERT(check_str(v7, "74")); ASSERT(v7_exec(v7, "'hello'.length") == V7_OK); ASSERT(check_num(v7, 5.0)); ASSERT(v7_exec(v7, "k = { x : function() { if (1) 2; } }") == V7_OK); ASSERT(v7_exec(v7, "'foo' + 'bar'") == V7_OK); ASSERT(check_str(v7, "foobar")); ASSERT(v7_exec(v7, "var x = [1, 'foo', true, 7];") == V7_OK); ASSERT(v7_exec(v7, "x.length") == V7_OK); ASSERT(check_num(v7, 4.0)); ASSERT(v7_exec(v7, "x[1]") == V7_OK); ASSERT(check_str(v7, "foo")); ASSERT(v7_exec(v7, "var f1 = function() { 1; };") == V7_OK); ASSERT(v7_exec(v7, "var f2 = function(x) { if (x) return x; };") == V7_OK); ASSERT(v7_exec(v7, "f1()") == V7_OK); ASSERT(v7->sp == 1 && v7->stack[0]->type == V7_TYPE_UNDEF); ASSERT(v7_exec(v7, "f2(false)") == V7_OK); ASSERT(v7->sp == 1 && v7->stack[0]->type == V7_TYPE_UNDEF); ASSERT(v7_exec(v7, "f2(17)") == V7_OK); ASSERT(check_num(v7, 17.0)); ASSERT(v7_exec(v7, "f2(true)") == V7_OK); ASSERT(check_bool(v7, 1.0)); ASSERT(v7_exec(v7, "1 <= 2 ? 7 : 8") == V7_OK); ASSERT(check_num(v7, 7.0)); ASSERT(v7_exec(v7, "function a (t) { return t * t }; ") == V7_OK); ASSERT(v7_exec(v7, "a(2)") == V7_OK); ASSERT(check_num(v7, 4.0)); ASSERT(v7_exec(v7, "a(0)") == V7_OK); ASSERT(check_num(v7, 0.0)); ASSERT(v7_exec(v7, "function fac(x) { " "return x <= 1 ? 1 : x * fac(x - 1); }") == V7_OK); ASSERT(v7_exec(v7, "fac(1)") == V7_OK); ASSERT(check_num(v7, 1.0)); ASSERT(v7_exec(v7, "fac(5)") == V7_OK); ASSERT(check_num(v7, 120.0)); ASSERT(v7_exec(v7, "fac(20)") == V7_OK); ASSERT(v7_exec(v7, "function qq(a,b) { return a + b; }") == V7_OK); ASSERT(v7_exec(v7, "qq(1,2)") == V7_OK); ASSERT(check_num(v7, 3.0)); ASSERT(v7_exec(v7, "1 < 2 == 2 < 3") == V7_OK); ASSERT(check_bool(v7, 1.0)); ASSERT(v7_exec(v7, "5 % 3 * 3") == V7_OK); ASSERT(check_num(v7, 6.0)); ASSERT(v7_exec(v7, "76 & 13") == V7_OK); ASSERT(check_num(v7, 12.0)); ASSERT(v7_exec(v7, "34325 ^ 190992 & 74832") == V7_OK); ASSERT(check_num(v7, 42501.0)); ASSERT(v7_exec(v7, "a = 12;") == V7_OK); ASSERT(v7_exec(v7, "a += 44; a;") == V7_OK); ASSERT(check_num(v7, 56.0)); ASSERT(v7_exec(v7, "a -= a / 2; a;") == V7_OK); ASSERT(check_num(v7, 28.0)); ASSERT(v7_exec(v7, "a *= 0.5; a;") == V7_OK); ASSERT(check_num(v7, 14.0)); #ifndef _WIN32 ASSERT(v7_exec(v7, "a /= 0; a;") == V7_OK); ASSERT(check_num(v7, INFINITY)); #endif ASSERT(v7_exec(v7, "!5") == V7_OK); ASSERT(check_bool(v7, 0.0)); ASSERT(v7_exec(v7, "!''") == V7_OK); ASSERT(check_bool(v7, 1.0)); ASSERT(v7_exec(v7, "1 != 2") == V7_OK); ASSERT(check_bool(v7, 1.0)); ASSERT(v7_exec(v7, "7 >= 0") == V7_OK); ASSERT(check_bool(v7, 1.0)); ASSERT(v7_exec(v7, "if (false) 3; ") == V7_OK); ASSERT(v7_exec(v7, "if (true) { if (1) {2;} 5; } ") == V7_OK); ASSERT(check_num(v7, 5.0)); ASSERT(v7_exec(v7, "if ('') 3; ") == V7_OK); ASSERT(v7_exec(v7, "if ('0') 9; ") == V7_OK); ASSERT(check_num(v7, 9.0)); ASSERT(v7_exec(v7, "if (false) 1; else 3;") == V7_OK); ASSERT(check_num(v7, 3.0)); ASSERT(v7_exec(v7, "if (false) 1; else if (0) { 3 } else { 2 }") == V7_OK); ASSERT(check_num(v7, 2.0)); ASSERT(v7_exec(v7, "if (false) 1; else if (1) { 3 } else { 2 }") == V7_OK); ASSERT(check_num(v7, 3.0)); ASSERT(v7_exec(v7, "a = 32; 2 + a++;") == V7_OK); ASSERT(check_num(v7, 35.0)); ASSERT(v7_exec(v7, "print(['hi', 1, true, null, /\\s+/])") == V7_OK); ASSERT(v7_exec(v7, "a = {};") == V7_OK); ASSERT(v7_exec(v7, "a.foo = function(x) { var y = " "x.substr(1).split() }") == V7_OK); ASSERT(v7_exec(v7, "typeof 2") == V7_OK); ASSERT(check_str(v7, "number")); v7_destroy(&v7); return NULL; }
static int test_if_expr(struct v7 *v7, const char *expr, int result) { struct v7_val *v = v7_exec(v7, expr); return v != NULL && (v7_is_true(v) ? 1 : 0) == result; }
static const char *test_stdlib(void) { struct v7 *v7 = v7_create(); // Number #ifndef _WIN32 ASSERT(v7_exec(v7, "Math.PI") == V7_OK); ASSERT(check_num(v7, M_PI)); ASSERT(v7_exec(v7, "Number.NaN") == V7_OK); ASSERT(check_num(v7, NAN)); #endif ASSERT(v7_exec(v7, "1 == 2") == V7_OK); ASSERT(check_bool(v7, 0)); ASSERT(v7_exec(v7, "1 + 2 * 7 === 15") == V7_OK); ASSERT(check_bool(v7, 1)); ASSERT(v7_exec(v7, "Number(1.23) === 1.23") == V7_OK); ASSERT(check_bool(v7, 1)); ASSERT(v7_exec(v7, "Number(1.23)") == V7_OK); ASSERT(check_num(v7, 1.23)); ASSERT(v7_exec(v7, "new Number(21.23)") == V7_OK); // String ASSERT(v7_exec(v7, "'hello'.charCodeAt(1)") == V7_OK); ASSERT(check_num(v7, 'e')); ASSERT(v7_exec(v7, "'hello'.charCodeAt(4)") == V7_OK); ASSERT(check_num(v7, 'o')); ASSERT(v7_exec(v7, "'hello'.charCodeAt(5) == Number.NaN") == V7_OK); ASSERT(check_bool(v7, 1.0)); ASSERT(v7_exec(v7, "'hello'.indexOf()") == V7_OK); ASSERT(check_num(v7, -1.0)); ASSERT(v7_exec(v7, "'HTTP/1.0\\r\\n'.indexOf('\\r\\n')") == V7_OK); ASSERT(check_num(v7, 8.0)); ASSERT(v7_exec(v7, "'hi there'.indexOf('e')") == V7_OK); ASSERT(check_num(v7, 5.0)); ASSERT(v7_exec(v7, "'hi there'.indexOf('e', 6)") == V7_OK); ASSERT(check_num(v7, 7.0)); ASSERT(v7_exec(v7, "'hi there'.substr(3, 2)") == V7_OK); ASSERT(check_str(v7, "th")); ASSERT(v7_exec(v7, "'hi there'.substr(3)") == V7_OK); ASSERT(check_str(v7, "there")); ASSERT(v7_exec(v7, "'hi there'.substr(-2)") == V7_OK); ASSERT(check_str(v7, "re")); ASSERT(v7_exec(v7, "'hi there'.substr(-20)") == V7_OK); ASSERT(check_str(v7, "")); ASSERT(v7_exec(v7, "'hi there'.substr(0, 300)") == V7_OK); ASSERT(check_str(v7, "")); ASSERT(v7_exec(v7, "'dew dee'.match(/\\d+/)") == V7_OK); ASSERT(v7->sp == 1 && v7->stack[0]->type == V7_TYPE_NULL); ASSERT(v7_exec(v7, "m = 'foo 1234 bar'.match(/\\S+ (\\d+)/)") == V7_OK); ASSERT(v7_exec(v7, "m.length") == V7_OK); ASSERT(check_num(v7, 2.0)); ASSERT(v7_exec(v7, "m[0]") == V7_OK); ASSERT(check_str(v7, "foo 1234")); ASSERT(v7_exec(v7, "m[1]") == V7_OK); ASSERT(check_str(v7, "1234")); ASSERT(v7_exec(v7, "m[2]") == V7_OK); ASSERT(v7->sp == 1 && v7->stack[0]->type == V7_TYPE_UNDEF); ASSERT(v7_exec(v7, "m = 'aa bb cc'.split(); m.length") == V7_OK); ASSERT(check_num(v7, 1.0)); ASSERT(v7_exec(v7, "m = 'aa bb cc'.split(''); m.length") == V7_OK); ASSERT(check_num(v7, 8.0)); ASSERT(v7_exec(v7, "m = 'aa bb cc'.split(' '); m.length") == V7_OK); ASSERT(check_num(v7, 3.0)); ASSERT(v7_exec(v7, "m = 'aa bb cc'.split(' ', 2); m.length") == V7_OK); ASSERT(check_num(v7, 2.0)); ASSERT(v7_exec(v7, "m = 'aa bb cc'.split(/ /, 2); m.length") == V7_OK); ASSERT(check_num(v7, 2.0)); ASSERT(v7_exec(v7, "'aa bb cc'.substr(0, 4).split(' ').length") == V7_OK); ASSERT(check_num(v7, 2.0)); ASSERT(v7_exec(v7, "'aa bb cc'.substr(0, 4).split(' ')[1]") == V7_OK); ASSERT(check_str(v7, "b")); ASSERT(v7_exec(v7, "{z: '123456'}.z.substr(0, 3).split('').length") == V7_OK); ASSERT(check_num(v7, 3.0)); ASSERT(v7_exec(v7, "String('hi')") == V7_OK); ASSERT(check_str(v7, "hi")); ASSERT(v7_exec(v7, "new String('blah')") == V7_OK); // Math ASSERT(v7_exec(v7, "Math.sqrt(144)") == V7_OK); ASSERT(check_num(v7, 12.0)); // Regexp ASSERT(v7_exec(v7, "re = /GET (\\S+) HTTP/") == V7_OK); v7_destroy(&v7); return NULL; }
static int test_if_expr(struct v7 *v7, const char *expr, int result) { return v7_exec(v7, expr) == V7_OK && v7_sp(v7) == 1 && (v7_is_true(v7_top(v7)[-1]) ? 1 : 0) == result; }
static const char *test_v7_exec(void) { struct v7_val *v; struct v7 *v7 = v7_create(); ASSERT((v = v7_exec(v7, "")) == NULL); ASSERT((v = v7_exec(v7, "-2;")) != NULL); ASSERT(check_num(v7, v, -2.0)); ASSERT((v = v7_exec(v7, "3 + 4")) != NULL); ASSERT(check_num(v7, v, 7.0)); ASSERT((v = v7_exec(v7, "123.456")) != NULL); ASSERT(check_num(v7, v, 123.456)); ASSERT((v = v7_exec(v7, "NaN")) != NULL); ASSERT(check_num(v7, v, NAN)); // TODO: fix infinity handling under MSVC6 #ifndef _WIN32 ASSERT((v = v7_exec(v7, "Infinity")) != NULL); ASSERT(check_num(v7, v, INFINITY)); ASSERT((v = v7_exec(v7, "-Infinity")) != NULL); ASSERT(check_num(v7, v, -INFINITY)); #endif ASSERT((v = v7_exec(v7, "2()")) == NULL); ASSERT((v = v7_exec(v7, " 15 + 2 \r\n * 2 / 1 - 3 * 4 ; ")) != NULL); ASSERT((v = v7_exec(v7, "( (5 ) );")) != NULL); ASSERT(check_num(v7, v, 5.0)); ASSERT((v = v7_exec(v7, "(2 + (12 / 4));")) != NULL); ASSERT(check_num(v7, v, 5.0)); ASSERT((v = v7_exec(v7, "1;2 7")) != NULL); ASSERT(check_num(v7, v, 7.0)); v = v7_exec(v7, "a=undefined; a + 5"); ASSERT(check_num(v7, v, NAN)); /* ReferenceErrors are not thrown yet, treat as undefined */ v = v7_exec(v7, "a + 5"); ASSERT(check_num(v7, v, NAN)); ASSERT((v = v7_exec(v7, "print();")) != NULL); ASSERT((v = v7_exec(v7, "print(this);")) != NULL); ASSERT((v = v7_exec(v7, "a = 7;")) != NULL); ASSERT(check_num(v7, v, 7.0)); ASSERT((v = v7_exec(v7, "print(this);")) != NULL); ASSERT((v = v7_exec(v7, "b = a + 3;")) != NULL); ASSERT(check_num(v7, v, 10.0)); ASSERT((v = v7_exec(v7, "c = b * (a + 3) / 2;")) != NULL); ASSERT(check_num(v7, v, 50.0)); ASSERT((v = v7_exec(v7, "print(this);")) != NULL); ASSERT((v = v7_exec(v7, "var x = 1.23; x")) != NULL); ASSERT(check_num(v7, v, 1.23)); ASSERT((v = v7_exec(v7, "b = 7; a = b *= 4;")) != NULL); ASSERT((v = v7_exec(v7, "var x = 12 + 2 - a + b+ 3 / 4 * a; x;")) != NULL); ASSERT((v = v7_exec(v7, "x + 1")) != NULL); ASSERT((v = v7_exec(v7, "b + 2; x + 3 + 1 z = x -2;")) != NULL); ASSERT((v = v7_exec(v7, "x; var y, z;")) != NULL); ASSERT((v = v7_exec(v7, "1 2 3")) != NULL); ASSERT((v = v7_exec(v7, "var k = true; k ")) != NULL); ASSERT(check_bool(v7, v, 1)); ASSERT((v = v7_exec(v7, "var blah = 'kuku'; blah")) != NULL); ASSERT(check_str(v7, v, "kuku")); // Test that k.y does exist ASSERT((v = v7_exec(v7, "k = { y: 17 };")) != NULL); ASSERT((v = v7_exec(v7, "k.y")) != NULL); ASSERT(check_num(v7, v, 17.0)); v7_exec(v7, "print(this);"); // Delete k.y and make sure it's gone ASSERT((v = v7_exec(v7, "delete k.y;")) != NULL); ASSERT((v = v7_exec(v7, "k.y;")) != NULL); ASSERT(v7_type(v) == V7_TYPE_UNDEF); ASSERT((v = v7_exec(v7, "delete b; b;")) != NULL); ASSERT(v7_type(v) == V7_TYPE_UNDEF); ASSERT((v = v7_exec(v7, "k = { key1: {x:3}, key2: ':-)', y: 5 };")) != NULL); ASSERT(v7_type(v) == V7_TYPE_OBJ); ASSERT((v = v7_exec(v7, "k.x = 47;")) != NULL); ASSERT((v = v7_exec(v7, "k.qwe = { foo: 5 };")) != NULL); ASSERT((v = v7_exec(v7, "k.qwe.foo = 15;")) != NULL); ASSERT((v = v7_exec(v7, "k.key1.x + 4")) != NULL); ASSERT(check_num(v7, v, 7.0)); ASSERT((v = v7_exec(v7, "k.foo")) != NULL); ASSERT(v7_type(v) == V7_TYPE_UNDEF); ASSERT((v = v7_exec(v7, "var z = 'key1'; k[z]['x']")) != NULL); ASSERT(check_num(v7, v, 3.0)); ASSERT((v = v7_exec(v7, "var stk = 1; stk")) != NULL); ASSERT(check_num(v7, v, 1.0)); ASSERT((v = v7_exec(v7, "var f1 = function(x, y) { }; typeof f1 ")) != NULL); ASSERT(check_str(v7, v, "function")); ASSERT((v = v7_exec(v7, "var f1 = function(x, y) { return x * y }")) != NULL); //ASSERT(v7_is_class(v7_top(v7)[-1], V7_CLASS_FUNCTION)); ASSERT((v = v7_exec(v7, "f1(2, 3)")) != NULL); ASSERT(check_num(v7, v, 6.0)); ASSERT((v = v7_exec(v7, "f1(12, 4) + 1;")) != NULL); ASSERT(check_num(v7, v, 49.0)); ASSERT((v = v7_exec(v7, "f1(12, 4) * 2;")) != NULL); ASSERT(check_num(v7, v, 96.0)); ASSERT((v = v7_exec(v7, "f = function(x,y,z) {print(this);};")) != NULL); ASSERT(v7_type(v) == V7_TYPE_OBJ); //ASSERT(v7_is_class(v7->stack[0], V7_CLASS_FUNCTION)); ASSERT((v = v7_exec(v7, "f();")) != NULL); ASSERT((v = v7_exec(v7, "f({});")) != NULL); ASSERT((v = v7_exec(v7, "f(1, 2);")) != NULL); ASSERT((v = v7_exec(v7, "f(123, {});")) != NULL); ASSERT((v = v7_exec(v7, "if (0) f1 = 2; ")) == NULL); ASSERT((v = v7_exec(v7, "if (5) { f1 = 3; f2 = function(){}; } ")) != NULL); ASSERT((v = v7_exec(v7, "0 ? 1 : 2;")) != NULL); ASSERT(check_num(v7, v, 2.0)); ASSERT((v = v7_exec(v7, "k = true ? 1 : 2;")) != NULL); ASSERT(check_num(v7, v, 1.0)); ASSERT((v = v7_exec(v7, "var f = function(){var x=12; return x + 1;};")) != NULL); ASSERT((v = v7_exec(v7, "k = f(1,2,3);")) != NULL); ASSERT(check_num(v7, v, 13.0)); ASSERT((v = v7_exec(v7, "(function() { return f() + 7; })()")) != NULL); ASSERT(check_num(v7, v, 20.0)); ASSERT((v = v7_exec(v7, "var a = 1; if (a == 1) { a = 2; }; a;")) != NULL); ASSERT(check_num(v7, v, 2.0)); ASSERT((v = v7_exec(v7, "var a = 'foo'; a == 'foo';")) != NULL); ASSERT(check_bool(v7, v, 1)); ASSERT((v = v7_exec(v7, "a = { x: function(p) { print(this); } }")) != NULL); ASSERT((v = v7_exec(v7, "a.x(2);")) != NULL); ASSERT((v = v7_exec(v7, "(74).toString()")) != NULL); ASSERT(check_str(v7, v, "74")); ASSERT((v = v7_exec(v7, "'hello'.length")) != NULL); ASSERT(check_num(v7, v, 5.0)); ASSERT((v = v7_exec(v7, "k = { x : function() { if (1) 2; } }")) != NULL); ASSERT((v = v7_exec(v7, "'foo' + 'bar'")) != NULL); ASSERT(check_str(v7, v, "foobar")); ASSERT((v = v7_exec(v7, "var x = [1, 'foo', true, 7];")) != NULL); ASSERT((v = v7_exec(v7, "x.length")) != NULL); ASSERT(check_num(v7, v, 4.0)); ASSERT((v = v7_exec(v7, "x[1]")) != NULL); ASSERT(check_str(v7, v, "foo")); ASSERT((v = v7_exec(v7, "var f1 = function() { 1; };")) != NULL); ASSERT((v = v7_exec(v7, "var f2 = function(x) { if (x) return x; };")) != NULL); ASSERT((v = v7_exec(v7, "f1()")) != NULL); ASSERT(v7_type(v) == V7_TYPE_UNDEF); ASSERT((v = v7_exec(v7, "f2(false)")) != NULL); ASSERT(v7_type(v) == V7_TYPE_UNDEF); ASSERT((v = v7_exec(v7, "f2(17)")) != NULL); ASSERT(check_num(v7, v, 17.0)); ASSERT((v = v7_exec(v7, "f2(true)")) != NULL); ASSERT(check_bool(v7, v, 1.0)); ASSERT((v = v7_exec(v7, "1 <= 2 ? 7 : 8")) != NULL); ASSERT(check_num(v7, v, 7.0)); ASSERT((v = v7_exec(v7, "function a (t) { return t * t }; ")) != NULL); ASSERT((v = v7_exec(v7, "a(2)")) != NULL); ASSERT(check_num(v7, v, 4.0)); ASSERT((v = v7_exec(v7, "a(0)")) != NULL); ASSERT(check_num(v7, v, 0.0)); ASSERT((v = v7_exec(v7, "function fac(x) { " "return x <= 1 ? 1 : x * fac(x - 1); }")) != NULL); ASSERT((v = v7_exec(v7, "fac(1)")) != NULL); ASSERT(check_num(v7, v, 1.0)); ASSERT((v = v7_exec(v7, "fac(5)")) != NULL); ASSERT(check_num(v7, v, 120.0)); ASSERT((v = v7_exec(v7, "fac(20)")) != NULL); ASSERT((v = v7_exec(v7, "function qq(a,b) { return a + b; }")) != NULL); ASSERT((v = v7_exec(v7, "qq(1,2)")) != NULL); ASSERT(check_num(v7, v, 3.0)); ASSERT((v = v7_exec(v7, "1 < 2 == 2 < 3")) != NULL); ASSERT(check_bool(v7, v, 1.0)); ASSERT((v = v7_exec(v7, "5 % 3 * 3")) != NULL); ASSERT(check_num(v7, v, 6.0)); ASSERT((v = v7_exec(v7, "76 & 13")) != NULL); ASSERT(check_num(v7, v, 12.0)); ASSERT((v = v7_exec(v7, "34325 ^ 190992 & 74832")) != NULL); ASSERT(check_num(v7, v, 42501.0)); ASSERT((v = v7_exec(v7, "a = 12;")) != NULL); ASSERT((v = v7_exec(v7, "a += 44; a;")) != NULL); ASSERT(check_num(v7, v, 56.0)); ASSERT((v = v7_exec(v7, "a -= a / 2; a;")) != NULL); ASSERT(check_num(v7, v, 28.0)); ASSERT((v = v7_exec(v7, "a *= 0.5; a;")) != NULL); ASSERT(check_num(v7, v, 14.0)); #ifndef _WIN32 ASSERT((v = v7_exec(v7, "a /= 0; a;")) != NULL); ASSERT(check_num(v7, v, INFINITY)); #endif ASSERT((v = v7_exec(v7, "!5")) != NULL); ASSERT(check_bool(v7, v, 0.0)); ASSERT((v = v7_exec(v7, "!''")) != NULL); ASSERT(check_bool(v7, v, 1.0)); ASSERT((v = v7_exec(v7, "1 != 2")) != NULL); ASSERT(check_bool(v7, v, 1.0)); ASSERT((v = v7_exec(v7, "7 >= 0")) != NULL); ASSERT(check_bool(v7, v, 1.0)); ASSERT((v = v7_exec(v7, "if (false) 3; ")) == NULL); ASSERT((v = v7_exec(v7, "if (true) { if (1) {2;} 5; } ")) != NULL); ASSERT(check_num(v7, v, 5.0)); ASSERT((v = v7_exec(v7, "if ('') 3; ")) == NULL); ASSERT((v = v7_exec(v7, "if ('0') 9; ")) != NULL); ASSERT(check_num(v7, v, 9.0)); ASSERT((v = v7_exec(v7, "if (false) 1; else 3;")) != NULL); ASSERT(check_num(v7, v, 3.0)); ASSERT((v = v7_exec(v7, "if (false) 1; else if (0) { 3 } else { 2 }")) != NULL); ASSERT(check_num(v7, v, 2.0)); ASSERT((v = v7_exec(v7, "if (false) 1; else if (1) { 3 } else { 2 }")) != NULL); ASSERT(check_num(v7, v, 3.0)); ASSERT((v = v7_exec(v7, "a = 32; 2 + a++;")) != NULL); ASSERT(check_num(v7, v, 34.0)); ASSERT((v = v7_exec(v7, "print()")) != NULL); ASSERT((v = v7_exec(v7, "print(['hi', 1, true, null, /\\s+/])")) != NULL); ASSERT((v = v7_exec(v7, "a = {};")) != NULL); ASSERT((v = v7_exec(v7, "a.foo = function(x) { var y = " "x.substr(1).split() }")) != NULL); ASSERT((v = v7_exec(v7, "typeof 2")) != NULL); ASSERT(check_str(v7, v, "number")); ASSERT((v = v7_exec(v7, "a = { b: { k: 44 } };")) != NULL); STOP = 1; ASSERT((v = v7_exec(v7, "a.b['x'] = 79;")) != NULL); ASSERT((v = v7_exec(v7, "a.b.x")) != NULL); ASSERT(check_num(v7, v, 79.0)); v7_destroy(&v7); return NULL; }
/* * Make a new MQTT client. * * Arguments: * url: url where to connect to * opts: option object * * Recognized option object properties: * * - clientId: string; mqtt client id. defaults to * Math.random().toString(16).substr(2, 10) * * Example: * * var client = MQTT.connect('mqtt://test.mosquitto.org'); * * client.on('connect', function () { * client.subscribe('presence'); * client.publish('presence', 'Hello mqtt'); * }); * * client.on('message', function (topic, message) { * console.log(message); * }); * * TLS can be enabled by choosing the `mqtts://` protocol. In that * case the default port is 8883 as defined by IANA. * * The API is modeled after https://www.npmjs.com/package/mqtt. * */ enum v7_err sj_mqtt_connect(struct v7 *v7, v7_val_t *res) { enum v7_err rcode = V7_OK; const char *url; size_t len; struct mg_str host, scheme; unsigned int port; struct mg_connection *nc; struct user_data *ud; char *url_with_port = NULL; int use_ssl = 0; v7_val_t urlv = v7_arg(v7, 0), opts = v7_arg(v7, 1); v7_val_t client_id; v7_val_t proto = v7_get(v7, v7_get(v7, v7_get_global(v7), "MQTT", ~0), "proto", ~0); if (!v7_is_string(urlv)) { rcode = v7_throwf(v7, "Error", "invalid url string"); goto clean; } url = v7_get_string(v7, &urlv, &len); if (mg_parse_uri(mg_mk_str(url), &scheme, NULL, &host, &port, NULL, NULL, NULL) < 0) { rcode = v7_throwf(v7, "Error", "invalid url string"); goto clean; } if (mg_vcmp(&scheme, "mqtt") == 0) { url += sizeof("mqtt://") - 1; } else if (mg_vcmp(&scheme, "mqtts") == 0) { url += sizeof("mqtts://") - 1; use_ssl = 1; } else { rcode = v7_throwf(v7, "Error", "unsupported protocol"); goto clean; } client_id = v7_get(v7, opts, "clientId", ~0); if (v7_is_undefined(client_id)) { rcode = v7_exec(v7, "Math.random().toString(16).substr(2,8)", &client_id); if (rcode != V7_OK) { goto clean; } } if (port == 0) { if (asprintf(&url_with_port, "%.*s%s", (int) host.len, host.p, (use_ssl ? ":8883" : ":1883")) < 0) { rcode = v7_throwf(v7, "Error", "Out of memory"); goto clean; } } nc = mg_connect(&sj_mgr, url_with_port ? url_with_port : url, mqtt_ev_handler); if (nc == NULL) { rcode = v7_throwf(v7, "Error", "cannot create connection"); goto clean; } if (use_ssl) { #ifdef MG_ENABLE_SSL mg_set_ssl(nc, NULL, NULL); #else rcode = v7_throwf(v7, "Error", "SSL not enabled"); goto clean; #endif } mg_set_protocol_mqtt(nc); *res = v7_mk_object(v7); v7_set_proto(v7, *res, proto); ud = calloc(1, sizeof(*ud)); if (ud == NULL) { rcode = v7_throwf(v7, "Error", "Out of memory"); goto clean; } ud->v7 = v7; ud->client = *res; ud->client_id = strdup(v7_get_cstring(v7, &client_id)); if (ud->client_id == NULL) { free(ud); rcode = v7_throwf(v7, "Error", "Out of memory"); goto clean; } nc->user_data = ud; v7_own(v7, &ud->client); v7_def(v7, *res, "_nc", ~0, _V7_DESC_HIDDEN(1), v7_mk_foreign(v7, nc)); clean: free(url_with_port); return rcode; }
void wifi_changed_cb(System_Event_t *evt) { enum sj_wifi_status sj_ev = -1; /* TODO(rojer): Share this logic between platforms. */ if (wifi_setting_up && #ifndef RTOS_SDK evt->event == EVENT_STAMODE_GOT_IP #else evt->event_id == EVENT_STAMODE_GOT_IP #endif ) { struct station_config config; v7_val_t res; v7_val_t conf = v7_get(v7, v7_get_global_object(v7), "conf", ~0); v7_val_t known, wifi; if (v7_is_undefined(conf)) { fprintf(stderr, "cannot save conf, no conf object\n"); return; } wifi = v7_get(v7, conf, "wifi", ~0); if (v7_is_undefined(wifi)) { wifi = v7_create_object(v7); v7_set(v7, conf, "wifi", ~0, 0, wifi); } known = v7_get(v7, conf, "known", ~0); if (v7_is_undefined(known)) { known = v7_create_object(v7); v7_set(v7, wifi, "known", ~0, 0, known); } wifi_station_get_config(&config); v7_set(v7, known, (const char *) config.ssid, ~0, 0, v7_create_string(v7, (const char *) config.password, strlen((const char *) config.password), 1)); v7_exec(v7, "conf.save()", &res); wifi_setting_up = 0; } #ifndef RTOS_SDK switch (evt->event) { #else switch (evt->event_id) { #endif case EVENT_STAMODE_DISCONNECTED: sj_ev = SJ_WIFI_DISCONNECTED; break; case EVENT_STAMODE_CONNECTED: sj_ev = SJ_WIFI_CONNECTED; break; case EVENT_STAMODE_GOT_IP: sj_ev = SJ_WIFI_IP_ACQUIRED; break; } if (sj_ev >= 0) sj_wifi_on_change_callback(sj_ev); } char *sj_wifi_get_connected_ssid() { struct station_config conf; if (!wifi_station_get_config(&conf)) return NULL; return strdup((const char *) conf.ssid); } char *sj_wifi_get_sta_ip() { struct ip_info info; char *ip; if (!wifi_get_ip_info(0, &info) || info.ip.addr == 0) return NULL; if (asprintf(&ip, IPSTR, IP2STR(&info.ip)) < 0) { return NULL; } return ip; } void wifi_scan_done(void *arg, STATUS status) { if (status == OK) { STAILQ_HEAD(, bss_info) *info = arg; struct bss_info *p; const char **ssids; int n = 0; STAILQ_FOREACH(p, info, next) n++; ssids = calloc(n + 1, sizeof(*ssids)); n = 0; STAILQ_FOREACH(p, info, next) { ssids[n++] = (const char *) p->ssid; } wifi_scan_cb(ssids); free(ssids); } else {
static const char *test_stdlib(void) { struct v7_val *v; struct v7 *v7 = v7_create(); // Number #ifndef _WIN32 ASSERT((v = v7_exec(v7, "Math.PI")) != NULL); ASSERT(check_num(v7, v, M_PI)); ASSERT((v = v7_exec(v7, "Number.NaN")) != NULL); ASSERT(check_num(v7, v, NAN)); #endif ASSERT((v = v7_exec(v7, "1 == 2")) != NULL); ASSERT(check_bool(v7, v, 0)); ASSERT((v = v7_exec(v7, "1 + 2 * 7 === 15")) != NULL); ASSERT(check_bool(v7, v, 1)); ASSERT((v = v7_exec(v7, "Number(1.23) === 1.23")) != NULL); ASSERT(check_bool(v7, v, 1)); ASSERT((v = v7_exec(v7, "Number(1.23)")) != NULL); ASSERT(check_num(v7, v, 1.23)); #ifdef TODO /* New operator: Assertion failed: (v7->root_scope.proto == &s_global), function do_exec, file src/util.c, line 557. */ ASSERT((v = v7_exec(v7, "new Number(21.23)")) != NULL); #endif // String ASSERT((v = v7_exec(v7, "'hello'.charCodeAt(1)")) != NULL); ASSERT(check_num(v7, v, 'e')); ASSERT((v = v7_exec(v7, "'hello'.charCodeAt(4)")) != NULL); ASSERT(check_num(v7, v, 'o')); ASSERT((v = v7_exec(v7, "'hello'.charCodeAt(5) == Number.NaN")) != NULL); ASSERT(check_bool(v7, v, 1.0)); ASSERT((v = v7_exec(v7, "'hello'.indexOf()")) != NULL); ASSERT(check_num(v7, v, -1.0)); ASSERT((v = v7_exec(v7, "'HTTP/1.0\\r\\n'.indexOf('\\r\\n')")) != NULL); ASSERT(check_num(v7, v, 8.0)); ASSERT((v = v7_exec(v7, "'hi there'.indexOf('e')")) != NULL); ASSERT(check_num(v7, v, 5.0)); ASSERT((v = v7_exec(v7, "'hi there'.indexOf('e', 6)")) != NULL); ASSERT(check_num(v7, v, 7.0)); ASSERT((v = v7_exec(v7, "'hi there'.substr(3, 2)")) != NULL); ASSERT(check_str(v7, v, "th")); ASSERT((v = v7_exec(v7, "'hi there'.substring(3, 5)")) != NULL); ASSERT(check_str(v7, v, "th")); ASSERT((v = v7_exec(v7, "'hi there'.substr(3)")) != NULL); ASSERT(check_str(v7, v, "there")); ASSERT((v = v7_exec(v7, "'hi there'.substr(-2)")) != NULL); ASSERT(check_str(v7, v, "hi there")); ASSERT((v = v7_exec(v7, "'hi there'.substr(NaN)")) != NULL); ASSERT(check_str(v7, v, "hi there")); ASSERT((v = v7_exec(v7, "'hi there'.substr(0, 300)")) != NULL); ASSERT(check_str(v7, v, "hi there")); ASSERT((v = v7_exec(v7, "'dew dee'.match(/\\d+/)")) != NULL); ASSERT(v7_type(v) == V7_TYPE_NULL); ASSERT((v = v7_exec(v7, "m = 'foo 1234 bar'.match(/\\S+ (\\d+)/)")) != NULL); ASSERT((v = v7_exec(v7, "m.length")) != NULL); #ifdef TODO /* got: [foo 1234] i.e. 1 length array with input string !! */ ASSERT(check_num(v7, v, 2.0)); ASSERT((v = v7_exec(v7, "m[0]")) != NULL); ASSERT(check_str(v7, v, "foo 1234")); ASSERT((v = v7_exec(v7, "m[1]")) != NULL); ASSERT(check_str(v7, v, "1234")); ASSERT((v = v7_exec(v7, "m[2]")) != NULL); ASSERT(v7_type(v) == V7_TYPE_UNDEF); #endif ASSERT((v = v7_exec(v7, "m = 'aa bb cc'.split(); m.length")) != NULL); ASSERT(check_num(v7, v, 1.0)); #ifdef TODO /* doesn't split at every char */ ASSERT((v = v7_exec(v7, "m = 'aa bb cc'.split(''); m.length")) != NULL); ASSERT(check_num(v7, v, 8.0)); #endif ASSERT((v = v7_exec(v7, "m = 'aa bb cc'.split(' '); m.length")) != NULL); ASSERT(check_num(v7, v, 3.0)); ASSERT((v = v7_exec(v7, "m = 'aa bb cc'.split(' ', 2); m.length")) != NULL); ASSERT(check_num(v7, v, 2.0)); ASSERT((v = v7_exec(v7, "m = 'aa bb cc'.split(/ /, 2); m.length")) != NULL); ASSERT(check_num(v7, v, 2.0)); ASSERT((v = v7_exec(v7, "'aa bb cc'.substr(0, 4).split(' ').length")) != NULL); ASSERT(check_num(v7, v, 2.0)); ASSERT((v = v7_exec(v7, "'aa bb cc'.substr(0, 4).split(' ')[1]")) != NULL); ASSERT(check_str(v7, v, "b")); #ifdef TODO /* doesn't split at every char */ ASSERT((v = v7_exec(v7, "{z: '123456'}.z.substr(0, 3).split('').length")) != NULL); ASSERT(check_num(v7, v, 3.0)); #endif ASSERT((v = v7_exec(v7, "String('hi')")) != NULL); ASSERT(check_str(v7, v, "hi")); #ifdef TODO /* New operator: Assertion failed: (v7->root_scope.proto == &s_global), function do_exec, file src/util.c, line 557. */ ASSERT((v = v7_exec(v7, "new String('blah')")) != NULL); #endif // Math ASSERT((v = v7_exec(v7, "Math.sqrt(144)")) != NULL); ASSERT(check_num(v7, v, 12.0)); // Regexp ASSERT((v = v7_exec(v7, "re = /GET (\\S+) HTTP/; re")) != NULL); ASSERT((v = v7_exec(v7, "re = /GET (\\S+) HTTP/;")) != NULL); ASSERT((v = v7_exec(v7, "re = /GET (\\S+) HTTP/ ")) != NULL); ASSERT((v = v7_exec(v7, "re = /GET (\\S+) HTTP/\n")) != NULL); ASSERT((v = v7_exec(v7, "re = /GET (\\S+) HTTP/")) != NULL); v7_destroy(&v7); return NULL; }