Pristine Ack-5.5
[Ack-5.5.git] / lang / cem / libcc.ansi / misc / fdopen.c
1 /*
2  * fdopen - convert a (UNIX) file descriptor into a FILE pointer
3  */
4 /* $Id: fdopen.c,v 1.5 1994/06/24 11:45:09 ceriel Exp $ */
5
6 #include        <stdio.h>
7 #include        <stdlib.h>
8 #include        "../stdio/loc_incl.h"
9
10 FILE *
11 fdopen(int fd, const char *mode)
12 {
13         register int i;
14         FILE *stream;
15         int flags = 0;
16
17         if (fd < 0) return (FILE *)NULL;
18         for (i = 0; __iotab[i] != 0 ; i++) 
19                 if (i >= FOPEN_MAX-1)
20                         return (FILE *)NULL;
21
22         switch(*mode++) {
23         case 'r':
24                 flags |= _IOREAD | _IOREADING;
25                 break;
26         case 'a':
27                 flags |= _IOAPPEND;
28         case 'w':
29                 flags |= _IOWRITE | _IOWRITING;
30                 break;
31         default:
32                 return (FILE *)NULL;
33         }
34         while(*mode) {
35                 switch(*mode++) {
36                 case 'b':
37                         continue;
38                 case '+':
39                         flags |= _IOREAD | _IOWRITE;
40                         continue;
41                 /* The sequence may be followed by aditional characters */
42                 default:
43                         break;
44                 }
45                 break;
46         }
47
48         if ((stream = (FILE *) malloc(sizeof(FILE))) == NULL) {
49                 return (FILE *)NULL;
50         }
51
52         if ((flags & _IOREAD) && (flags & _IOWRITE))
53                 flags &= ~(_IOREADING | _IOWRITING);
54
55         stream->_count = 0;
56         stream->_fd = fd;
57         stream->_flags = flags;
58         stream->_buf = NULL;
59         __iotab[i] = stream;
60         return stream;
61 }