72 limit = dv->
len > maxbytes ? maxbytes : dv->
len;
73 for (i = 0; i < limit; i++) {
74 unsigned char c = dv->
buf[i];
76 if (c >= 0x20 && c <= 0x7e && c != (
char)
'"' && c != (char)
'\'') {
77 sprintf(buf,
"%c", c);
80 sprintf(buf,
"\\x%02x", (
unsigned int) c);
84 sprintf(buf,
"%02x", (
unsigned int) c);
88 if (dv->
len > maxbytes) {
96 char hexbuf[32 * 4 + 4];
120 sprintf(buf,
"%d", dv->
i);
124 sprintf(buf,
"str:%ld:\"%s\"", (
long) dv->
len, hexbuf);
128 sprintf(buf,
"buf:%ld:%s", (
long) dv->
len, hexbuf);
131 sprintf(buf,
"undefined");
134 sprintf(buf,
"undefined");
137 sprintf(buf,
"null");
140 sprintf(buf,
"true");
143 sprintf(buf,
"false");
146 if (fpclassify(dv->
d) == FP_ZERO) {
147 if (signbit(dv->
d)) {
153 sprintf(buf,
"%lg", dv->
d);
158 sprintf(buf,
"obj:%d:%s", (
int) dv->
i, hexbuf);
162 sprintf(buf,
"ptr:%s", hexbuf);
166 sprintf(buf,
"lfunc:%04x:%s", (
unsigned int) dv->
i, hexbuf);
170 sprintf(buf,
"heapptr:%s", hexbuf);
173 sprintf(buf,
"unknown:%d", (
int) dv->
tag);
179 if (!dv) {
return NULL; }
186 if (!dv) {
return NULL; }
194 if (!dv) {
return NULL; }
203 if (!dv) {
return NULL; }
208 p = (
unsigned char *)
malloc(len + 1);
213 memcpy((
void *) p, (
const void *) buf, len);
214 p[len] = (
unsigned char) 0;
223 if (!dv) {
return NULL; }
241 t = p[0]; p[0] = p[7]; p[7] = t;
242 t = p[1]; p[1] = p[6]; p[6] = t;
243 t = p[2]; p[2] = p[5]; p[5] = t;
244 t = p[3]; p[3] = p[4]; p[4] = t;
250 t = p[0]; p[0] = p[3]; p[3] = t;
251 t = p[1]; p[1] = p[2]; p[2] = t;
252 t = p[4]; p[4] = p[7]; p[7] = t;
253 t = p[5]; p[5] = p[6]; p[6] = t;
262 return (((
unsigned int) p[0]) << 24) +
263 (((
unsigned int) p[1]) << 16) +
264 (((
unsigned int) p[2]) << 8) +
265 (((
unsigned int) p[3]) << 0);
273 if (tmp & 0x80000000UL) {
274 return -((int) ((tmp ^ 0xffffffffUL) + 1UL));
283 return (((
unsigned int) p[0]) << 8) +
284 (((
unsigned int) p[1]) << 0);
293 memcpy((
void *) u.b, (
const void *) p, 8);
301 *p++ = (
unsigned char) ((val >> 24) & 0xff);
302 *p++ = (
unsigned char) ((val >> 16) & 0xff);
303 *p++ = (
unsigned char) ((val >> 8) & 0xff);
304 *p++ = (
unsigned char) (val & 0xff);
315 *p++ = (
unsigned char) ((val >> 8) & 0xff);
316 *p++ = (
unsigned char) (val & 0xff);
328 memcpy((
void *) p, (
const void *) u.b, 8);
342 if (avail >= space) {
343 if (avail - space > 256) {
357 new_size = used + space + 256;
360 dbuf->
base = (
unsigned char *) new_alloc;
362#if defined(DEBUG_PRINTS)
363 fprintf(stderr,
"%s: resized buffer %p to %ld bytes, read_offset=%ld, write_offset=%ld\n",
364 __func__, (
void *) dbuf, (
long) new_size, (
long) dbuf->read_offset, (
long) dbuf->write_offset);
367 return dbuf->base + dbuf->write_offset;
378#if defined(DEBUG_PRINTS)
379 fprintf(stderr,
"%s: rebasing buffer %p, read_offset=%ld, write_offset=%ld\n",
380 __func__, (
void *) dbuf, (
long) dbuf->
read_offset, (
long) dbuf->write_offset);
383 if (dbuf->write_offset > dbuf->read_offset) {
384 memmove((
void *) dbuf->base, (
const void *) (dbuf->base + dbuf->read_offset), dbuf->write_offset - dbuf->read_offset);
386 dbuf->write_offset -= dbuf->read_offset;
387 dbuf->read_offset = 0;
399 if (!ctx) {
goto fail; }
426 u.b[0] = 0x11; u.b[1] = 0x22; u.b[2] = 0x33; u.b[3] = 0x44;
427 u.b[4] = 0x55; u.b[5] = 0x66; u.b[6] = 0x77; u.b[7] = 0x88;
430 }
else if (u.d < 1.0) {
435#if defined(DEBUG_PRINTS)
436 fprintf(stderr,
"double endianness test value is %lg -> byteorder %d\n",
468#if defined(DEBUG_PRINTS)
472 fprintf(stderr,
"%s: sending dvalue: %s\n", __func__, buf);
480 if (!p) {
goto alloc_error; }
487 if (!p) {
goto alloc_error; }
494 if (!p) {
goto alloc_error; }
501 if (!p) {
goto alloc_error; }
508 if (!p) {
goto alloc_error; }
515 if (i >= 0 && i <= 63) {
517 if (!p) {
goto alloc_error; }
518 *p++ = (
unsigned char) (0x80 + i);
520 }
else if (i >= 0 && i <= 16383L) {
522 if (!p) {
goto alloc_error; }
523 *p++ = (
unsigned char) (0xc0 + (i >> 8));
524 *p++ = (
unsigned char) (i & 0xff);
526 }
else if (i >= -0x80000000L && i <= 0x7fffffffL) {
528 if (!p) {
goto alloc_error; }
541 if (!p) {
goto alloc_error; }
542 *p++ = (
unsigned char) (0x60 + i);
543 memcpy((
void *) p, (
const void *) dv->
buf, i);
546 }
else if (i <= 0xffffUL) {
548 if (!p) {
goto alloc_error; }
551 memcpy((
void *) p, (
const void *) dv->
buf, i);
554 }
else if (i <= 0xffffffffUL) {
556 if (!p) {
goto alloc_error; }
559 memcpy((
void *) p, (
const void *) dv->
buf, i);
571 if (!p) {
goto alloc_error; }
574 memcpy((
void *) p, (
const void *) dv->
buf, i);
577 }
else if (i <= 0xffffffffUL) {
579 if (!p) {
goto alloc_error; }
582 memcpy((
void *) p, (
const void *) dv->
buf, i);
592 if (!p) {
goto alloc_error; }
599 if (!p) {
goto alloc_error; }
606 if (!p) {
goto alloc_error; }
613 if (!p) {
goto alloc_error; }
620 if (!p) {
goto alloc_error; }
627 if (!p) {
goto alloc_error; }
635 if (i <= 0xffUL && dv->i >= 0 && dv->
i <= 0xffL) {
637 if (!p) {
goto alloc_error; }
639 *p++ = (
unsigned char) dv->
i;
640 *p++ = (
unsigned char) i;
641 memcpy((
void *) p, (
const void *) dv->
buf, i);
652 if (!p) {
goto alloc_error; }
654 *p++ = (
unsigned char) i;
655 memcpy((
void *) p, (
const void *) dv->
buf, i);
664 if (i <= 0xffUL && dv->i >= 0 && dv->
i <= 0xffffL) {
666 if (!p) {
goto alloc_error; }
669 *p++ = (
unsigned char) i;
670 memcpy((
void *) p, (
const void *) dv->
buf, i);
681 if (!p) {
goto alloc_error; }
683 *p++ = (
unsigned char) i;
684 memcpy((
void *) p, (
const void *) dv->
buf, i);
699#if defined(ERROR_PRINTS)
700 fprintf(stderr,
"%s: internal error, argument dvalue is invalid\n", __func__);
706#if defined(ERROR_PRINTS)
707 fprintf(stderr,
"%s: internal error, failed to allocate space for write\n", __func__);
815#if defined(DEBUG_PRINTS)
818 fprintf(stderr,
"%s: parsing dvalue, window:", __func__);
819 for (i = 0; i < 16; i++) {
821 fprintf(stderr,
" %02x", (
unsigned int) p[i]);
823 fprintf(stderr,
" ??");
826 fprintf(stderr,
" (length %ld, read_offset %ld, write_offset %ld, alloc_size %ld)\n",
839 if (!dv) {
goto alloc_error; }
845 if (!dv) {
goto alloc_error; }
851 if (!dv) {
goto alloc_error; }
857 if (!dv) {
goto alloc_error; }
863 if (!dv) {
goto alloc_error; }
868 if (len < 5) {
goto partial; }
872 if (!dv) {
goto alloc_error; }
876 if (len < 5) {
goto partial; }
878 if (len < 5 + datalen) {
goto partial; }
881 if (!dv) {
goto alloc_error; }
885 if (len < 3) {
goto partial; }
887 if (len < 3 + datalen) {
goto partial; }
890 if (!dv) {
goto alloc_error; }
894 if (len < 5) {
goto partial; }
896 if (len < 5 + datalen) {
goto partial; }
899 if (!dv) {
goto alloc_error; }
903 if (len < 3) {
goto partial; }
905 if (len < 3 + datalen) {
goto partial; }
908 if (!dv) {
goto alloc_error; }
914 if (!dv) {
goto alloc_error; }
920 if (!dv) {
goto alloc_error; }
926 if (!dv) {
goto alloc_error; }
932 if (!dv) {
goto alloc_error; }
938 if (!dv) {
goto alloc_error; }
943 if (len < 9) {
goto partial; }
947 if (!dv) {
goto alloc_error; }
952 if (len < 3) {
goto partial; }
953 datalen = (size_t) p[2];
954 if (len < 3 + datalen) {
goto partial; }
955 classnum = (int) p[1];
958 if (!dv) {
goto alloc_error; }
962 if (len < 2) {
goto partial; }
963 datalen = (size_t) p[1];
964 if (len < 2 + datalen) {
goto partial; }
967 if (!dv) {
goto alloc_error; }
972 if (len < 4) {
goto partial; }
973 datalen = (size_t) p[3];
974 if (len < 4 + datalen) {
goto partial; }
978 if (!dv) {
goto alloc_error; }
982 if (len < 2) {
goto partial; }
983 datalen = (size_t) p[1];
984 if (len < 2 + datalen) {
goto partial; }
987 if (!dv) {
goto alloc_error; }
994 }
else if (ib <= 0x5fU) {
997 }
else if (ib <= 0x7fU) {
999 datalen = (size_t) (ib - 0x60U);
1000 if (len < 1 + datalen) {
goto partial; }
1003 if (!dv) {
goto alloc_error; }
1005 }
else if (ib <= 0xbfU) {
1008 intval = (int) (ib - 0x80U);
1011 if (!dv) {
goto alloc_error; }
1016 if (len < 2) {
goto partial; }
1017 intval = (((int) (ib - 0xc0U)) << 8) + (int) p[1];
1020 if (!dv) {
goto alloc_error; }
1030#if defined(ERROR_PRINTS)
1031 fprintf(stderr,
"%s: internal error, cannot allocate space for dvalue\n", __func__);
1037#if defined(ERROR_PRINTS)
1038 fprintf(stderr,
"%s: internal error, dvalue format error\n", __func__);
1053 for (i = 0; i < len; i++) {
1060 if (!dv) {
goto alloc_error; }
1068#if defined(ERROR_PRINTS)
1069 fprintf(stderr,
"%s: internal error, cannot allocate space for handshake line\n", __func__);
1106#if defined(DEBUG_PRINTS)
1107 fprintf(stderr,
"%s: %p %p %ld\n", __func__, udata, (
void *) buffer, (
long) length);
1139#if defined(DEBUG_PRINTS)
1140 fprintf(stderr,
"%s: %p %p %ld\n", __func__, udata, (
void *) buffer, (
long) length);
1149 memcpy((
void *) p, (
const void *) buffer, (
size_t) length);
1161#if defined(DEBUG_PRINTS)
1162 fprintf(stderr,
"%s: handshake ok\n", __func__);
1173#if defined(DEBUG_PRINTS)
1177 fprintf(stderr,
"%s: received dvalue: %s\n", __func__, buf);
1198#if defined(DEBUG_PRINTS)
1199 fprintf(stderr,
"%s: %p\n", __func__, udata);
1211#if defined(DEBUG_PRINTS)
1212 fprintf(stderr,
"%s: %p\n", __func__, udata);
1222#if defined(DEBUG_PRINTS)
1223 fprintf(stderr,
"%s: %p\n", __func__, udata);
1233#if defined(DEBUG_PRINTS)
1234 fprintf(stderr,
"%s: %p\n", __func__, udata);
duk_dvalue * duk_dvalue_make_tag_int_data(int tag, int intval, const char *buf, size_t len)
static unsigned char * duk__trans_buffer_ensure(duk_trans_buffer *dbuf, size_t space)
void duk_trans_dvalue_send_err(duk_trans_dvalue_ctx *ctx)
void duk_trans_dvalue_send_string(duk_trans_dvalue_ctx *ctx, const char *str)
void duk_trans_dvalue_send_pointer(duk_trans_dvalue_ctx *ctx, const char *ptr_data, size_t ptr_len)
duk_size_t duk_trans_dvalue_read_cb(void *udata, char *buffer, duk_size_t length)
void duk_trans_dvalue_read_flush_cb(void *udata)
duk_trans_dvalue_ctx * duk_trans_dvalue_init(void)
static unsigned char * duk__trans_dvalue_encode_u16(duk_trans_dvalue_ctx *ctx, unsigned char *p, unsigned int val)
static unsigned char * duk__trans_dvalue_encode_u32(duk_trans_dvalue_ctx *ctx, unsigned char *p, unsigned int val)
static int duk__trans_dvalue_parse_i32(duk_trans_dvalue_ctx *ctx, unsigned char *p)
duk_dvalue * duk_dvalue_alloc(void)
static unsigned char * duk__trans_dvalue_encode_i32(duk_trans_dvalue_ctx *ctx, unsigned char *p, int val)
static duk_dvalue * duk__trans_trial_parse_dvalue(duk_trans_dvalue_ctx *ctx)
void duk_trans_dvalue_send_true(duk_trans_dvalue_ctx *ctx)
void duk_trans_dvalue_send_lstring(duk_trans_dvalue_ctx *ctx, const char *str, size_t len)
void duk_trans_dvalue_send_unused(duk_trans_dvalue_ctx *ctx)
void duk_trans_dvalue_send_heapptr(duk_trans_dvalue_ctx *ctx, const char *ptr_data, size_t ptr_len)
static double duk__trans_dvalue_parse_double(duk_trans_dvalue_ctx *ctx, unsigned char *p)
void duk_trans_dvalue_send_null(duk_trans_dvalue_ctx *ctx)
static void duk__trans_dvalue_double_byteswap(duk_trans_dvalue_ctx *ctx, volatile unsigned char *p)
static void duk__trans_dvalue_send_and_free(duk_trans_dvalue_ctx *ctx, duk_dvalue *dv)
duk_size_t duk_trans_dvalue_peek_cb(void *udata)
duk_dvalue * duk_dvalue_make_tag_data(int tag, const char *buf, size_t len)
static unsigned int duk__trans_dvalue_parse_u32(duk_trans_dvalue_ctx *ctx, unsigned char *p)
duk_size_t duk_trans_dvalue_write_cb(void *udata, const char *buffer, duk_size_t length)
void duk_dvalue_to_string(duk_dvalue *dv, char *buf)
void duk_trans_dvalue_send_nfy(duk_trans_dvalue_ctx *ctx)
duk_dvalue * duk_dvalue_make_tag_double(int tag, double dblval)
void duk_trans_dvalue_send_rep(duk_trans_dvalue_ctx *ctx)
static void duk__dvalue_bufesc(duk_dvalue *dv, char *buf, size_t maxbytes, int stresc)
void duk_trans_dvalue_write_flush_cb(void *udata)
static unsigned int duk__trans_dvalue_parse_u16(duk_trans_dvalue_ctx *ctx, unsigned char *p)
static void duk__trans_call_detached(duk_trans_dvalue_ctx *ctx)
void duk_dvalue_free(duk_dvalue *dv)
void duk_trans_dvalue_send_undefined(duk_trans_dvalue_ctx *ctx)
void duk_trans_dvalue_free(duk_trans_dvalue_ctx *ctx)
void duk_trans_dvalue_send_buffer(duk_trans_dvalue_ctx *ctx, const char *buf, size_t len)
void duk_trans_dvalue_send_req(duk_trans_dvalue_ctx *ctx)
static void duk__trans_call_received(duk_trans_dvalue_ctx *ctx, duk_dvalue *dv)
void duk_trans_dvalue_send_integer(duk_trans_dvalue_ctx *ctx, int val)
void duk_trans_dvalue_send_lightfunc(duk_trans_dvalue_ctx *ctx, int lf_flags, const char *ptr_data, size_t ptr_len)
static unsigned char * duk__trans_dvalue_encode_double(duk_trans_dvalue_ctx *ctx, unsigned char *p, double val)
static void duk__trans_call_handshake(duk_trans_dvalue_ctx *ctx, const char *line)
void duk_trans_dvalue_detached_cb(void *udata)
static void duk__trans_buffer_rebase(duk_trans_buffer *dbuf)
void duk_trans_dvalue_send_number(duk_trans_dvalue_ctx *ctx, double val)
void duk_trans_dvalue_send_eom(duk_trans_dvalue_ctx *ctx)
void duk_trans_dvalue_send(duk_trans_dvalue_ctx *ctx, duk_dvalue *dv)
duk_dvalue * duk_dvalue_make_tag(int tag)
void duk_trans_dvalue_send_object(duk_trans_dvalue_ctx *ctx, int classnum, const char *ptr_data, size_t ptr_len)
static void duk__trans_call_cooperate(duk_trans_dvalue_ctx *ctx, int block)
void duk_trans_dvalue_send_false(duk_trans_dvalue_ctx *ctx)
static duk_dvalue * duk__trans_trial_parse_handshake(duk_trans_dvalue_ctx *ctx)
duk_dvalue * duk_dvalue_make_tag_int(int tag, int intval)
void duk_trans_dvalue_send_req_cmd(duk_trans_dvalue_ctx *ctx, int cmd)
#define DUK_DVALUE_UNUSED
#define DUK_DVALUE_STRING
#define DUK_DVALUE_POINTER
#define DUK_DVALUE_BUFFER
#define DUK_DVALUE_UNDEFINED
#define DUK_DVALUE_INTEGER
#define DUK_DVALUE_OBJECT
#define DUK_DVALUE_LIGHTFUNC
#define DUK_DVALUE_TOSTRING_BUFLEN
#define DUK_DVALUE_NUMBER
#define DUK_DVALUE_HEAPPTR
static void block(LexState *ls)
duk_trans_dvalue_detached_function detached
duk_trans_dvalue_handshake_function handshake
duk_trans_buffer send_buf
duk_trans_buffer recv_buf
duk_trans_dvalue_cooperate_function cooperate
duk_trans_dvalue_received_function received