date and time created 85/01/29 00:38:11 by serge
authorSerge ??? <serge@ucbvax.Berkeley.EDU>
Tue, 29 Jan 1985 16:38:11 +0000 (08:38 -0800)
committerSerge ??? <serge@ucbvax.Berkeley.EDU>
Tue, 29 Jan 1985 16:38:11 +0000 (08:38 -0800)
SCCS-vsn: lib/libc/stdio/findfp.c 1.1

usr/src/lib/libc/stdio/findfp.c [new file with mode: 0644]

diff --git a/usr/src/lib/libc/stdio/findfp.c b/usr/src/lib/libc/stdio/findfp.c
new file mode 100644 (file)
index 0000000..07e04ff
--- /dev/null
@@ -0,0 +1,69 @@
+/* @(#)findfp.c        1.1 (Berkeley) %G% */
+#include "stdio.h"
+
+#define NSTATIC        5       /* stdin, stdout, stderr, plus slack */
+
+extern char *calloc();
+
+static FILE **iov, **iovend;
+static FILE *dummy[NSTATIC];
+
+FILE _iob[NSTATIC] = {
+       { 0, NULL, NULL, NULL, _IOREAD, 0 },            /* stdin  */
+       { 0, NULL, NULL, NULL, _IOWRT, 1 },             /* stdout */
+       { 0, NULL, NULL, NULL, _IOWRT+_IONBF, 2 },      /* stderr */
+};
+
+FILE *
+_findiop()
+{
+       register FILE **iovp;
+       register FILE *fp;
+       register int nfiles;
+       register int i;
+       char *p;
+
+       if (iov == NULL) {
+               nfiles = getdtablesize();
+               if (nfiles > NSTATIC)
+                       p = calloc(1, nfiles * sizeof *iov +
+                                   (nfiles - NSTATIC) * sizeof **iov);
+               else
+                       p = NULL;
+
+               if (p == NULL) {
+                       iov = dummy;
+                       iovend = iov + NSTATIC;
+               } else {
+                       iov = (FILE **)p;
+                       iovend = iov + nfiles;
+
+                       fp = (FILE *)iovend;
+                       for (iovp = iov + NSTATIC; iovp < iovend; /* void */)
+                               *iovp++ = fp++;
+               }
+
+               for (i = 0; i < NSTATIC; i++)
+                       iov[i] = &_iob[i];
+       }
+
+       for (iovp = iov; (*iovp)->_flag & (_IOREAD|_IOWRT|_IORW); /* void */)
+               if (++iovp >= iovend)
+                       return (NULL);
+
+       return (*iovp);
+}
+
+_cleanup()
+{
+       register FILE *_lastbuf = _iob + NSTATIC;
+       register FILE **iovp;
+       register FILE *iop;
+
+       if (iov == NULL)
+               for (iop = _iob; iop < _lastbuf; iop++)
+                       fclose(iop);
+       else
+               for (iovp = iov; iovp < iovend; iovp++)
+                       fclose(*iovp);
+}