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; }
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 ) {