duk_trans_dvalue.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #ifndef DUK_TRANS_DVALUE_H_INCLUDED
  2. #define DUK_TRANS_DVALUE_H_INCLUDED
  3. #include "duktape.h"
  4. typedef struct duk_dvalue duk_dvalue;
  5. typedef struct duk_trans_buffer duk_trans_buffer;
  6. typedef struct duk_trans_dvalue_ctx duk_trans_dvalue_ctx;
  7. typedef void (*duk_trans_dvalue_received_function)(duk_trans_dvalue_ctx *ctx, duk_dvalue *dv);
  8. typedef void (*duk_trans_dvalue_cooperate_function)(duk_trans_dvalue_ctx *ctx, int block);
  9. typedef void (*duk_trans_dvalue_handshake_function)(duk_trans_dvalue_ctx *ctx, const char *handshake_line);
  10. typedef void (*duk_trans_dvalue_detached_function)(duk_trans_dvalue_ctx *ctx);
  11. /* struct duk_dvalue 'tag' values, note that these have nothing to do with
  12. * Duktape debug protocol inital byte. Struct fields used with the type
  13. * are noted next to the define.
  14. */
  15. #define DUK_DVALUE_EOM 1 /* no fields */
  16. #define DUK_DVALUE_REQ 2 /* no fields */
  17. #define DUK_DVALUE_REP 3 /* no fields */
  18. #define DUK_DVALUE_ERR 4 /* no fields */
  19. #define DUK_DVALUE_NFY 5 /* no fields */
  20. #define DUK_DVALUE_INTEGER 6 /* i: 32-bit signed integer */
  21. #define DUK_DVALUE_STRING 7 /* buf: string data, len: string length */
  22. #define DUK_DVALUE_BUFFER 8 /* buf: buffer data, len: buffer length */
  23. #define DUK_DVALUE_UNUSED 9 /* no fields */
  24. #define DUK_DVALUE_UNDEFINED 10 /* no fields */
  25. #define DUK_DVALUE_NULL 11 /* no fields */
  26. #define DUK_DVALUE_TRUE 12 /* no fields */
  27. #define DUK_DVALUE_FALSE 13 /* no fields */
  28. #define DUK_DVALUE_NUMBER 14 /* d: ieee double */
  29. #define DUK_DVALUE_OBJECT 15 /* i: class number, buf: pointer data, len: pointer length */
  30. #define DUK_DVALUE_POINTER 16 /* buf: pointer data, len: pointer length */
  31. #define DUK_DVALUE_LIGHTFUNC 17 /* i: lightfunc flags, buf: pointer data, len: pointer length */
  32. #define DUK_DVALUE_HEAPPTR 18 /* buf: pointer data, len: pointer length */
  33. struct duk_dvalue {
  34. /* Could use a union for the value but the gain would be relatively small. */
  35. int tag;
  36. int i;
  37. double d;
  38. size_t len;
  39. unsigned char *buf;
  40. };
  41. struct duk_trans_buffer {
  42. unsigned char *base;
  43. size_t write_offset;
  44. size_t read_offset;
  45. size_t alloc_size;
  46. };
  47. struct duk_trans_dvalue_ctx {
  48. duk_trans_dvalue_received_function received;
  49. duk_trans_dvalue_cooperate_function cooperate;
  50. duk_trans_dvalue_handshake_function handshake;
  51. duk_trans_dvalue_detached_function detached;
  52. duk_trans_buffer send_buf; /* sending towards Duktape (duktape read callback) */
  53. duk_trans_buffer recv_buf; /* receiving from Duktape (duktape write callback) */
  54. int handshake_done;
  55. int double_byteorder; /* 0=little endian, 1=big endian, 2=mixed endian */
  56. };
  57. /* Buffer size needed by duk_dvalue_to_string(). */
  58. #define DUK_DVALUE_TOSTRING_BUFLEN 256
  59. /* Dvalue handling. */
  60. duk_dvalue *duk_dvalue_alloc(void);
  61. void duk_dvalue_free(duk_dvalue *dv);
  62. void duk_dvalue_to_string(duk_dvalue *dv, char *buf);
  63. duk_dvalue *duk_dvalue_make_tag(int tag);
  64. duk_dvalue *duk_dvalue_make_tag_int(int tag, int intval);
  65. duk_dvalue *duk_dvalue_make_tag_double(int tag, double dblval);
  66. duk_dvalue *duk_dvalue_make_tag_data(int tag, const char *buf, size_t len);
  67. duk_dvalue *duk_dvalue_make_tag_int_data(int tag, int intval, const char *buf, size_t len);
  68. /* Initializing and freeing the transport context. */
  69. duk_trans_dvalue_ctx *duk_trans_dvalue_init(void);
  70. void duk_trans_dvalue_free(duk_trans_dvalue_ctx *ctx);
  71. /* Sending dvalues towards Duktape. */
  72. void duk_trans_dvalue_send(duk_trans_dvalue_ctx *ctx, duk_dvalue *dv);
  73. void duk_trans_dvalue_send_eom(duk_trans_dvalue_ctx *ctx);
  74. void duk_trans_dvalue_send_req(duk_trans_dvalue_ctx *ctx);
  75. void duk_trans_dvalue_send_rep(duk_trans_dvalue_ctx *ctx);
  76. void duk_trans_dvalue_send_err(duk_trans_dvalue_ctx *ctx);
  77. void duk_trans_dvalue_send_nfy(duk_trans_dvalue_ctx *ctx);
  78. void duk_trans_dvalue_send_integer(duk_trans_dvalue_ctx *ctx, int val);
  79. void duk_trans_dvalue_send_string(duk_trans_dvalue_ctx *ctx, const char *str);
  80. void duk_trans_dvalue_send_lstring(duk_trans_dvalue_ctx *ctx, const char *str, size_t len);
  81. void duk_trans_dvalue_send_buffer(duk_trans_dvalue_ctx *ctx, const char *buf, size_t len);
  82. void duk_trans_dvalue_send_unused(duk_trans_dvalue_ctx *ctx);
  83. void duk_trans_dvalue_send_undefined(duk_trans_dvalue_ctx *ctx);
  84. void duk_trans_dvalue_send_null(duk_trans_dvalue_ctx *ctx);
  85. void duk_trans_dvalue_send_true(duk_trans_dvalue_ctx *ctx);
  86. void duk_trans_dvalue_send_false(duk_trans_dvalue_ctx *ctx);
  87. void duk_trans_dvalue_send_number(duk_trans_dvalue_ctx *ctx, double val);
  88. void duk_trans_dvalue_send_object(duk_trans_dvalue_ctx *ctx, int classnum, const char *ptr_data, size_t ptr_len);
  89. void duk_trans_dvalue_send_pointer(duk_trans_dvalue_ctx *ctx, const char *ptr_data, size_t ptr_len);
  90. void duk_trans_dvalue_send_lightfunc(duk_trans_dvalue_ctx *ctx, int lf_flags, const char *ptr_data, size_t ptr_len);
  91. void duk_trans_dvalue_send_heapptr(duk_trans_dvalue_ctx *ctx, const char *ptr_data, size_t ptr_len);
  92. void duk_trans_dvalue_send_req_cmd(duk_trans_dvalue_ctx *ctx, int cmd);
  93. /* Duktape debug callbacks provided by the transport. */
  94. duk_size_t duk_trans_dvalue_read_cb(void *udata, char *buffer, duk_size_t length);
  95. duk_size_t duk_trans_dvalue_write_cb(void *udata, const char *buffer, duk_size_t length);
  96. duk_size_t duk_trans_dvalue_peek_cb(void *udata);
  97. void duk_trans_dvalue_read_flush_cb(void *udata);
  98. void duk_trans_dvalue_write_flush_cb(void *udata);
  99. void duk_trans_dvalue_detached_cb(void *udata);
  100. #endif /* DUK_TRANS_DVALUE_H_INCLUDED */