xref: /csrg-svn/lib/libc/stdio/findfp.c (revision 17874)
1*17874Sserge /* @(#)findfp.c	1.1 (Berkeley) 01/29/85 */
2*17874Sserge #include "stdio.h"
3*17874Sserge 
4*17874Sserge #define NSTATIC	5	/* stdin, stdout, stderr, plus slack */
5*17874Sserge 
6*17874Sserge extern char *calloc();
7*17874Sserge 
8*17874Sserge static FILE **iov, **iovend;
9*17874Sserge static FILE *dummy[NSTATIC];
10*17874Sserge 
11*17874Sserge FILE _iob[NSTATIC] = {
12*17874Sserge 	{ 0, NULL, NULL, NULL, _IOREAD, 0 },		/* stdin  */
13*17874Sserge 	{ 0, NULL, NULL, NULL, _IOWRT, 1 },		/* stdout */
14*17874Sserge 	{ 0, NULL, NULL, NULL, _IOWRT+_IONBF, 2 },	/* stderr */
15*17874Sserge };
16*17874Sserge 
17*17874Sserge FILE *
18*17874Sserge _findiop()
19*17874Sserge {
20*17874Sserge 	register FILE **iovp;
21*17874Sserge 	register FILE *fp;
22*17874Sserge 	register int nfiles;
23*17874Sserge 	register int i;
24*17874Sserge 	char *p;
25*17874Sserge 
26*17874Sserge 	if (iov == NULL) {
27*17874Sserge 		nfiles = getdtablesize();
28*17874Sserge 		if (nfiles > NSTATIC)
29*17874Sserge 			p = calloc(1, nfiles * sizeof *iov +
30*17874Sserge 				    (nfiles - NSTATIC) * sizeof **iov);
31*17874Sserge 		else
32*17874Sserge 			p = NULL;
33*17874Sserge 
34*17874Sserge 		if (p == NULL) {
35*17874Sserge 			iov = dummy;
36*17874Sserge 			iovend = iov + NSTATIC;
37*17874Sserge 		} else {
38*17874Sserge 			iov = (FILE **)p;
39*17874Sserge 			iovend = iov + nfiles;
40*17874Sserge 
41*17874Sserge 			fp = (FILE *)iovend;
42*17874Sserge 			for (iovp = iov + NSTATIC; iovp < iovend; /* void */)
43*17874Sserge 				*iovp++ = fp++;
44*17874Sserge 		}
45*17874Sserge 
46*17874Sserge 		for (i = 0; i < NSTATIC; i++)
47*17874Sserge 			iov[i] = &_iob[i];
48*17874Sserge 	}
49*17874Sserge 
50*17874Sserge 	for (iovp = iov; (*iovp)->_flag & (_IOREAD|_IOWRT|_IORW); /* void */)
51*17874Sserge 		if (++iovp >= iovend)
52*17874Sserge 			return (NULL);
53*17874Sserge 
54*17874Sserge 	return (*iovp);
55*17874Sserge }
56*17874Sserge 
57*17874Sserge _cleanup()
58*17874Sserge {
59*17874Sserge 	register FILE *_lastbuf = _iob + NSTATIC;
60*17874Sserge 	register FILE **iovp;
61*17874Sserge 	register FILE *iop;
62*17874Sserge 
63*17874Sserge 	if (iov == NULL)
64*17874Sserge 		for (iop = _iob; iop < _lastbuf; iop++)
65*17874Sserge 			fclose(iop);
66*17874Sserge 	else
67*17874Sserge 		for (iovp = iov; iovp < iovend; iovp++)
68*17874Sserge 			fclose(*iovp);
69*17874Sserge }
70