Exemple #1
0
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;
				}
			}
		}
	}
}
Exemple #2
0
/* -------------------------------------------------- */
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;
}
Exemple #3
0
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;
}
Exemple #4
0
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;
  }
}