// Get number sub
int GetNumber(char *ptr){int res=0;char ch;while(ch=*ptr++)
{if(ch<'0'||ch>'9')break;res=res*10+ch-'0';}return res;}
// Send sub
char SendStr(char s,char *b){if(Write(s,b,StrLen(b))<0)return -2;
WaitWriteComplete(s);return 0;}

// POP handler
char PopHandler(char soc){
char ch,*sendbuf,*frombuf;int len,i;

 if(PopState){
  if(GetNetLine(soc,recbuf,255,10)<0)
  	return -4;
//  PrStr(recbuf);
//  PrStr("\r\n");
  if(PopState!=5&&PopState!=6&&*recbuf!='+')
  	return -4;
 }
 
 switch(PopState){
 case 1:
  sendbuf=MemoryAlloc(StrLen(PopName)+8);
  StrCpy(sendbuf,"USER ");
  StrCat(sendbuf,PopName);
  StrCat(sendbuf,"\r\n");
  if(SendStr(soc,sendbuf)<0){
	MemoryFree(sendbuf);
	return -2;
  }
  MemoryFree(sendbuf);
  PopState++;
  break;
 case 2:
  sendbuf=MemoryAlloc(StrLen(PopPass)+8);
  StrCpy(sendbuf, "PASS ");
  StrCat(sendbuf, PopPass);
  StrCat(sendbuf, "\r\n");
  if(SendStr(soc,sendbuf)<0){
	MemoryFree(sendbuf);
	return -2;
  }
  MemoryFree(sendbuf);
  PopState++;
  break;
 case 3:
  if(SendStr(soc,"STAT\r\n")<0)
  	return -2;
  	PopState++;
  	break;
 case 4:
  len=GetNumber(recbuf+4);
  if(!len)
  	goto Finish;
  if(SendStr(soc,"TOP 1 0\r\n")<0)
  	return -2;
  	PopState++;
  	break;
 case 5:
  if(frombuf=StrStr(recbuf,"From: ")){
  	frombuf+=5;
  	sendbuf=StrChr(frombuf,'<');
  	if(sendbuf)
  		frombuf=sendbuf;
  	while(*frombuf=='<'||*frombuf==' '||*frombuf=='"')
  		frombuf++;
  	sendbuf=frombuf;
  	while(*frombuf&&*frombuf!='\r'&&*frombuf!='>'&&*frombuf!=' '
      && *frombuf!='"'&&*frombuf!=0x28&&*frombuf!='\n')
      frombuf++;
  	len=frombuf-sendbuf;
  	MailTo=MemoryAlloc(len+1);
  	BufCopy(MailTo, sendbuf, len);
  	MailTo[len]=0;
  	PopState++;
  }
  break;
 case 6:
  if(*recbuf=='.'){
	if(SendStr(soc,"DELE 1\r\n")<0)
	return -2;
	PopState++;
 }
 else if(frombuf=StrStr(recbuf, "Subject: ")){
	frombuf +=9;
	Subject = MemoryAlloc(3);
	BufCopy(Subject, frombuf, 3);
	PrStr(Subject);
	break;
  }
  break;
 case 7:
Finish:
  if(SendStr(soc,"QUIT\r\n") < 0)
  	return -2;
  	PopState++;
  	break;
 case 8:
  PopState=0;
  return 1;
 }
 return 0;
}


