Esempio n. 1
0
node* list_insafter(llist* l, node* w, entrytype item)
{
  node* newnode = (node *)malloc(sizeof(node));

  newnode->entry.name = newstr(item.name);
  newnode->entry.value = newstr(item.value);
  if (l->head == 0) {
    newnode->next = 0;
    l->head = newnode;
  }
  else if (!on_list(l,w))
    /* ERROR: can't insert item after w since w is not on l */
    exit(1);
  else {
    /* insert node after */
    if (newnode == 0) /* can assume that w != NULL */
      /* ERROR: nothing to insert after */
      exit(1);
    else {
      newnode->next = w->next;
      w->next = newnode;
    }
  }
  return newnode;
}
Esempio n. 2
0
void EasyP2P::on_message(int sock, string message)
{
	append_buf(sock, message);

	switch (get_state(sock)) {
		case EasyP2PState::NICK:
		{
			string result;
			if ( !read_until(message, "\n", result, 0) ) {
				need_buf(sock, message, true);
				return;
			}

			regex r(R"(^(\w+)\s+)");
			smatch m;
			if (!regex_search(result, m, r)) {
				string message = "Invalid nickname!";
				_scheduler.write_line(sock, message);
				return;
			}

			auto nick = m[1];
			if (_n2s.find(nick) != _n2s.end()) {
				string message = "ALready exist!";
				_scheduler.write_line(sock, message);
				return;
			}

			_n2s[nick] = sock;
			_s2n[sock] = nick;
			_scheduler.write_line(sock, "Nickname OK!");
			_scheduler.write_line(sock, "You can type cmd now!");
			set_state(sock, EasyP2PState::CMD);

			break;
		}
		case EasyP2PState::CMD:
		{
			string result;
			regex r(R"(^\w+\s+(\w+))");

			while (true) {
				if ( !read_until(message, "\n", result, 0) ) {
					need_buf(sock, message, true);
					return;
				}

				if ( result.find("list") == 0 ) {
					on_list(sock);
				}
				else if ( result.find("info ") == 0 ) {