home *** CD-ROM | disk | FTP | other *** search
- /*write sequential formatted external*/
- #include "f2c.h"
- #include "fio.h"
- #include "fmt.h"
- extern int x_putc(),w_ed(),w_ned();
- extern int xw_end(),xw_rev(),x_wSL();
- extern int hiwater;
- integer s_wsfe(a) cilist *a; /*start*/
- { int n;
- if(!init) f_init();
- if(n=c_sfe(a)) return(n);
- reading=0;
- sequential=1;
- formatted=1;
- external=1;
- elist=a;
- hiwater = cursor=recpos=0;
- nonl = 0;
- scale=0;
- fmtbuf=a->cifmt;
- curunit = &units[a->ciunit];
- cf=curunit->ufd;
- if(pars_f(fmtbuf)<0) err(a->cierr,100,"startio");
- putn= x_putc;
- doed= w_ed;
- doned= w_ned;
- doend=xw_end;
- dorevert=xw_rev;
- donewrec=x_wSL;
- fmt_bg();
- cplus=0;
- cblank=curunit->ublnk;
- if(curunit->uwrt != 1 && nowwriting(curunit))
- err(a->cierr,errno,"write start");
- return(0);
- }
- x_putc(c)
- {
- /* this uses \n as an indicator of record-end */
- if(c == '\n' && recpos < hiwater) { /* fseek calls fflush, a loss */
- #ifndef NON_UNIX_STDIO
- if(cf->_ptr + hiwater - recpos < buf_end(cf))
- cf->_ptr += hiwater - recpos;
- else
- #endif
- (void) fseek(cf, (long)(hiwater - recpos), SEEK_CUR);
- }
- putc(c,cf);
- recpos++;
- }
- pr_put(c)
- { static flag new = 1;
- recpos++;
- if(c=='\n')
- { new=1;
- putc(c,cf);
- }
- else if(new==1)
- { new=0;
- if(c=='0') putc('\n',cf);
- else if(c=='1') putc('\f',cf);
- }
- else putc(c,cf);
- }
- x_wSL()
- {
- (*putn)('\n');
- recpos=0;
- cursor = 0;
- hiwater = 0;
- return(1);
- }
- xw_end()
- {
- if(nonl == 0)
- (*putn)('\n');
- hiwater = recpos = cursor = 0;
- return(0);
- }
- xw_rev()
- {
- if(workdone) (*putn)('\n');
- hiwater = recpos = cursor = 0;
- return(workdone=0);
- }
-