tolerate short records on non-seekable input. DLW
[unix-history] / usr / src / usr.bin / f77 / libI77 / sfe.c
index 1edd2a2..a948645 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
-char id_sfe[] = "@(#)sfe.c     1.2";
+char id_sfe[] = "@(#)sfe.c     1.8";
  *
  * sequential formatted external routines
  */
  *
  * sequential formatted external routines
  */
@@ -13,25 +13,33 @@ char id_sfe[] = "@(#)sfe.c  1.2";
 extern int rd_ed(),rd_ned();
 int x_rnew(),x_getc(),x_tab();
 
 extern int rd_ed(),rd_ned();
 int x_rnew(),x_getc(),x_tab();
 
+char rsfe[] = "read sfe";
+char wsfe[] = "write sfe";
+
 s_rsfe(a) cilist *a; /* start */
 {      int n;
        reading = YES;
        if(n=c_sfe(a,READ)) return(n);
 s_rsfe(a) cilist *a; /* start */
 {      int n;
        reading = YES;
        if(n=c_sfe(a,READ)) return(n);
-       if(curunit->uwrt) nowreading(curunit);
+       if(curunit->uwrt && ! nowreading(curunit)) err(errflag, errno, rsfe)
        getn= x_getc;
        doed= rd_ed;
        doned= rd_ned;
        donewrec = dorevert = doend = x_rnew;
        dotab = x_tab;
        getn= x_getc;
        doed= rd_ed;
        doned= rd_ned;
        donewrec = dorevert = doend = x_rnew;
        dotab = x_tab;
-       if(pars_f(fmtbuf)) err(errflag,F_ERFMT,"read sfe")
+       if(pars_f(fmtbuf)) err(errflag,F_ERFMT,rsfe)
        fmt_bg();
        return(OK);
 }
 
 x_rnew()                       /* find next record */
 {      int ch;
        fmt_bg();
        return(OK);
 }
 
 x_rnew()                       /* find next record */
 {      int ch;
-       if(!curunit->uend)
-               while((ch=getc(cf))!='\n' && ch!=EOF);
+       if(curunit->uend)
+               return(EOF);
+       while((ch=getc(cf))!='\n' && ch!=EOF);
+       if(feof(cf))
+       {       curunit->uend = YES;
+               if (recpos==0) return(EOF);
+       }
        cursor=recpos=reclen=0;
        return(OK);
 }
        cursor=recpos=reclen=0;
        return(OK);
 }
@@ -68,15 +76,15 @@ c_sfe(a,flag) cilist *a; /* check */
        errflag = a->cierr;
        endflag = a->ciend;
        lunit = a->ciunit;
        errflag = a->cierr;
        endflag = a->ciend;
        lunit = a->ciunit;
-       if(not_legal(lunit)) err(errflag,F_ERUNIT,"sfe");
+       if(not_legal(lunit)) err(errflag,F_ERUNIT,rsfe+5);
        curunit = p = &units[lunit];
        if(!p->ufd && (n=fk_open(flag,SEQ,FMT,(ftnint)lunit)) )
        curunit = p = &units[lunit];
        if(!p->ufd && (n=fk_open(flag,SEQ,FMT,(ftnint)lunit)) )
-               err(errflag,n,"sfe")
+               err(errflag,n,rsfe+5)
        cf = curunit->ufd;
        elist = YES;
        lfname = curunit->ufnm;
        cf = curunit->ufd;
        elist = YES;
        lfname = curunit->ufnm;
-       if(!p->ufmt) err(errflag,F_ERNOFIO,"sfe")
-       if(p->url) err(errflag,F_ERNOSIO,"sfe")
+       if(!p->ufmt) err(errflag,F_ERNOFIO,rsfe+5)
+       if(p->url) err(errflag,F_ERNOSIO,rsfe+5)
        cursor=recpos=scale=reclen=0;
        radix = 10;
        signit = YES;
        cursor=recpos=scale=reclen=0;
        radix = 10;
        signit = YES;
@@ -97,7 +105,7 @@ s_wsfe(a) cilist *a; /*start*/
 {      int n;
        reading = NO;
        if(n=c_sfe(a,WRITE)) return(n);
 {      int n;
        reading = NO;
        if(n=c_sfe(a,WRITE)) return(n);
-       if(!curunit->uwrt) nowwriting(curunit);
+       if(!curunit->uwrt && ! nowwriting(curunit)) err(errflag, errno, wsfe)
        curunit->uend = NO;
        if (curunit->uprnt) putn = pr_put;
        else putn = x_putc;
        curunit->uend = NO;
        if (curunit->uprnt) putn = pr_put;
        else putn = x_putc;
@@ -107,7 +115,7 @@ s_wsfe(a) cilist *a;        /*start*/
        doend = x_wend;
        dorevert = donewrec = x_wnew;
        dotab = x_tab;
        doend = x_wend;
        dorevert = donewrec = x_wnew;
        dotab = x_tab;
-       if(pars_f(fmtbuf)) err(errflag,F_ERFMT,"write sfe")
+       if(pars_f(fmtbuf)) err(errflag,F_ERFMT,wsfe)
        fmt_bg();
        return(OK);
 }
        fmt_bg();
        return(OK);
 }
@@ -141,7 +149,7 @@ x_tab()
 {      int n;
        if(reclen < recpos) reclen = recpos;
        if(curunit->useek)
 {      int n;
        if(reclen < recpos) reclen = recpos;
        if(curunit->useek)
-       {       if((recpos+cursor) < 0) return(F_ERBREC);
+       {       if((recpos+cursor) < 0) cursor = -recpos;       /* to BOR */
                n = reclen - recpos;    /* distance to eor, n>=0 */
                if((cursor-n) > 0)
                {       fseek(cf,(long)n,1);  /* find current eor */
                n = reclen - recpos;    /* distance to eor, n>=0 */
                if((cursor-n) > 0)
                {       fseek(cf,(long)n,1);  /* find current eor */
@@ -159,10 +167,7 @@ x_tab()
        while(cursor--)
        {       if(reading)
                {       n = (*getn)();
        while(cursor--)
        {       if(reading)
                {       n = (*getn)();
-                       if(n=='\n')
-                       {       (*ungetn)(n,cf);
-                               return(F_EREREC);
-                       }
+                       if(n=='\n') return(cursor=0);   /* be tolerant */
                        if(n==EOF) return(EOF);
                }
                else    (*putn)(' ');   /* fill in the empty record */
                        if(n==EOF) return(EOF);
                }
                else    (*putn)(' ');   /* fill in the empty record */