home *** CD-ROM | disk | FTP | other *** search
- /* (c) 1985, Phoenix Computer Products Corp. and Novum Organum, Inc. */
- #include "pdefs.h"
- #include "psys.h"
-
- #define FROMEND 2
- #define READ 0
- #define READWRITE 2
- #define WRITE 1
- #define STDIN 0
- #define STDOUT 1
- #define STDERR 2
- #define STDAUX 3
- #define STDPRT 4
- #define NOTOPENED -1
-
- static char *_stdio[]={"stdin","stdout","stderr","stdaux","stdprt"};
-
- HDL flopen (fnam, mode)
- char *fnam, *mode;
- {
- int streq(), f_mv_eof, fd, iomode, f_new, i, f_buf, f_new_if_missing;
- HDL h_fl;
- char *strtrim(), *strlower(), *memgive(), *memgivetrap(), *stracpy();
- long dosseek();
- int ioflags;
-
- strtrim(fnam);
-
- if (*fnam == EOS) /* null string name */
- return (NULLHDL);
-
- f_buf = f_mv_eof = NO;
- fd = NOTOPENED;
- ioflags = 0;
-
- for (i=0;i<5;i++)
- {
- if (streq(fnam,_stdio[i]))
- {
- fd = i;
- ioflags |= FIL_STDIO;
- iomode = (i==STDIN) ? READ : WRITE;
- break;
- }
- }
-
- if (fd == RC_FAIL)
- {
- strlower(mode);
-
- switch(*mode)
- {
- case 'a':
- f_mv_eof = YES;
- f_new = NO;
- f_new_if_missing = YES;
- iomode = WRITE;
- break;
- case 'w':
- iomode = WRITE;
- f_new = f_new_if_missing = YES;
- break;
- default:
- iomode = READ | 0x20;
- f_new = f_new_if_missing = NO;
- break;
- }
-
- if (stridxc('+', mode)>=0)
- iomode = READWRITE | 0x40;
- else
- f_buf = YES;
-
- fd = (f_new) ? doscreate(fnam,FA_ORDINARY)
- : dosopen(fnam,iomode);
-
- if ((fd == NOTOPENED) && (f_new_if_missing))
- fd = doscreate(fnam,FA_ORDINARY);
- }
-
- if (fd != NOTOPENED)
- {/* file was properly opened */
- h_fl = (HDL) memgive (sizeof(FIL));
-
- H_FL->tag = ADT_FILE;
- H_FL->fd = fd;
- H_FL->mode = iomode;
- H_FL->ioflags = ioflags;
- H_FL->ungot_c = 0;
- H_FL->fnam = memgive(stralen(fnam)+1);
- stracpy(H_FL->fnam, fnam);
- H_FL->fbuf = NULLPTR;
- H_FL->fbufsiz = 0;
- H_FL->at_byte = 0;
- H_FL->lst_rd_byte = BUF_EMPTY;
- if (f_buf)
- {
- if ((H_FL->fbuf = memgivetrap(2048)))
- {
- H_FL->fbufsiz = 2048;
- H_FL->at_byte = 0;
- H_FL->lst_rd_byte = BUF_EMPTY;
- }
- }
- if (f_mv_eof)
- dosseek(H_FL->fd, 0L, FROMEND);
- }
- else
- h_fl = NULLHDL;
- return (h_fl);
- }