xref: /original-bsd/local/toolchest/ksh/sh/stdio.c (revision dd0a3d53)
1*dd0a3d53Smarc /*
2*dd0a3d53Smarc 
3*dd0a3d53Smarc  *      Copyright (c) 1984, 1985, 1986 AT&T
4*dd0a3d53Smarc  *      All Rights Reserved
5*dd0a3d53Smarc 
6*dd0a3d53Smarc  *      THIS IS UNPUBLISHED PROPRIETARY SOURCE
7*dd0a3d53Smarc  *      CODE OF AT&T.
8*dd0a3d53Smarc  *      The copyright notice above does not
9*dd0a3d53Smarc  *      evidence any actual or intended
10*dd0a3d53Smarc  *      publication of such source code.
11*dd0a3d53Smarc 
12*dd0a3d53Smarc  */
13*dd0a3d53Smarc /* @(#)stdio.c	1.1 */
14*dd0a3d53Smarc /*
15*dd0a3d53Smarc  * adapted for ksh from System V stdio library
16*dd0a3d53Smarc  */
17*dd0a3d53Smarc #include <stdio.h>
18*dd0a3d53Smarc 
19*dd0a3d53Smarc #ifndef _IOLBF
20*dd0a3d53Smarc #define _IOLBF	0400
21*dd0a3d53Smarc #endif
22*dd0a3d53Smarc 
23*dd0a3d53Smarc 
24*dd0a3d53Smarc 
25*dd0a3d53Smarc extern long lseek();
26*dd0a3d53Smarc extern int fflush();
27*dd0a3d53Smarc 
28*dd0a3d53Smarc #ifdef VENIX
29*dd0a3d53Smarc #define unsigned
30*dd0a3d53Smarc #endif	/* VENIX */
31*dd0a3d53Smarc 
32*dd0a3d53Smarc #ifdef BSD
33*dd0a3d53Smarc #define unsigned
34*dd0a3d53Smarc #endif	/* BSD */
35*dd0a3d53Smarc 
36*dd0a3d53Smarc extern unsigned char _sobuf[];
37*dd0a3d53Smarc 
38*dd0a3d53Smarc int
fseek(iop,offset,ptrname)39*dd0a3d53Smarc fseek(iop, offset, ptrname)
40*dd0a3d53Smarc register FILE *iop;
41*dd0a3d53Smarc long	offset;
42*dd0a3d53Smarc register int	ptrname;
43*dd0a3d53Smarc {
44*dd0a3d53Smarc 	register int c;
45*dd0a3d53Smarc 	long	p;
46*dd0a3d53Smarc 
47*dd0a3d53Smarc 	iop->_flag &= ~_IOEOF;
48*dd0a3d53Smarc 	if(iop->_flag & _IOREAD)
49*dd0a3d53Smarc 	{
50*dd0a3d53Smarc 		if(ptrname < 2 && iop->_base && !(iop->_flag&_IONBF))
51*dd0a3d53Smarc 		{
52*dd0a3d53Smarc 			c = iop->_cnt;
53*dd0a3d53Smarc 			p = offset;
54*dd0a3d53Smarc 			if(ptrname == 0)
55*dd0a3d53Smarc 				p += (long)c-lseek(fileno(iop), 0L, 1);
56*dd0a3d53Smarc 			else
57*dd0a3d53Smarc 				offset -= (long)c;
58*dd0a3d53Smarc 			if(!(iop->_flag&_IORW) && c > 0 && p <= c &&
59*dd0a3d53Smarc 					p >= iop->_base - iop->_ptr)
60*dd0a3d53Smarc 			{
61*dd0a3d53Smarc 				iop->_ptr += (int)p;
62*dd0a3d53Smarc 				iop->_cnt -= (int)p;
63*dd0a3d53Smarc 				return(0);
64*dd0a3d53Smarc 			}
65*dd0a3d53Smarc 		}
66*dd0a3d53Smarc 		if(iop->_flag & _IORW)
67*dd0a3d53Smarc 		{
68*dd0a3d53Smarc 			iop->_ptr = iop->_base;
69*dd0a3d53Smarc 			iop->_flag &= ~_IOREAD;
70*dd0a3d53Smarc 		}
71*dd0a3d53Smarc 		p = lseek(fileno(iop), offset, ptrname);
72*dd0a3d53Smarc 		iop->_cnt = 0;
73*dd0a3d53Smarc 	}
74*dd0a3d53Smarc 	else if(iop->_flag & (_IOWRT | _IORW))
75*dd0a3d53Smarc 	{
76*dd0a3d53Smarc 		(void) fflush(iop);
77*dd0a3d53Smarc 		if(iop->_flag & _IORW)
78*dd0a3d53Smarc 		{
79*dd0a3d53Smarc 			iop->_cnt = 0;
80*dd0a3d53Smarc 			iop->_flag &= ~_IOWRT;
81*dd0a3d53Smarc 			iop->_ptr = iop->_base;
82*dd0a3d53Smarc 		}
83*dd0a3d53Smarc 		p = lseek(fileno(iop), offset, ptrname);
84*dd0a3d53Smarc 	}
85*dd0a3d53Smarc 	return((p == -1)? -1: 0);
86*dd0a3d53Smarc }
87*dd0a3d53Smarc 
88*dd0a3d53Smarc void
setbuf(iop,buf)89*dd0a3d53Smarc setbuf(iop, buf)
90*dd0a3d53Smarc register FILE *iop;
91*dd0a3d53Smarc char	*buf;
92*dd0a3d53Smarc {
93*dd0a3d53Smarc 	register int fno = fileno(iop);  /* file number */
94*dd0a3d53Smarc 
95*dd0a3d53Smarc 	if(iop->_base != NULL && iop->_flag & _IOMYBUF)
96*dd0a3d53Smarc 		free((char*)iop->_base);
97*dd0a3d53Smarc 	iop->_flag &= ~(_IOMYBUF | _IONBF | _IOLBF);
98*dd0a3d53Smarc 	if((iop->_base = (unsigned char*)buf) == NULL)
99*dd0a3d53Smarc 	{
100*dd0a3d53Smarc 		iop->_flag |= _IONBF;
101*dd0a3d53Smarc 	}
102*dd0a3d53Smarc 	iop->_ptr = iop->_base;
103*dd0a3d53Smarc 	iop->_cnt = 0;
104*dd0a3d53Smarc }
105*dd0a3d53Smarc 
106*dd0a3d53Smarc char	*malloc();
107*dd0a3d53Smarc 
_flsbuf(c,iop)108*dd0a3d53Smarc _flsbuf(c, iop)
109*dd0a3d53Smarc register FILE *iop;
110*dd0a3d53Smarc {
111*dd0a3d53Smarc 	register unsigned char *base;
112*dd0a3d53Smarc 	register n, rn;
113*dd0a3d53Smarc 	char c1;
114*dd0a3d53Smarc 
115*dd0a3d53Smarc 	if (iop->_flag & _IORW)
116*dd0a3d53Smarc 	{
117*dd0a3d53Smarc 		iop->_flag |= _IOWRT;
118*dd0a3d53Smarc 		iop->_flag &= ~(_IOEOF|_IOREAD);
119*dd0a3d53Smarc 	}
120*dd0a3d53Smarc 
121*dd0a3d53Smarc 	if ((iop->_flag&_IOWRT)==0)
122*dd0a3d53Smarc 		return(EOF);
123*dd0a3d53Smarc tryagain:
124*dd0a3d53Smarc 	if (iop->_flag&_IONBF)
125*dd0a3d53Smarc 	{
126*dd0a3d53Smarc 		c1 = c;
127*dd0a3d53Smarc 		rn = 1;
128*dd0a3d53Smarc 		n = write(fileno(iop), &c1, rn);
129*dd0a3d53Smarc 		iop->_cnt = 0;
130*dd0a3d53Smarc 	}
131*dd0a3d53Smarc 	else
132*dd0a3d53Smarc 	{
133*dd0a3d53Smarc 		if ((base=iop->_base)==NULL)
134*dd0a3d53Smarc 		{
135*dd0a3d53Smarc 			if (iop==stdout)
136*dd0a3d53Smarc 			{
137*dd0a3d53Smarc 				if (isatty(fileno(stdout)))
138*dd0a3d53Smarc 					iop->_flag |= _IOLBF;
139*dd0a3d53Smarc 				iop->_base = _sobuf;
140*dd0a3d53Smarc 				iop->_ptr = _sobuf;
141*dd0a3d53Smarc 				goto tryagain;
142*dd0a3d53Smarc 			}
143*dd0a3d53Smarc 			if ((iop->_base=base=(unsigned char*)malloc(BUFSIZ)) == NULL)
144*dd0a3d53Smarc 			{
145*dd0a3d53Smarc 				iop->_flag |= _IONBF;
146*dd0a3d53Smarc 				goto tryagain;
147*dd0a3d53Smarc 			}
148*dd0a3d53Smarc 			iop->_flag |= _IOMYBUF;
149*dd0a3d53Smarc 			rn = n = 0;
150*dd0a3d53Smarc 		}
151*dd0a3d53Smarc 		else if ((rn = n = iop->_ptr - base) > 0)
152*dd0a3d53Smarc 		{
153*dd0a3d53Smarc 			iop->_ptr = base;
154*dd0a3d53Smarc 			n = write(fileno(iop), base, n);
155*dd0a3d53Smarc 		}
156*dd0a3d53Smarc 		iop->_cnt = BUFSIZ-1;
157*dd0a3d53Smarc 		*base++ = c;
158*dd0a3d53Smarc 		iop->_ptr = base;
159*dd0a3d53Smarc 	}
160*dd0a3d53Smarc 	if (rn != n)
161*dd0a3d53Smarc 	{
162*dd0a3d53Smarc 		iop->_flag |= _IOERR;
163*dd0a3d53Smarc 		return(EOF);
164*dd0a3d53Smarc 	}
165*dd0a3d53Smarc 	return(c);
166*dd0a3d53Smarc }
167*dd0a3d53Smarc 
fflush(iop)168*dd0a3d53Smarc fflush(iop)
169*dd0a3d53Smarc register FILE *iop;
170*dd0a3d53Smarc {
171*dd0a3d53Smarc 	register unsigned char *base;
172*dd0a3d53Smarc 	register n;
173*dd0a3d53Smarc 
174*dd0a3d53Smarc 	if ((iop->_flag&(_IONBF|_IOWRT))==_IOWRT
175*dd0a3d53Smarc 	 && (base=iop->_base)!=NULL && (n=iop->_ptr-base)>0)
176*dd0a3d53Smarc 	{
177*dd0a3d53Smarc 		iop->_ptr = base;
178*dd0a3d53Smarc 		iop->_cnt = (iop->_flag&(_IOLBF|_IONBF)) ? 0 : BUFSIZ;
179*dd0a3d53Smarc 		if (write(fileno(iop), base, n)!=n)
180*dd0a3d53Smarc 		{
181*dd0a3d53Smarc 			iop->_flag |= _IOERR;
182*dd0a3d53Smarc 			return(EOF);
183*dd0a3d53Smarc 		}
184*dd0a3d53Smarc 	}
185*dd0a3d53Smarc 	return(0);
186*dd0a3d53Smarc }
187*dd0a3d53Smarc 
188*dd0a3d53Smarc /*
189*dd0a3d53Smarc  * Flush buffers on exit
190*dd0a3d53Smarc  */
191*dd0a3d53Smarc 
exit(n)192*dd0a3d53Smarc exit(n)
193*dd0a3d53Smarc {
194*dd0a3d53Smarc 	register FILE *iop;
195*dd0a3d53Smarc 
196*dd0a3d53Smarc 	for (iop = _iob; iop < _iob+_NFILE; iop++)
197*dd0a3d53Smarc 		fclose(iop);
198*dd0a3d53Smarc 	_exit(n);
199*dd0a3d53Smarc }
200*dd0a3d53Smarc 
fclose(iop)201*dd0a3d53Smarc fclose(iop)
202*dd0a3d53Smarc 	register FILE *iop;
203*dd0a3d53Smarc {
204*dd0a3d53Smarc 	register int r;
205*dd0a3d53Smarc 
206*dd0a3d53Smarc 	r = EOF;
207*dd0a3d53Smarc 	if (iop->_flag&(_IOREAD|_IOWRT|_IORW))
208*dd0a3d53Smarc 	{
209*dd0a3d53Smarc 		r = fflush(iop);
210*dd0a3d53Smarc 		if (close(fileno(iop)) < 0)
211*dd0a3d53Smarc 			r = EOF;
212*dd0a3d53Smarc 		if (iop->_flag&_IOMYBUF)
213*dd0a3d53Smarc 			free(iop->_base);
214*dd0a3d53Smarc 	}
215*dd0a3d53Smarc 	iop->_cnt = 0;
216*dd0a3d53Smarc 	iop->_base = NULL;
217*dd0a3d53Smarc 	iop->_ptr = NULL;
218*dd0a3d53Smarc 	iop->_flag = 0;
219*dd0a3d53Smarc 	iop->_file = 0;
220*dd0a3d53Smarc 	return(r);
221*dd0a3d53Smarc }
222*dd0a3d53Smarc 
223*dd0a3d53Smarc #ifndef INT16
224*dd0a3d53Smarc /*
225*dd0a3d53Smarc  * special version of fread for to save space
226*dd0a3d53Smarc  * only works if count is 1
227*dd0a3d53Smarc  * code active in io.c when INT16 is on
228*dd0a3d53Smarc  */
229*dd0a3d53Smarc 
fread(ptr,size,count,iop)230*dd0a3d53Smarc fread(ptr,size,count,iop)
231*dd0a3d53Smarc register char *ptr;
232*dd0a3d53Smarc int size,count;
233*dd0a3d53Smarc register FILE *iop;
234*dd0a3d53Smarc {
235*dd0a3d53Smarc 	register int c;
236*dd0a3d53Smarc 	do
237*dd0a3d53Smarc 	{
238*dd0a3d53Smarc 		if((c=getc(iop))>=0)
239*dd0a3d53Smarc 			*ptr++ = c;
240*dd0a3d53Smarc 		else
241*dd0a3d53Smarc 			return(0);
242*dd0a3d53Smarc 	}
243*dd0a3d53Smarc 	while(--size);
244*dd0a3d53Smarc 	return(1);
245*dd0a3d53Smarc }
246*dd0a3d53Smarc #endif	/* INT16 */
247*dd0a3d53Smarc 
248*dd0a3d53Smarc #ifndef VSH
249*dd0a3d53Smarc #ifndef ESH
_filbuf(iop)250*dd0a3d53Smarc int	_filbuf(iop)
251*dd0a3d53Smarc register FILE *iop;
252*dd0a3d53Smarc {
253*dd0a3d53Smarc 	unsigned char cc;
254*dd0a3d53Smarc 
255*dd0a3d53Smarc 	if (iop->_flag & _IORW)
256*dd0a3d53Smarc 		iop->_flag |= _IOREAD;
257*dd0a3d53Smarc 
258*dd0a3d53Smarc 	if ((iop->_flag&_IOREAD) == 0)
259*dd0a3d53Smarc 		return(EOF);
260*dd0a3d53Smarc 	p_flush();
261*dd0a3d53Smarc 	if((iop->_flag&_IONBF)||iop->_base==NULL)
262*dd0a3d53Smarc 	{
263*dd0a3d53Smarc 		/* unbuffered reads needed for pipes */
264*dd0a3d53Smarc 		iop->_cnt = read(fileno(iop),(char*)(&cc),1);
265*dd0a3d53Smarc 		if(iop->_cnt>0)
266*dd0a3d53Smarc 			{
267*dd0a3d53Smarc 				iop->_cnt--;
268*dd0a3d53Smarc 				return(cc);
269*dd0a3d53Smarc 			}
270*dd0a3d53Smarc 		goto skip;
271*dd0a3d53Smarc 	}
272*dd0a3d53Smarc 	iop->_cnt = read(fileno(iop), (char*)iop->_base, BUFSIZ);
273*dd0a3d53Smarc 	iop->_ptr = iop->_base;
274*dd0a3d53Smarc skip:
275*dd0a3d53Smarc 	if (--iop->_cnt < 0)
276*dd0a3d53Smarc 	{
277*dd0a3d53Smarc 		if (iop->_cnt == -1)
278*dd0a3d53Smarc 		{
279*dd0a3d53Smarc 			iop->_flag |= _IOEOF;
280*dd0a3d53Smarc 			if (iop->_flag & _IORW)
281*dd0a3d53Smarc 				iop->_flag &= ~_IOREAD;
282*dd0a3d53Smarc 		}
283*dd0a3d53Smarc 		else
284*dd0a3d53Smarc 			iop->_flag |= _IOERR;
285*dd0a3d53Smarc 		iop->_cnt = 0;
286*dd0a3d53Smarc 		return(EOF);
287*dd0a3d53Smarc 	}
288*dd0a3d53Smarc 	return(*iop->_ptr++&0377);
289*dd0a3d53Smarc }
290*dd0a3d53Smarc #endif /* ESH */
291*dd0a3d53Smarc #endif /* VSH */
292