home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
zip
/
mint
/
mntlib16.lzh
/
MNTLIB16
/
FDOPEN.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-03
|
1KB
|
69 lines
/* from Dale Schumacher's dLibs */
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
extern FILE _iob[];
FILE *fdopen(h, mode)
register int h;
const register char *mode;
{
extern int __default_mode__; /* see binmode.c */
register int i, iomode = 0, f = __default_mode__;
register FILE *fp = NULL;
void _getbuf(FILE *);
for(i=0; (!fp && (i < _NFILE)); ++i)
if(!(_iob[i]._flag & (_IORW | _IOREAD | _IOWRT)))
fp = &_iob[i]; /* empty slot */
if(!fp)
return(NULL);
while(*mode) {
switch(*mode++) {
case 'r':
f |= _IOREAD;
break;
case 'w':
f |= _IOWRT;
iomode |= (O_CREAT | O_TRUNC);
break;
case 'a':
f |= _IOWRT;
iomode |= (O_CREAT | O_APPEND);
break;
case '+':
f &= ~(_IOREAD | _IOWRT);
f |= _IORW;
break;
case 'b':
f |= _IOBIN;
break;
case 't':
f &= ~_IOBIN;
break;
default: /* illegal file mode */
return(NULL);
}
}
if((i = (f & (_IORW | _IOREAD | _IOWRT))) == 0)
return(NULL);
else if(i == _IOREAD)
iomode |= O_RDONLY;
else if(i == _IOWRT)
iomode |= O_WRONLY;
else
iomode |= O_RDWR;
if(isatty(h))
f |= (_IODEV | _IONBF);
else
f |= _IOFBF;
fp->_file = h; /* file handle */
fp->_flag = f; /* file status flags */
_getbuf(fp);
return(fp);
}