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