85 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			85 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);
 | 
						|
}
 |