ref: ba23a153fc2d9eb2dbdb1bc3273b1dcffda81021
parent: 2a6077848c4d30e8d04091a3497538ea896f2b8b
author: mkf <mkf@cloud9p.org>
date: Sat May 4 03:55:38 EDT 2024
netclient.[ch] add functions needed to parse messages
--- a/netclient.c
+++ b/netclient.c
@@ -3,6 +3,13 @@
int sockfd;
+typedef struct
+{
+ char *omsg;
+ char **tokens;
+ int err;
+}Netmsg;
+
static char*
dirtostr(int dir)
{
@@ -25,7 +32,60 @@
}
}
+/* i miss strntok */
static char*
+getpart(char *s, char *tok, int n)
+{
+ char *tmp;
+
+ for(int i = 0 ; i < n ; i++)
+ tmp = strtok(s, tok);
+
+ if(tmp == nil)
+ return nil;
+
+ return tmp;
+}
+
+static int
+isnum(char *s, unsigned int n;)
+{
+ if(strlen(s) < n)
+ n = strlen(s);
+
+ for(int i = 0 ; i < n ; i++)
+ {
+ if(s[i] > '9' || s[i] < '0')
+ return 0;
+ }
+ return 1;
+}
+
+/* TODO: move to engine.h */
+static int
+parsemove(char *s)
+{
+ int d;
+
+ if(strcmp(s, "NE") == 0)
+ d = NE;
+ else if(strcmp(s, "E") == 0)
+ d = E;
+ else if(strcmp(s, "SE") == 0)
+ d = SE;
+ else if(strcmp(s, "W") == 0)
+ d = W;
+ else if(strcmp(s, "SW") == 0)
+ d = SW;
+ else if(strcmp(s, "NW") == 0)
+ d = NW;
+ else
+ sysfatal("parsemove(): invalid direction");
+
+ return d;
+}
+
+static char*
movemsg(int dir)
{
char *d, *msg;
@@ -39,9 +99,37 @@
}
else
return nil;
+}
+
+/* xx yy\0 */
+/*
+static Point
+parseput(char *s)
+{
+ int x, y;
+ int len;
+ x = atoi(s);
+ s = strchr(s, ' ');
+ if(end == nil)
+ {
+ dprint("parseput(): end nil\n");
+ sysfatal("parseput(): incomplete line");
+ }
+ y = atoi(s);
+ return Pt(x, y);
}
+*/
+static Point
+parseput(char *x, char *y)
+{
+ if(isnum(x, 2) != 1 && isnum(y, 2) != 1)
+ sysfatal("parseput(): input isnt a number?");
+
+ return Pt(atoi(x), atoi(y));
+}
+
static char*
putmsg(int x, int y)
{
@@ -84,3 +172,176 @@
free(msg);
}
+
+static void
+netproc(Netmsg *msg, char *in)
+{
+ int dir;
+ int i = 0;
+ int dir;
+ char *tmp, **tmparr;
+ char **tokens = malloc(64 * sizeof(char*));;
+ Point p;
+
+ msg->omsg = strdup(in);
+
+ do
+ {
+ tokens[i] = strtok(in, " ");
+ }while(tokens[i++] != nil);
+
+ msg->ntoken = i;
+ msg->tokens = tokens;
+ msg->err = Ok;
+ if(!strcmp(token[0], "CONN"))
+ {
+ if(strlen(token[1]) != 1 || token[1][0] < '0' || token[1][0] > '9')
+ {
+ dprint("odd msg: %s\n", msg.omsg);
+ msg.err = ERR_BADINPUT;
+
+ }
+ switch(atoi(token[1]))
+ {
+ case '0':
+ game->pside = PTrapper;
+ case '1':
+ game->pside = PGlenda;
+ default:
+ sysfatal("invalid conn")
+ }
+ }
+ else if(!strcmp(token[0], "WAIT")
+ {
+ game->wait = 1;
+ }
+ else if(!strcmp(token[0], "INIT")
+ {
+ game->wait = 0;
+ game->state = Init;
+ while(games.state == Init)
+ {
+ tmp = netread();
+ /* lots of assuming goes here,
+ * messages are in the form of:
+ * {w,g} xx yy\n
+ */
+ switch(*tmp)
+ {
+ case 'w':
+ tmparr[0] = getpart(tmp, " ", 1);
+ tmparr[1] = getpart(tmp, " ", 2);
+ if(tmparr[0] == nil || tmparr[0])
+ dprint("netproc(): w tmparr is nil?\n");
+ p.x = atoi(tmparr[0]);
+ p.y = atoi(tmparr[1]);
+
+ grid[p.x][p.y] = Wall;
+ break;
+ case 'g':
+ if(game->glenda != nil)
+ dprint("netproc(): repositioning glenda?\n");
+
+ tmparr[0] = getpart(tmp, " ", 1);
+ tmparr[1] = getpart(tmp, " ", 2);
+ if(tmparr[0] == nil || tmparr[0])
+ dprint("netproc(): g tmparr is nil?\n");
+
+ p.x = atoi(tmparr[0]);
+ p.y = atoi(tmparr[1]);
+
+ grid[p.x][p.y] = Glenda;
+ break;
+ default:
+ if(!strcmp("SENT", tmp))
+ game.state = Start
+ else
+ dprint("netproc(): unknown command: %s\n", tmp);
+
+ }
+ }
+ }
+ else if(!strcmp(token[0], "SENT")
+ {
+ /* sent is handled in INIT */
+ dprint("SENT without INIT?\n");
+ }
+ else if(!strcmp(token[0], "TURN")
+ {
+ game->wait = 0;
+ }
+ else if(!strcmp(token[0], "WALL")
+ {
+ msg->err = Wall;
+ }
+ else if(!strcmp(token[0], "GLND")
+ {
+ msg->err = Glenda;
+ }
+ else if(!strcmp(token[0], "SYNC")
+ {
+ ifmsg->ntoken < 2)
+ sysfatal("netproc(): not enough toknes?");
+
+ if(atoi(msg->token[1] % 2 == 0))
+ {
+ /* trapper's turn is done */
+ if(msg->ntoken != 4)
+ sysfatal("netproc(): not enough tokens to SYNC trapper's move");
+
+ p = parseput(token[2], token[3]);
+ doput(p);
+ }
+ else
+ {
+ /* glenda's turn is done */\
+ if(msg->token != 3)
+ sysfatal("netproc(): not enough tokens to SYNC glenda's move");
+ dir = parsemove(token[2]);
+ domove(dir);
+ }
+ }
+ else if(!strcmp(token[0], "WON")
+ {
+ msg->err = Won;
+ }
+ else if(!strcmp(token[0], "LOST")
+ {
+ msg->err = Lost;
+ }
+ else
+ {
+ sysfatal("netproc(): unkown message");
+ }
+}
+
+char*
+netread(void)
+{
+ char *s = malloc(1024);
+ int n = 0;
+
+ memset(s, 0, 1024);
+ while(read(sockfd, s+n, 1) == 1 && n < 1024)
+ {
+ if(s[n] == '\n' || s[n] == '\0')
+ {
+ s[n] = '\0';
+ break;
+ }
+ n++;
+ }
+ return s;
+}
+
+Netmsg
+netmain(void)
+{
+ Netmsg *msg;
+ char *s;
+ msg = malloc(sizeof(Netmsg));
+
+
+ netproc(msg, s);
+ return msg;
+}
\ No newline at end of file