xref: /csrg-svn/lib/libc/stdio/findfp.c (revision 17951)
1*17951Sserge /* @(#)findfp.c	1.2 (Berkeley) 02/13/85 */
2*17951Sserge #include <stdio.h>
317874Sserge 
4*17951Sserge #define NSTATIC	10	/* stdin, stdout, stderr, plus slack */
517874Sserge 
617874Sserge extern char *calloc();
717874Sserge 
817874Sserge static FILE *dummy[NSTATIC];
9*17951Sserge static FILE **iov = NULL;
10*17951Sserge static FILE **iovend;
1117874Sserge 
1217874Sserge FILE _iob[NSTATIC] = {
13*17951Sserge 	{ 0, NULL, NULL, NULL, _IOREAD,		0 },	/* stdin  */
14*17951Sserge 	{ 0, NULL, NULL, NULL, _IOWRT,		1 },	/* stdout */
15*17951Sserge 	{ 0, NULL, NULL, NULL, _IOWRT|_IONBF,	2 },	/* stderr */
1617874Sserge };
1717874Sserge 
18*17951Sserge static char smallbuf[NSTATIC];
19*17951Sserge static char *unbufp = NULL;
20*17951Sserge 
2117874Sserge FILE *
2217874Sserge _findiop()
2317874Sserge {
2417874Sserge 	register FILE **iovp;
2517874Sserge 	register FILE *fp;
2617874Sserge 	register int nfiles;
2717874Sserge 
2817874Sserge 	if (iov == NULL) {
29*17951Sserge 		unbufp	= NULL;
30*17951Sserge 		iov	= NULL;
31*17951Sserge 		fp	= NULL;
32*17951Sserge 
3317874Sserge 		nfiles = getdtablesize();
34*17951Sserge 		if (nfiles > NSTATIC) {
35*17951Sserge 			fp = (FILE *)calloc(nfiles - NSTATIC, sizeof *fp);
36*17951Sserge 			if (fp != NULL) {
37*17951Sserge 				iov = (FILE **)calloc(nfiles, sizeof *iov);
38*17951Sserge 				if (iov != NULL)
39*17951Sserge 					unbufp = calloc(nfiles, sizeof *unbufp);
40*17951Sserge 			}
41*17951Sserge 		}
4217874Sserge 
43*17951Sserge 		if (unbufp != NULL) {
4417874Sserge 			iovend = iov + nfiles;
4517874Sserge 			for (iovp = iov + NSTATIC; iovp < iovend; /* void */)
4617874Sserge 				*iovp++ = fp++;
47*17951Sserge 		} else {
48*17951Sserge 			if (fp != NULL) {
49*17951Sserge 				free((char *)fp);
50*17951Sserge 				if (iov != NULL)
51*17951Sserge 					free((char *)iov);
52*17951Sserge 			}
53*17951Sserge 
54*17951Sserge 			iovend	= dummy + NSTATIC;
55*17951Sserge 			iov	= dummy;
5617874Sserge 		}
5717874Sserge 
58*17951Sserge 		iovp = iov;
59*17951Sserge 		for (fp = _iob; fp < _iob + NSTATIC; /* void */)
60*17951Sserge 			*iovp++ = fp++;
6117874Sserge 	}
6217874Sserge 
6317874Sserge 	for (iovp = iov; (*iovp)->_flag & (_IOREAD|_IOWRT|_IORW); /* void */)
6417874Sserge 		if (++iovp >= iovend)
6517874Sserge 			return (NULL);
6617874Sserge 
6717874Sserge 	return (*iovp);
6817874Sserge }
6917874Sserge 
7017874Sserge _cleanup()
7117874Sserge {
7217874Sserge 	register FILE *_lastbuf = _iob + NSTATIC;
7317874Sserge 	register FILE **iovp;
7417874Sserge 	register FILE *iop;
7517874Sserge 
7617874Sserge 	if (iov == NULL)
7717874Sserge 		for (iop = _iob; iop < _lastbuf; iop++)
7817874Sserge 			fclose(iop);
7917874Sserge 	else
8017874Sserge 		for (iovp = iov; iovp < iovend; iovp++)
8117874Sserge 			fclose(*iovp);
8217874Sserge }
83*17951Sserge 
84*17951Sserge char *
85*17951Sserge _smallbuf(iop)
86*17951Sserge 	register FILE *iop;
87*17951Sserge {
88*17951Sserge 	if (unbufp == NULL)
89*17951Sserge 		return (&smallbuf[iop - _iob]);
90*17951Sserge 	else
91*17951Sserge 		return (&unbufp[fileno(iop)]);
92*17951Sserge }
93