void read_from_cli() { char buff[s_cli_buff_size]; char* pbuff = buff; memset(buff, 0, s_cli_buff_size); while (1) { int count = wrap_read(fileno(stdin), buff, s_cli_buff_size); if (count > 0 && g_communication_fd != -1) { int sz = 0; int temp = 0; pbuff = buff; while ((temp = write(g_communication_fd, pbuff, count)) >= 0) { sz += temp; pbuff += temp; if (sz >= count) { break; } } } } }
/* -------------------------------------------------- */ static int do_ping_pong(int fd, char *buff, int len) { int err=0,done; char temp[1024] ; #if (WANT_DEBUG &4) fprintf(stderr,"[do_ping_pong(%s,%d)]\n", buff?buff:"NULL", len); #endif if (buff && len) { done = wrap_line(fd, buff, len); if (done < 0) {close(fd); goto quit; } } for (err=done=0; 1 ; done += len) { len = wrap_read(fd, temp+done, sizeof temp -done); if (len <= 0) {close(fd); err = -1; goto quit; } #if (WANT_DEBUG &2) temp[done+len] = 0; fprintf(stderr," [PartRead{%d+%d}{%02x|%02x}:\"%s\"]\n" , done,len, temp[3], temp[done+len-1], temp+done); #endif if (done+len < 3) continue; if (temp[0] != '2') {err = '0' - temp[0]; break; } if (temp[done+len-1] == '\n') { if (temp[3] == '-') { done = 0; len = 0; continue; } else { break; } } else { done = 4; len = 0; } } quit: #if (WANT_DEBUG &4) fprintf(stderr,"[Do_ping_pong(%s) err=%d done=%d] :\"%s\"]\n" , buff, err, done, temp); #endif return (err) ? err : done; }
int handle_socket_read(int fd) { char buff[s_recv_buff_size]; memset(buff, 0, s_recv_buff_size); char addr[INET_ADDRSTRLEN]; uint32_t port = 0; getpeerinfo(fd, addr, &port); int recv_count = -1; while ((recv_count = wrap_read(fd, buff, s_recv_buff_size)) >= 0) { if (0 == recv_count) { handle_socket_close_event(fd); break; } buff[recv_count] = '\0'; // write(fd, buff, recv_count); fprintf(stdout, "%s say: %s\n", addr, buff); } return recv_count; }
macro_fn getmacro(int c) { if (c == '"') { return read_string; } else if (c == '(') { return read_list; } else if (c == ')') { // lambda's are awesome! // but! note that this is only ok as long as the capture list is empty // TODO: and i should probably make sure this doesn't incur any // run time overhead as apposed to using pure functions return [] (std::istream &) -> std::shared_ptr<Object> { throw "Unmatched delimiter: )"; }; } else if (c == '[') { return read_vector; } else if (c == ']') { return [] (std::istream &) -> std::shared_ptr<Object> { throw "Unmatched delimiter: ]"; }; } else if (c == '{') { return read_map; } else if (c == '}') { return [] (std::istream &) -> std::shared_ptr<Object> { throw "Unmatched delimiter: }"; }; } else if (c == '\'') { return [] (std::istream &in) -> std::shared_ptr<Object> { return wrap_read(in, Symbol::create("quote")); }; } else if (c == '@') { return [] (std::istream &in) -> std::shared_ptr<Object> { return wrap_read(in, Symbol::create("clojure.core", "deref")); }; } else if (c == ';') { return read_comment; } else if (c == '\\') { return read_character; } else if (c == '^') { return read_meta; } else if (c == '`') { return [] (std::istream &in) -> std::shared_ptr<Object> { throw "TODO: implement syntax quote reader"; }; } else if (c == '~') { // unquote reader return [] (std::istream &in) -> std::shared_ptr<Object> { int ch = in.get(); if (in.eof()) { throw "EOF while reading character"; } if (ch == '@') { return wrap_read(in, UNQUOTE_SPLICING); } else { in.unget(); return wrap_read(in, UNQUOTE); } }; } else if (c == '%') { return [] (std::istream &in) -> std::shared_ptr<Object> { throw "TODO: implement arg reader"; }; } else if (c == '#') { // dispatch macro reader (lambda) // TODO: is this over-using lambdas? what is the overhead of a lambda // over a pure function, esp if the function is being called via a ptr return [] (std::istream &in) -> std::shared_ptr<Object> { int c = in.get(); if (in.eof()) { throw "EOF while reading character"; } if (c == '{') { return read_set(in); } else if (c == '^') { return read_meta(in); } else if (c == '\'') { return wrap_read(in, Symbol::create("var")); } else if (c == '"') { return read_regex(in); } else if (c == '(') { throw "TODO: implement function reader"; } else if (c == '=') { throw "TODO: implement eval reader"; } else if (c == '!') { return read_comment(in); } else if (c == '<') { throw "Unreadable form"; } else if (c == '_') { read(in, true, Object::nil, true); return NOOP; } else { // try ctor reader // TODO: implement ctor reader } throw "No dispatch macro for: " + std::string{ (char)c }; }; } else { return 0; } }