mischiefinit349191611 years agoHistory
97 lines · 1.4 KB · C
RawDownload
#include <u.h>#include <libc.h> #include "msg.h" Msg*parsemsg(char *b){	char *tok[5], *args[20];	int i, n, ntok, nargs;	Msg *msg; 	if(b == nil || b[0] == 0)		return nil; 	msg = mallocz(sizeof(*msg), 1); 	if(b[0] == ':'){		ntok = gettokens(b, tok, 2, " ");		if(ntok != 2)			goto fail;		strncpy(msg->prefix, tok[0]+1, sizeof(msg->prefix)-1);		b = tok[1];	} 	ntok = gettokens(b, tok, 2, ":"); 	nargs = gettokens(tok[0], args, nelem(args), " "); 	strncpy(msg->cmd, args[0], sizeof(msg->cmd)-1);	n = strlen(msg->cmd);	for(i = 0; i < n; i++){		msg->cmd[i] = tolower(msg->cmd[i]);	} 	msg->nargs = nargs - 1 + (ntok > 1 ? 1 : 0); 	msg->args = mallocz(msg->nargs * sizeof(char*), 1);	for(i = 0; i < msg->nargs - (ntok > 1 ? 1 : 0); i++){		msg->args[i] =  strdup(args[i+1]);	} 	if(ntok > 1){		msg->args[i] = strdup(tok[1]);	} /*	fprint(2, "prefix: %s\n", msg->prefix);	fprint(2, "command: %s\n", msg->cmd);	for(i = 0; i < msg->nargs; i++){		fprint(2, " %s\n", msg->args[i]);	}*/ 	return msg;fail:	free(msg);	return nil;} voidfreemsg(Msg *m){	int i; 	if(m == nil)		return; 	if(m->nargs > 0){		for(i = 0; i < m->nargs; i++)			free(m->args[i]);		free(m->args);	} 	free(m);} char*findmsg(char *buf, char **rest){	char *p; 	if((p = strstr(buf, "\r\n")) != nil){		*p++ = 0;		*p++ = 0;		*rest = p;		return strdup(buf);	} 	if((p = strstr(buf, "\n")) != nil){		*p++ = 0;		*rest = p;		return strdup(buf);	} 	return nil;}