home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / CLIPPER / MISC / EMXLIB8F.ZIP / EMX / LIB / IO / FDOPEN.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-02  |  1.7 KB  |  85 lines

  1. /* fdopen.c (emx+gcc) -- Copyright (c) 1990-1993 by Eberhard Mattes */
  2.  
  3. #include <sys/emx.h>
  4. #include <stdio.h>
  5. #include <fcntl.h>
  6. #include <io.h>
  7. #include <errno.h>
  8.  
  9. /* Bug: doesn't check for compatible modes (O_ACCMODE) */
  10.  
  11. FILE *fdopen (int handle, const char *mode)
  12. {
  13.   char ok, bt;
  14.   FILE *dst;
  15.   int omode;
  16.  
  17.   if (handle < 0 || handle >= _nfiles)
  18.     {
  19.       errno = EBADF;
  20.       return (NULL);
  21.     }
  22.   dst = _newstream ();
  23.   switch (*mode)
  24.     {
  25.     case 'r':
  26.       dst->flags = _IOREAD;
  27.       break;
  28.     case 'w':
  29.       dst->flags = _IOWRT;
  30.       break;
  31.     case 'a':
  32.       dst->flags = _IOWRT;
  33.       break;
  34.     default:
  35.       return (NULL);
  36.     }
  37.   ++mode; ok = TRUE; bt = FALSE; omode = 0;
  38.   while (*mode != 0 && ok)
  39.     {
  40.       switch (*mode)
  41.         {
  42.         case 't':
  43.           if (bt)
  44.             ok = FALSE;
  45.           else
  46.             {
  47.               bt = TRUE;
  48.               omode = O_TEXT;
  49.             }
  50.           break;
  51.         case 'b':
  52.           if (bt)
  53.             ok = FALSE;
  54.           else
  55.             {
  56.               bt = TRUE;
  57.               omode = O_BINARY;
  58.             }
  59.           break;
  60.         case '+':
  61.           if (dst->flags & _IORW)
  62.             ok = FALSE;
  63.           else
  64.             {
  65.               dst->flags &= ~(_IOREAD|_IOWRT);
  66.               dst->flags |= _IORW;
  67.             }
  68.           break;
  69.         default:
  70.           ok = FALSE; break;
  71.         }
  72.       if (ok) ++mode;
  73.     }
  74.   if (bt)
  75.     setmode (handle, omode);
  76.   dst->handle = handle;
  77.   dst->ptr = NULL;
  78.   dst->buffer = NULL;
  79.   dst->rcount = 0;
  80.   dst->wcount = 0;
  81.   dst->flags |= _IOOPEN | _IOBUFNONE;
  82.   dst->flush = _flushstream;
  83.   return (dst);
  84. }
  85.