ack/lang/fortran/lib/libI77/wsfe.c
1991-10-07 16:59:33 +00:00

86 lines
1.5 KiB
C

/*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);
}