summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2017-01-20 14:25:23 +0100
committertomsmeding <tom.smeding@gmail.com>2017-01-20 14:25:23 +0100
commited1f63961c96db6491b607ce41ec01d53b4e64a0 (patch)
tree3c2486ecfcd8dd03a3a6a73271f2c6d091b6318e
parentfb62a55d2fafa4df5dec7c730df635758db2dd70 (diff)
tcp_read_response and start of room_create func
-rw-r--r--main.c20
-rw-r--r--tcp.c103
-rw-r--r--tcp.h20
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);