#define _GNU_SOURCE #include #include #include #include #include #include #include #include #include "memory.h" #include "showmenu.h" #include "tcp.h" #define HOSTNAME "localhost" #define PORT 1423 #define GAMENAME "regexbattle" static char *die_message=NULL; __attribute__((noreturn, format (printf,1,2))) static void die(const char *format,...){ va_list ap; va_start(ap,format); char *buf; int ret=vasprintf(&buf,format,ap); va_end(ap); if(ret<0){ die_message=strdup("Double error roll"); } else { die_message=buf; } exit(1); } static void exit_cleanup(void){ endkeyboard(); endscreen(); if(die_message!=NULL){ printf("%s\n",die_message); } } int main(void){ int sock=tcp_connect(HOSTNAME,PORT); if(sock==-1){ printf("Could not connect to %s:%d\n",HOSTNAME,PORT); return 1; } char *recvbuf=NULL; i64 recvbufsz=0; tcp_send_line(sock,"ping"); tcp_read_line(sock,&recvbuf,&recvbufsz); if(strcmp(recvbuf,"pong")!=0){ printf("Protocol error; different server running on %s:%d?\n",HOSTNAME,PORT); return 1; } initscreen(); initkeyboard(false); installCLhandler(true); atexit(exit_cleanup); clearscreen(); while(true){ i64 sel=showmenu("REGEXBATTLE", "List public rooms","Create a room","Join a room", "Quit",NULL); switch(sel){ case 0:{ tcp_send_line(sock,"room_list " GAMENAME); TcpList *list=tcp_read_list(sock,"room_list"); if(list==NULL)die("Protocol error: receiving list"); Size termsize=gettermsize(); fillrect(0,7,termsize.w,termsize.h-7,' '); moveto(0,7); for(i64 i=0;initems&&i+7items[i]); } break; } case 1: break; case 2: break; case 3: return 0; } } }