home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************
- *
- * $Source: /unixb/home/unixlib/source/unixlib37/src/stdio/c/RCS/fopen,v $
- * $Date: 1996/11/06 22:01:42 $
- * $Revision: 1.3 $
- * $State: Rel $
- * $Author: unixlib $
- *
- * $Log: fopen,v $
- * Revision 1.3 1996/11/06 22:01:42 unixlib
- * Yet more changes by NB, PB and SC.
- *
- * Revision 1.2 1996/05/06 09:01:34 unixlib
- * Updates to sources made by Nick Burrett, Peter Burwood and Simon Callan.
- * Saved for 3.7a release.
- *
- * Revision 1.1 1996/04/19 21:32:42 simon
- * Initial revision
- *
- ***************************************************************************/
-
- static const char rcs_id[] = "$Id: fopen,v 1.3 1996/11/06 22:01:42 unixlib Rel $";
-
- #include <errno.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <fcntl.h>
-
- #define OPERM 0666 /* open() permission */
-
- #ifndef O_OMASK
- #define O_OMASK (O_RDONLY|O_WRONLY|O_RDWR)
- #endif
-
- __STDIOLIB__
-
- static FILE *__fopen (const char *, const char *, FILE *);
- static FILE *__fdopen (int, int, FILE *);
-
- FILE *
- fopen (register const char *file, register const char *mode)
- {
- register FILE *f;
- register int i;
-
- for (i = 0, f = __iob; i < FOPEN_MAX; i++, f++)
- if (!fisopen (f))
- return (__fopen (file, mode, f));
- return (0);
- }
-
- FILE *
- freopen (register const char *file, register const char *mode,
- register FILE * f)
- {
- if (fisopen (f))
- if (fclose (f))
- return (0);
- return (__fopen (file, mode, f));
- }
-
- FILE *
- fdopen (register int fd, register const char *mode)
- {
- register FILE *f;
- register int flag, i;
-
- for (i = 0, f = __iob; i < FOPEN_MAX; i++, f++)
- if (!fisopen (f))
- goto open;
- return (0);
-
- open:i = *mode;
-
- if (i == 'r')
- flag = _IOREAD;
- else if (i == 'w')
- flag = _IOWRITE;
- else if (i == 'a')
- flag = _IOWRITE | _IOAPPEND;
- else
- return (0);
-
- if (i = *++mode)
- while (i)
- {
- if (i == '+')
- flag |= _IOREAD | _IOWRITE;
- i = *++mode;
- }
-
- return (__fdopen (fd, flag, f));
- }
-
- static FILE *
- __fopen (register const char *file, register const char *mode,
- register FILE * f)
- {
- register int flag, oflag, i;
-
- i = *mode;
-
- if (i == 'r')
- {
- flag = _IOREAD;
- oflag = O_RDONLY;
- }
- else if (i == 'w')
- {
- flag = _IOWRITE;
- oflag = O_WRONLY | O_CREAT | O_TRUNC;
- }
- else if (i == 'a')
- {
- flag = _IOWRITE | _IOAPPEND;
- oflag = O_WRONLY | O_CREAT;
- }
- else
- return (0);
-
- if (i = *++mode)
- while (i)
- {
- if (i == 'b')
- oflag |= O_BINARY;
- else if (i == '+')
- {
- flag |= _IOREAD | _IOWRITE;
- oflag = (oflag & (~(O_OMASK | O_TRUNC))) | O_RDWR;
- }
- i = *++mode;
- }
-
- if ((i = open ((char *) file, oflag, OPERM)) < 0)
- return (0);
-
- return (__fdopen (i, flag, f));
- }
-
- static FILE *
- __fdopen (register int fd, register int flag, register FILE * f)
- {
- /* Set the magic word for this FILE struct. */
- f->__magic = _IOMAGIC;
- f->i_ptr = f->i_base = 0;
- f->o_ptr = f->o_base = 0;
- f->i_cnt = f->o_cnt = 0;
- if (isatty (f->fd = fd))
- {
- f->pos = 0;
- flag |= _IOTTY;
- f->flag = (flag & _IOBF) ? flag : (flag | _IOLBF);
- }
- else
- {
- if (flag & _IOAPPEND)
- f->pos = (fpos_t) lseek (fd, 0L, 2);
- else
- f->pos = (fpos_t) lseek (fd, 0L, 0);
- f->flag = (flag & _IOBF) ? flag : (flag | _IOFBF);
- }
- f->bufsiz = BUFSIZ;
-
- return (f);
- }
-