xref: /csrg-svn/lib/libc/stdio/findfp.c (revision 18248)
1*18248Sserge /* @(#)findfp.c	1.3 (Berkeley) 03/04/85 */
217951Sserge #include <stdio.h>
317874Sserge 
4*18248Sserge #define active(iop)	((iop)->_flag & (_IOREAD|_IOWRT|_IORW))
517874Sserge 
6*18248Sserge #define NSTATIC	3	/* stdin + stdout + stderr */
717874Sserge 
817874Sserge FILE _iob[NSTATIC] = {
9*18248Sserge 	{ 0, NULL, NULL, 0, _IOREAD,		0 },	/* stdin  */
10*18248Sserge 	{ 0, NULL, NULL, 0, _IOWRT,		1 },	/* stdout */
11*18248Sserge 	{ 0, NULL, NULL, 0, _IOWRT|_IONBF,	2 },	/* stderr */
1217874Sserge };
1317874Sserge 
14*18248Sserge static	FILE	*_lastbuf = _iob + NSTATIC;
1517951Sserge 
16*18248Sserge extern	char	*calloc();
17*18248Sserge 
18*18248Sserge static	FILE	**iobglue;
19*18248Sserge static	FILE	**endglue;
20*18248Sserge static	int	nfiles;
21*18248Sserge 
2217874Sserge FILE *
2317874Sserge _findiop()
2417874Sserge {
25*18248Sserge 	register FILE **iov;
2617874Sserge 	register FILE *fp;
2717874Sserge 
28*18248Sserge 	if (nfiles <= 0)
2917874Sserge 		nfiles = getdtablesize();
3017874Sserge 
31*18248Sserge 	if (iobglue == NULL) {
32*18248Sserge 		iobglue = (FILE **)calloc(nfiles, sizeof *iobglue);
33*18248Sserge 		if (iobglue == NULL)
34*18248Sserge 			return (NULL);
3517951Sserge 
36*18248Sserge 		endglue = iobglue + nfiles;
3717874Sserge 
38*18248Sserge 		iov = iobglue;
39*18248Sserge 		for (fp = _iob; fp < _lastbuf; /* void */)
40*18248Sserge 			*iov++ = fp++;
4117874Sserge 	}
4217874Sserge 
43*18248Sserge 	iov = iobglue;
44*18248Sserge 	while (*iov != NULL && active(*iov))
45*18248Sserge 		if (++iov >= endglue)
4617874Sserge 			return (NULL);
4717874Sserge 
48*18248Sserge 	if (*iov == NULL)
49*18248Sserge 		*iov = (FILE *)calloc(1, sizeof **iov);
50*18248Sserge 
51*18248Sserge 	return (*iov);
5217874Sserge }
5317874Sserge 
54*18248Sserge _fwalk(function)
55*18248Sserge 	register int (*function)();
5617874Sserge {
57*18248Sserge 	register FILE **iov;
58*18248Sserge 	register FILE *fp;
5917874Sserge 
60*18248Sserge 	if (function == NULL)
61*18248Sserge 		return;
62*18248Sserge 
63*18248Sserge 	if (iobglue == NULL) {
64*18248Sserge 		for (fp = _iob; fp < _lastbuf; fp++)
65*18248Sserge 			if (active(fp))
66*18248Sserge 				(*function)(fp);
67*18248Sserge 	} else {
68*18248Sserge 		for (iov = iobglue; iov < endglue; iov++)
69*18248Sserge 			if (*iov != NULL && active(*iov))
70*18248Sserge 				(*function)(*iov);
71*18248Sserge 	}
7217874Sserge }
7317951Sserge 
74*18248Sserge _cleanup()
7517951Sserge {
76*18248Sserge 	extern int fclose();
77*18248Sserge 
78*18248Sserge 	_fwalk(fclose);
7917951Sserge }
80