rem: if (! is_empty(tmp, len-offset)){ goto error; } nl=eat_line(tmp,len-offset);
context: char* parse_first_line(char* buffer, unsigned int len, struct msg_start * fl){		char *tmp;	char* second;	char* third;	char* nl;	int offset;		/* grammar:		request  =  method SP uri SP version CRLF		response =  version SP status  SP reason  CRLF		(version = "SIP/2.0")	*/		/* see if it's a reply (status) */	tmp=eat_token(buffer, len);	if (tmp==buffer){		DPrint("ERROR: empty  or bad first line\n");		goto error1;	}	if ((strlen(SIP_VERSION)==(tmp-buffer)) &&		(memcmp(buffer,SIP_VERSION,tmp-buffer)==0)){				fl->type=SIP_REPLY;	}else{		fl->type=SIP_REQUEST;	}		offset=tmp-buffer;	second=eat_space(tmp, len-offset);	offset+=second-tmp;	if (second==tmp){		goto error;	}	*tmp=0; /* mark the end of the token */	fl->u.request.method=buffer;		/* next element */	tmp=eat_token(second, len-offset);	offset+=tmp-second;	third=eat_space(tmp, len-offset);	offset+=third-tmp;	if(third==tmp){		goto error;	}	*tmp=0; /* mark the end of the token */	fl->u.request.uri=second;	/*  last part */	tmp=eat_token(third,len-offset);	offset+=tmp-third;	if (tmp==third){		goto error;	}	if (! is_empty(tmp, len-offset)){				goto error;	}	nl=eat_line(tmp,len-offset);	*tmp=0;	fl->u.request.version=third;		return nl;error:	DPrint("ERROR: bad %s first line\n", 		(fl->type==SIP_REPLY)?"reply(status)":"request");error1:	fl->type=SIP_INVALID;	DPrint("ERROR: at line 0 char %d\n", offset);	/* skip  line */	nl=eat_line(buffer,len);	return nl;}