From ed1f63961c96db6491b607ce41ec01d53b4e64a0 Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Fri, 20 Jan 2017 14:25:23 +0100 Subject: tcp_read_response and start of room_create func --- main.c | 20 ++++++++++--- tcp.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- tcp.h | 20 +++++++++++++ 3 files changed, 129 insertions(+), 14 deletions(-) diff --git a/main.c b/main.c index 0b7a639..b5f9205 100644 --- a/main.c +++ b/main.c @@ -55,8 +55,18 @@ char* show_prompt(int x,int y,int w,const char *title){ return line; } -static void room_create(const char *name){} -static void room_join(const char *name){} +static void room_create(int sock,const char *name){ + tcp_send_line_f(sock,"room_create " GAMENAME " %s 0 2",name); + if(tcp_read_ok(sock,"room_create")==-1){ + moveto(1,7); + tprintf("Room name already exists."); + redraw(); + return; + } + //TODO: do something with the created room +} + +static void room_join(int sock,const char *name){} int main(void){ int sock=tcp_connect(HOSTNAME,PORT); @@ -84,6 +94,8 @@ int main(void){ i64 sel=showmenu("REGEXBATTLE", "List open public games","Create a new game","Join an open game", "Quit",NULL); + Size termsize=gettermsize(); + fillrect(0,7,termsize.w,termsize.h-7,' '); switch(sel){ case 0: { tcp_send_line(sock,"room_list " GAMENAME); @@ -104,7 +116,7 @@ int main(void){ Size termsize=gettermsize(); fillrect(0,7,termsize.w,termsize.h-7,' '); if(line!=NULL){ - room_create(line); + room_create(sock,line); free(line); } break; @@ -115,7 +127,7 @@ int main(void){ Size termsize=gettermsize(); fillrect(0,7,termsize.w,termsize.h-7,' '); if(line!=NULL){ - room_join(line); + room_join(sock,line); free(line); } break; diff --git a/tcp.c b/tcp.c index 65da79d..8ed6060 100644 --- a/tcp.c +++ b/tcp.c @@ -123,15 +123,7 @@ i64 tcp_read_ok(int sock,const char *tag){ return success?0:-1; } -TcpList* tcp_read_list(int sock,const char *tag){ - char *buf=NULL; - i64 bufsz=0; - i64 ret=tcp_read_line(sock,&buf,&bufsz); - if(ret==-1){ - if(buf!=NULL)free(buf); - return NULL; - } - +static TcpList* interpret_list(char *buf,const char *tag){ char *walker=buf; char *word1=strsep(&walker," "); char *word2=strsep(&walker," "); @@ -144,7 +136,7 @@ TcpList* tcp_read_list(int sock,const char *tag){ return NULL; } char *endp; - i64 word3i=strtol(word3,&endp,10); + i64 word3i=strtoll(word3,&endp,10); if(word3[0]=='\0'||*endp!='\0'||word3i!=nitems){ free(buf); return NULL; @@ -161,12 +153,103 @@ TcpList* tcp_read_list(int sock,const char *tag){ return list; } +TcpList* tcp_read_list(int sock,const char *tag){ + char *buf=NULL; + i64 bufsz=0; + i64 ret=tcp_read_line(sock,&buf,&bufsz); + if(ret==-1){ + if(buf!=NULL)free(buf); + return NULL; + } + + TcpList *list=interpret_list(buf,tag); + free(buf); + return list; +} + void tcp_list_destroy(TcpList *list){ free(list->items); free(list); } +TcpResponse* tcp_read_response(int sock,const char *tag){ + char *buf=NULL; + i64 bufsz=0; + i64 ret=tcp_read_line(sock,&buf,&bufsz); + if(ret==-1){ + if(buf!=NULL)free(buf); + return NULL; + } + + char *walker=buf; + char *word1=strsep(&walker," "); + char *word2=strsep(&walker," "); + if(word1==NULL||word2==NULL||strcmp(word2,tag)!=0){ + free(buf); + return NULL; + } + + TcpResponseType type; + i64 intvalue; + TcpList *listvalue=NULL; + char *errorvalue=NULL; + if(strcmp(word1,"ok")==0&&walker==NULL){ + type=TCP_OK; + } else if(strcmp(word1,"error")==0){ + type=TCP_ERROR; + if(walker==NULL){ + free(buf); + return NULL; + } + errorvalue=walker; + } else if(strcmp(word1,"int")==0){ + type=TCP_INT; + char *token=strsep(&walker," "); + if(walker!=NULL||token==NULL){ + free(buf); + return NULL; + } + char *endp; + intvalue=strtoll(token,&endp,10); + if(token[0]=='\0'||*endp!='\0'){ + free(buf); + return NULL; + } + } else if(strcmp(word1,"list")==0){ + type=TCP_LIST; + listvalue=interpret_list(buf,tag); + if(listvalue==NULL){ + free(buf); + return NULL; + } + } else { + free(buf); + return NULL; + } + + TcpResponse *res=malloc(1,TcpResponse); + res->type=type; + switch(type){ + case TCP_OK: break; + case TCP_ERROR: res->eval=errorvalue; break; + case TCP_INT: res->ival=intvalue; break; + case TCP_LIST: res->lval=listvalue; break; + } + return res; +} + +void tcp_response_destroy(TcpResponse *res){ + switch(res->type){ + case TCP_OK: break; + case TCP_ERROR: free(res->eval); break; + case TCP_INT: break; + case TCP_LIST: tcp_list_destroy(res->lval); break; + } + free(res); +} + + static const char* itoa(int n){ static char buf[64]; sprintf(buf,"%d",n); diff --git a/tcp.h b/tcp.h index 6d50538..66d4c75 100644 --- a/tcp.h +++ b/tcp.h @@ -30,6 +30,26 @@ typedef struct TcpList{ TcpList* tcp_read_list(int sock,const char *tag); void tcp_list_destroy(TcpList *list); +typedef enum TcpResponseType{ + TCP_OK, + TCP_LIST, + TCP_INT, + TCP_ERROR, +} TcpResponseType; + +typedef struct TcpResponse{ + TcpResponseType type; + union { + TcpList *lval; + i64 ival; + char *eval; //Newly allocated string + }; +} TcpResponse; + +//Returns NULL on error instead of -1. +TcpResponse* tcp_read_response(int sock,const char *tag); +void tcp_response_destroy(TcpResponse *res); + //Returns the socket. int tcp_connect(const char *hostname,int port); -- cgit v1.2.3-54-g00ecf