+ while((cnt = read(ln,rb,600)) > 0) {
+ if(!slnt) write(1,rb,cnt);
+ if(ds < 0) continue;
+ oldslnt = slnt;
+ for( q=rb, rlim = rb + cnt - 1; q <= rlim; ) {
+ c = *q++ & 0177;
+ if(p < llim) *p++ = c;
+ switch(state) {
+ case ORDIN:
+ if(c=='\r') state = SAWCR;
+ break;
+ case SAWCR:
+ if(c=='\n') {
+ state = EOL;
+ p--;
+ p[-1] = '\n';
+ } else state = ORDIN;
+ break;
+ case EOL:
+ state = (c=='~' ? SAWTL :
+ (c=='\r' ? SAWCR : ORDIN));
+ break;
+ case SAWTL:
+ state = (c=='>' ? DIVER :
+ (c=='\r' ? SAWCR : ORDIN));
+ break;
+ case DIVER:
+ if(c=='\r') {
+ p--;
+ } else if (c=='\n') {
+ state = ORDIN;
+ p[-1] = 0;
+ dodiver(lb+2);
+ c = 0; p = lb;
+ }
+ }
+ if(slnt==0 && oldslnt) {
+ if(c=='\n') {
+ write(ln,lb,p-lb-1);
+ write(ln,CRLF,sizeof(CRLF));
+ } else if(q==rlim) {
+ write(ln,lb,p-lb);
+ c = '\n'; /*force flush to file*/
+ }
+ }
+ if(c=='\n') {
+ if(ds >= 0)
+ write(ds,lb,p-lb);
+ p = lb;