V7_PRIVATE val_t Regex_ctor(struct v7 *v7, val_t this_obj, val_t args) { long argnum = v7_array_length(v7, args); if (argnum > 0) { val_t ro = to_string(v7, v7_array_get(v7, args, 0)); size_t re_len, flags_len = 0; const char *re = v7_to_string(v7, &ro, &re_len), *flags = NULL; struct slre_prog *p = NULL; struct v7_regexp *rp; (void) this_obj; if (argnum > 1) { val_t fl = to_string(v7, v7_array_get(v7, args, 1)); flags = v7_to_string(v7, &fl, &flags_len); } if (slre_compile(re, re_len, flags, flags_len, &p, 1) != SLRE_OK || p == NULL) { throw_exception(v7, TYPE_ERROR, "Invalid regex"); return v7_create_undefined(); } else { rp = (struct v7_regexp *) malloc(sizeof(*rp)); rp->regexp_string = v7_create_string(v7, re, re_len, 1); rp->compiled_regexp = p; rp->lastIndex = 0; return v7_pointer_to_value(rp) | V7_TAG_REGEXP; } } return v7_create_regexp(v7, "(?:)", 4, NULL, 0); }
/* * Prints message to current debug output */ v7_val_t Debug_print(struct v7 *v7, v7_val_t this_obj, v7_val_t args) { int i, num_args = v7_array_length(v7, args); (void) this_obj; for (i = 0; i < num_args; i++) { v7_fprint(stderr, v7, v7_array_get(v7, args, i)); fprintf(stderr, " "); } fprintf(stderr, "\n"); return v7_create_undefined(); }
/* * Prints message to current debug output */ ICACHE_FLASH_ATTR v7_val_t Debug_print(struct v7 *v7, v7_val_t this_obj, v7_val_t args) { char *p, buf[512]; int i, num_args = v7_array_length(v7, args); (void) this_obj; for (i = 0; i < num_args; i++) { v7_val_t arg = v7_array_get(v7, args, i); if (v7_is_string(arg)) { size_t n; const char *s = v7_to_string(v7, &arg, &n); os_printf("%s", s); } else { p = v7_to_json(v7, arg, buf, sizeof(buf)); os_printf("%s", p); if (p != buf) { free(p); } } } os_printf("\n"); return v7_create_null(); }
static void _WebSocket_send_blob(struct v7 *v7, struct mg_connection *nc, v7_val_t blob) { const char *data; size_t len; unsigned long alen, i; v7_val_t chunks, chunk; chunks = v7_get(v7, blob, "a", ~0); alen = v7_array_length(v7, chunks); for (i = 0; i < alen; i++) { int op = i == 0 ? WEBSOCKET_OP_BINARY : WEBSOCKET_OP_CONTINUE; int flag = i == alen - 1 ? 0 : WEBSOCKET_DONT_FIN; chunk = v7_array_get(v7, chunks, i); /* * This hack allows us to skip the first or the last frame * while sending blobs. The effect of it is that it's possible to * concatenate more blobs into a single WS message composed of * several fragments. * * WebSocket.send(new Blob(["123", undefined])); * WebSocket.send(new Blob([undefined, "456"])); * * If the last blob component is undefined, the current message is thus * left open. In order to continue sending fragments of the same message * the next send call should have it's first component undefined. * * TODO(mkm): find a better API. */ if (!v7_is_undefined(chunk)) { data = v7_to_string(v7, &chunk, &len); mg_send_websocket_frame(nc, op | flag, data, len); } } }
static val_t Regex_exec(struct v7 *v7, val_t this_obj, val_t args) { if (v7_array_length(v7, args) > 0) { return rx_exec(v7, this_obj, v7_array_get(v7, args, 0), 0); } return v7_create_null(); }