home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / unixlib36d / src / stdio / c / fopen < prev    next >
Text File  |  1994-03-08  |  3KB  |  150 lines

  1. static char sccs_id[] = "@(#) fopen.c 3.0 " __DATE__ " HJR";
  2.  
  3. /* fopen.c (c) Copyright 1990 H.Rogers */
  4.  
  5. #include <errno.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8.  
  9. #include "fcntl.h"
  10.  
  11. extern int isatty (int);
  12. extern int open (char *, int, int);
  13. extern long lseek (int, long, int);
  14.  
  15. #define OPERM 0666        /* open() permission */
  16.  
  17. #ifndef O_OMASK
  18. #define O_OMASK (O_RDONLY|O_WRONLY|O_RDWR)
  19. #endif
  20.  
  21. __STDIOLIB__
  22.  
  23. static FILE *__fopen (const char *, const char *, FILE *);
  24. static FILE *__fdopen (int, int, FILE *);
  25.  
  26. FILE *
  27. fopen (register const char *file, register const char *mode)
  28. {
  29.   register FILE *f;
  30.   register int i;
  31.  
  32.   for (i = 0, f = __iob; i < FOPEN_MAX; i++, f++)
  33.     if (!fisopen (f))
  34.       return (__fopen (file, mode, f));
  35.   return (0);
  36. }
  37.  
  38. FILE *
  39. freopen (register const char *file, register const char *mode,
  40.      register FILE * f)
  41. {
  42.   if (fisopen (f))
  43.     if (fclose (f))
  44.       return (0);
  45.   return (__fopen (file, mode, f));
  46. }
  47.  
  48. FILE *
  49. fdopen (register int fd, register const char *mode)
  50. {
  51.   register FILE *f;
  52.   register int flag, i;
  53.  
  54.   for (i = 0, f = __iob; i < FOPEN_MAX; i++, f++)
  55.     if (!fisopen (f))
  56.       goto open;
  57.   return (0);
  58.  
  59. open:i = *mode;
  60.  
  61.   if (i == 'r')
  62.     flag = _IOREAD;
  63.   else if (i == 'w')
  64.     flag = _IOWRITE;
  65.   else if (i == 'a')
  66.     flag = _IOWRITE | _IOAPPEND;
  67.   else
  68.     return (0);
  69.  
  70.   if (i = *++mode)
  71.     while (i)
  72.       {
  73.     if (i == '+')
  74.       flag |= _IOREAD | _IOWRITE;
  75.     i = *++mode;
  76.       }
  77.  
  78.   return (__fdopen (fd, flag, f));
  79. }
  80.  
  81. static FILE *
  82. __fopen (register const char *file, register const char *mode,
  83.      register FILE * f)
  84. {
  85.   register int flag, oflag, i;
  86.  
  87.   i = *mode;
  88.  
  89.   if (i == 'r')
  90.     {
  91.       flag = _IOREAD;
  92.       oflag = O_RDONLY;
  93.     }
  94.   else if (i == 'w')
  95.     {
  96.       flag = _IOWRITE;
  97.       oflag = O_WRONLY | O_CREAT | O_TRUNC;
  98.     }
  99.   else if (i == 'a')
  100.     {
  101.       flag = _IOWRITE | _IOAPPEND;
  102.       oflag = O_WRONLY | O_CREAT;
  103.     }
  104.   else
  105.     return (0);
  106.  
  107.   if (i = *++mode)
  108.     while (i)
  109.       {
  110.     if (i == 'b')
  111.       oflag |= O_BINARY;
  112.     else if (i == '+')
  113.       {
  114.         flag |= _IOREAD | _IOWRITE;
  115.         oflag = (oflag & (~(O_OMASK | O_TRUNC))) | O_RDWR;
  116.       }
  117.     i = *++mode;
  118.       }
  119.  
  120.   if ((i = open ((char *) file, oflag, OPERM)) < 0)
  121.     return (0);
  122.  
  123.   return (__fdopen (i, flag, f));
  124. }
  125.  
  126. static FILE *
  127. __fdopen (register int fd, register int flag, register FILE * f)
  128. {
  129.   f->i_ptr = f->i_base = 0;
  130.   f->o_ptr = f->o_base = 0;
  131.   f->i_cnt = f->o_cnt = 0;
  132.   if (isatty (f->fd = fd))
  133.     {
  134.       f->pos = 0;
  135.       flag |= _IOTTY;
  136.       f->flag = (flag & _IOBF) ? flag : (flag | _IOLBF);
  137.     }
  138.   else
  139.     {
  140.       if (flag & _IOAPPEND)
  141.     f->pos = (fpos_t) lseek (fd, 0L, 2);
  142.       else
  143.     f->pos = (fpos_t) lseek (fd, 0L, 0);
  144.       f->flag = (flag & _IOBF) ? flag : (flag | _IOFBF);
  145.     }
  146.   f->bufsiz = BUFSIZ;
  147.  
  148.   return (f);
  149. }
  150.