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