xref: /csrg-svn/lib/libc/stdio/findfp.c (revision 21402)
1*21402Sdist /*
2*21402Sdist  * Copyright (c) 1983 Regents of the University of California.
3*21402Sdist  * All rights reserved.  The Berkeley software License Agreement
4*21402Sdist  * specifies the terms and conditions for redistribution.
5*21402Sdist  */
6*21402Sdist 
7*21402Sdist #ifndef lint
8*21402Sdist static char sccsid[] = "@(#)findfp.c	5.1 (Berkeley) 05/30/85";
9*21402Sdist #endif not lint
10*21402Sdist 
1117951Sserge #include <stdio.h>
1217874Sserge 
1318248Sserge #define active(iop)	((iop)->_flag & (_IOREAD|_IOWRT|_IORW))
1417874Sserge 
1518248Sserge #define NSTATIC	3	/* stdin + stdout + stderr */
1617874Sserge 
1717874Sserge FILE _iob[NSTATIC] = {
1818248Sserge 	{ 0, NULL, NULL, 0, _IOREAD,		0 },	/* stdin  */
1918248Sserge 	{ 0, NULL, NULL, 0, _IOWRT,		1 },	/* stdout */
2018248Sserge 	{ 0, NULL, NULL, 0, _IOWRT|_IONBF,	2 },	/* stderr */
2117874Sserge };
2217874Sserge 
2318248Sserge static	FILE	*_lastbuf = _iob + NSTATIC;
2417951Sserge 
2518248Sserge extern	char	*calloc();
2618248Sserge 
2718248Sserge static	FILE	**iobglue;
2818248Sserge static	FILE	**endglue;
2918248Sserge static	int	nfiles;
3018248Sserge 
3117874Sserge FILE *
3217874Sserge _findiop()
3317874Sserge {
3418248Sserge 	register FILE **iov;
3517874Sserge 	register FILE *fp;
3617874Sserge 
3718248Sserge 	if (nfiles <= 0)
3817874Sserge 		nfiles = getdtablesize();
3917874Sserge 
4018248Sserge 	if (iobglue == NULL) {
4118248Sserge 		iobglue = (FILE **)calloc(nfiles, sizeof *iobglue);
4218248Sserge 		if (iobglue == NULL)
4318248Sserge 			return (NULL);
4417951Sserge 
4518248Sserge 		endglue = iobglue + nfiles;
4617874Sserge 
4718248Sserge 		iov = iobglue;
4818248Sserge 		for (fp = _iob; fp < _lastbuf; /* void */)
4918248Sserge 			*iov++ = fp++;
5017874Sserge 	}
5117874Sserge 
5218248Sserge 	iov = iobglue;
5318248Sserge 	while (*iov != NULL && active(*iov))
5418248Sserge 		if (++iov >= endglue)
5517874Sserge 			return (NULL);
5617874Sserge 
5718248Sserge 	if (*iov == NULL)
5818248Sserge 		*iov = (FILE *)calloc(1, sizeof **iov);
5918248Sserge 
6018248Sserge 	return (*iov);
6117874Sserge }
6217874Sserge 
6318248Sserge _fwalk(function)
6418248Sserge 	register int (*function)();
6517874Sserge {
6618248Sserge 	register FILE **iov;
6718248Sserge 	register FILE *fp;
6817874Sserge 
6918248Sserge 	if (function == NULL)
7018248Sserge 		return;
7118248Sserge 
7218248Sserge 	if (iobglue == NULL) {
7318248Sserge 		for (fp = _iob; fp < _lastbuf; fp++)
7418248Sserge 			if (active(fp))
7518248Sserge 				(*function)(fp);
7618248Sserge 	} else {
7718248Sserge 		for (iov = iobglue; iov < endglue; iov++)
7818248Sserge 			if (*iov != NULL && active(*iov))
7918248Sserge 				(*function)(*iov);
8018248Sserge 	}
8117874Sserge }
8217951Sserge 
8318248Sserge _cleanup()
8417951Sserge {
8518248Sserge 	extern int fclose();
8618248Sserge 
8718248Sserge 	_fwalk(fclose);
8817951Sserge }
89