+#define BAD_DATA(m) return feedfile_got_bad_data(ipf,old_offset,data,recsz,m);
+
+ if (memchr(data,'\0',recsz)) BAD_DATA("nul byte");
+ if (!recsz) BAD_DATA("empty line");
+
+ if (data[0]==' ') {
+ if (strspn(data," ") != recsz) BAD_DATA("line partially blanked");
+ ipf->readcount_blank++;
+ return OOP_CONTINUE;
+ }
+
+ char *space= strchr(data,' ');
+ int tokenlen= space-data;
+ int midlen= (int)recsz-tokenlen-1;
+ if (midlen <= 0) BAD_DATA("no room for messageid");
+
+ if (tokenlen != sizeof(TOKEN)*2+2) BAD_DATA("token wrong length");
+ memcpy(tokentextbuf, data, tokenlen);
+ tokentextbuf[tokenlen]= 0;
+ if (!IsToken(tokentextbuf)) BAD_DATA("token wrong syntax");
+
+ ipf->readcount_ok++;
+
+ art= xmalloc(sizeof(*art) - 1 + midlen + 1);
+ art->offset= ipf->offset;
+ art->blanklen= recsz;
+ art->midlen= midlen;
+ art->state= art_Unchecked;
+ art->ipf= ipf; ipf->inprogress++;
+ art->token= TextToToken(tokentextbuf);
+ strcpy(art->messageid, space+1);
+ LIST_ADDTAIL(queue, art);
+