xref: /original-bsd/usr.bin/f77/libI77/wsfe.c (revision 2bb802fc)
1 /*
2  * Copyright (c) 1980 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  *
6  *	@(#)wsfe.c	5.3	06/11/86
7  */
8 
9 /*
10  * write sequential formatted external
11  */
12 
13 #include "fio.h"
14 
15 LOCAL char wsfe[] = "write sfe";
16 
17 extern int w_ed(),w_ned();
18 int x_putc(),pr_put(),x_wend(),x_wnew(),x_tab();
19 LOCAL ioflag new;
20 
21 s_wsfe(a) cilist *a;	/*start*/
22 {	int n;
23 	reading = NO;
24 	sequential = YES;
25 	if(n=c_sfe(a,WRITE,SEQ,wsfe)) return(n);
26 	if(curunit->url) err(errflag,F_ERNOSIO,wsfe)
27 	if(!curunit->uwrt && ! nowwriting(curunit)) err(errflag, errno, wsfe)
28 	curunit->uend = NO;
29 	if (curunit->uprnt) putn = pr_put;
30 	else putn = x_putc;
31 	new = YES;
32 	doed= w_ed;
33 	doned= w_ned;
34 	doend = x_wend;
35 	dorevert = donewrec = x_wnew;
36 	dotab = x_tab;
37 	if(pars_f()) err(errflag,F_ERFMT,wsfe)
38 	fmt_bg();
39 	return(OK);
40 }
41 
42 LOCAL
43 x_putc(c)
44 {
45 	if(c=='\n') recpos = reclen = cursor = 0;
46 	else recpos++;
47 	putc(c,cf);
48 	return(OK);
49 }
50 
51 LOCAL
52 pr_put(c)
53 {
54 	if(c=='\n')
55 	{	new = YES;
56 		recpos = reclen = cursor = 0;
57 	}
58 	else if(new)
59 	{	new = NO;
60 		if(c=='0') c = '\n';
61 		else if(c=='1') c = '\f';
62 		else return(OK);
63 	}
64 	else recpos++;
65 	putc(c,cf);
66 	return(OK);
67 }
68 
69 LOCAL
70 x_wnew()
71 {
72 	if(reclen>recpos) fseek(cf,(long)(reclen-recpos),1);
73 	return((*putn)('\n'));
74 }
75 
76 LOCAL
77 x_wend(last) char last;
78 {
79 	if(reclen>recpos) fseek(cf,(long)(reclen-recpos),1);
80 	if(last)
81 		return((*putn)(last));
82 	else
83 		return(OK);
84 }
85 
86 e_wsfe()
87 {	int n;
88 	n=en_fio();
89 	fmtbuf=NULL;
90 	return(n);
91 }
92