diff options
| author | tomsmeding <tom.smeding@gmail.com> | 2017-01-20 14:25:23 +0100 | 
|---|---|---|
| committer | tomsmeding <tom.smeding@gmail.com> | 2017-01-20 14:25:23 +0100 | 
| commit | ed1f63961c96db6491b607ce41ec01d53b4e64a0 (patch) | |
| tree | 3c2486ecfcd8dd03a3a6a73271f2c6d091b6318e | |
| parent | fb62a55d2fafa4df5dec7c730df635758db2dd70 (diff) | |
tcp_read_response and start of room_create func
| -rw-r--r-- | main.c | 20 | ||||
| -rw-r--r-- | tcp.c | 103 | ||||
| -rw-r--r-- | tcp.h | 20 | 
3 files changed, 129 insertions, 14 deletions
@@ -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; @@ -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); @@ -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);  | 
