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