static void do_write(h2o_socket_t *sock, h2o_buf_t *bufs, size_t bufcnt, h2o_socket_cb cb) { assert(sock->_cb.write == NULL); assert(sock->_wreq.cnt == 0); sock->_cb.write = cb; /* try to write now */ if (write_core(sock->fd, &bufs, &bufcnt) != 0) { sock->_flags |= H2O_SOCKET_FLAG_IS_WRITE_ERROR; h2o_socket__link_to_pending(sock); return; } if (bufcnt == 0) { /* write complete, schedule the callback */ h2o_socket__link_to_pending(sock); return; } /* setup the buffer to send pending data */ if (bufcnt <= sizeof(sock->_wreq.smallbufs) / sizeof(sock->_wreq.smallbufs[0])) { sock->_wreq.bufs = sock->_wreq.smallbufs; } else { sock->_wreq.bufs = h2o_malloc(sizeof(h2o_buf_t) * bufcnt); sock->_wreq.alloced_ptr = sock->_wreq.bufs = sock->_wreq.bufs; } memcpy(sock->_wreq.bufs, bufs, sizeof(h2o_buf_t) * bufcnt); sock->_wreq.cnt = bufcnt; /* schedule the write */ h2o_socket__link_to_statechanged(sock); }
static void write_pair_help(struct writer_control *p, struct pic_pair *pair) { pic_state *pic = p->pic; khash_t(l) *lh = &p->labels; khash_t(v) *vh = &p->visited; khiter_t it; int ret; write_core(p, pair->car); if (pic_nil_p(pair->cdr)) { return; } else if (pic_pair_p(pair->cdr)) { /* shared objects */ if ((it = kh_get(l, lh, pic_ptr(pair->cdr))) != kh_end(lh) && kh_val(lh, it) != -1) { xfprintf(pic, p->file, " . "); kh_put(v, vh, pic_ptr(pair->cdr), &ret); if (ret == 0) { /* if exists */ xfprintf(pic, p->file, "#%d#", kh_val(lh, it)); return; } xfprintf(pic, p->file, "#%d=", kh_val(lh, it)); } else { xfprintf(pic, p->file, " "); } write_pair_help(p, pic_pair_ptr(pair->cdr)); if (p->op == OP_WRITE) { if ((it = kh_get(l, lh, pic_ptr(pair->cdr))) != kh_end(lh) && kh_val(lh, it) != -1) { it = kh_get(v, vh, pic_ptr(pair->cdr)); kh_del(v, vh, it); } } return; } else { xfprintf(pic, p->file, " . "); write_core(p, pair->cdr); } }
static void write_pair(struct writer_control *p, struct pic_pair *pair) { pic_state *pic = p->pic; xFILE *file = p->file; pic_sym *tag; if (pic_pair_p(pair->cdr) && pic_nil_p(pic_cdr(pic, pair->cdr)) && pic_sym_p(pair->car)) { tag = pic_sym_ptr(pair->car); if (tag == pic->sQUOTE) { xfprintf(pic, file, "'"); write_core(p, pic_car(pic, pair->cdr)); return; } else if (tag == pic->sUNQUOTE) { xfprintf(pic, file, ","); write_core(p, pic_car(pic, pair->cdr)); return; } else if (tag == pic->sUNQUOTE_SPLICING) { xfprintf(pic, file, ",@"); write_core(p, pic_car(pic, pair->cdr)); return; } else if (tag == pic->sQUASIQUOTE) { xfprintf(pic, file, "`"); write_core(p, pic_car(pic, pair->cdr)); return; } else if (tag == pic->sSYNTAX_QUOTE) { xfprintf(pic, file, "#'"); write_core(p, pic_car(pic, pair->cdr)); return; } else if (tag == pic->sSYNTAX_UNQUOTE) { xfprintf(pic, file, "#,"); write_core(p, pic_car(pic, pair->cdr)); return; } else if (tag == pic->sSYNTAX_UNQUOTE_SPLICING) { xfprintf(pic, file, "#,@"); write_core(p, pic_car(pic, pair->cdr)); return; } else if (tag == pic->sSYNTAX_QUASIQUOTE) { xfprintf(pic, file, "#`"); write_core(p, pic_car(pic, pair->cdr)); return; } } xfprintf(pic, file, "("); write_pair_help(p, pair); xfprintf(pic, file, ")"); }
static void write_pair_help(pic_state *pic, pic_value pair, pic_value port, struct writer_control *p) { pic_value cdr = pic_cdr(pic, pair); write_core(pic, pic_car(pic, pair), port, p); if (pic_nil_p(pic, cdr)) { return; } else if (pic_pair_p(pic, cdr) && ! is_shared_object(pic, cdr, p)) { pic_fprintf(pic, port, " "); write_pair_help(pic, cdr, port, p); } else { pic_fprintf(pic, port, " . "); write_core(pic, cdr, port, p); } }
static void write_pair(pic_state *pic, pic_value pair, pic_value port, struct writer_control *p) { pic_value tag; if (pic_pair_p(pic, pic_cdr(pic, pair)) && pic_nil_p(pic, pic_cddr(pic, pair)) && pic_sym_p(pic, pic_car(pic, pair))) { tag = pic_car(pic, pair); if (EQ(tag, "quote")) { pic_fprintf(pic, port, "'"); write_core(pic, pic_cadr(pic, pair), port, p); return; } else if (EQ(tag, "unquote")) { pic_fprintf(pic, port, ","); write_core(pic, pic_cadr(pic, pair), port, p); return; } else if (EQ(tag, "unquote-splicing")) { pic_fprintf(pic, port, ",@"); write_core(pic, pic_cadr(pic, pair), port, p); return; } else if (EQ(tag, "quasiquote")) { pic_fprintf(pic, port, "`"); write_core(pic, pic_cadr(pic, pair), port, p); return; } else if (EQ(tag, "syntax-quote")) { pic_fprintf(pic, port, "#'"); write_core(pic, pic_cadr(pic, pair), port, p); return; } else if (EQ(tag, "syntax-unquote")) { pic_fprintf(pic, port, "#,"); write_core(pic, pic_cadr(pic, pair), port, p); return; } else if (EQ(tag, "syntax-unquote-splicing")) { pic_fprintf(pic, port, "#,@"); write_core(pic, pic_cadr(pic, pair), port, p); return; } else if (EQ(tag, "syntax-quasiquote")) { pic_fprintf(pic, port, "#`"); write_core(pic, pic_cadr(pic, pair), port, p); return; } } pic_fprintf(pic, port, "("); write_pair_help(pic, pair, port, p); pic_fprintf(pic, port, ")"); }
static void write_value(pic_state *pic, pic_value obj, pic_value port, int mode, int op) { struct writer_control p; writer_control_init(pic, &p, mode, op); traverse(pic, obj, &p); write_core(pic, obj, port, &p); }
static void write_dict(pic_state *pic, pic_value dict, pic_value port, struct writer_control *p) { pic_value key, val; int it = 0; pic_fprintf(pic, port, "#.(dictionary"); while (pic_dict_next(pic, dict, &it, &key, &val)) { pic_fprintf(pic, port, " '%s ", pic_sym(pic, key)); write_core(pic, val, port, p); } pic_fprintf(pic, port, ")"); }
static void write_dict(struct writer_control *p, struct pic_dict *dict) { pic_state *pic = p->pic; xFILE *file = p->file; pic_sym *sym; khiter_t it; xfprintf(pic, file, "#.(dictionary"); pic_dict_for_each (sym, dict, it) { xfprintf(pic, file, " '%s ", pic_symbol_name(pic, sym)); write_core(p, pic_dict_ref(pic, dict, sym)); }
static void write_vec(pic_state *pic, pic_value vec, pic_value port, struct writer_control *p) { int i, len = pic_vec_len(pic, vec); pic_fprintf(pic, port, "#("); for (i = 0; i < len; ++i) { write_core(pic, pic_vec_ref(pic, vec, i), port, p); if (i + 1 < len) { pic_fprintf(pic, port, " "); } } pic_fprintf(pic, port, ")"); }
static void write_vec(struct writer_control *p, pic_vec *vec) { pic_state *pic = p->pic; xFILE *file = p->file; size_t i; xfprintf(pic, file, "#("); for (i = 0; i < vec->len; ++i) { write_core(p, vec->data[i]); if (i + 1 < vec->len) { xfprintf(pic, file, " "); } } xfprintf(pic, file, ")"); }
void h2o_socket__write_pending(h2o_socket_t *sock) { assert(sock->_cb.write != NULL); assert(sock->_wreq.cnt != 0); /* write */ if (write_core(sock->fd, &sock->_wreq.bufs, &sock->_wreq.cnt) != 0 || sock->_wreq.cnt == 0) { /* either completed or failed */ wreq_free_buffer_if_allocated(sock); if (sock->_wreq.cnt != 0) { /* pending data exists -> was an error */ sock->_wreq.cnt = 0; /* clear it ! */ sock->_flags |= H2O_SOCKET_FLAG_IS_WRITE_ERROR; } h2o_socket__link_to_pending(sock); h2o_socket__link_to_statechanged(sock); /* might need to disable the write polling */ } }