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