home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 13 / 13.iso / s / s001 / 1.ddi / PFC / SRC / FLOPEN.C < prev    next >
Encoding:
C/C++ Source or Header  |  1987-11-19  |  3.6 KB  |  112 lines

  1. /* (c) 1985, Phoenix Computer Products Corp. and Novum Organum, Inc. */
  2. #include "pdefs.h"
  3. #include "psys.h"
  4.  
  5. #define FROMEND         2
  6. #define READ            0
  7. #define READWRITE       2
  8. #define WRITE           1
  9. #define STDIN           0
  10. #define STDOUT          1
  11. #define STDERR          2
  12. #define STDAUX          3
  13. #define STDPRT          4
  14. #define NOTOPENED       -1
  15.  
  16. static  char *_stdio[]={"stdin","stdout","stderr","stdaux","stdprt"};
  17.  
  18. HDL flopen (fnam, mode)
  19.         char    *fnam, *mode;
  20. {
  21.         int     streq(), f_mv_eof, fd, iomode, f_new, i, f_buf, f_new_if_missing;
  22.         HDL     h_fl;
  23.         char    *strtrim(), *strlower(), *memgive(), *memgivetrap(), *stracpy();
  24.         long    dosseek();
  25.         int     ioflags;
  26.  
  27.         strtrim(fnam);
  28.  
  29.         if      (*fnam == EOS)    /* null string name */
  30.                 return (NULLHDL);
  31.  
  32.         f_buf = f_mv_eof = NO;
  33.         fd = NOTOPENED;
  34.         ioflags = 0;
  35.  
  36.         for     (i=0;i<5;i++)
  37.                 {
  38.                 if      (streq(fnam,_stdio[i]))
  39.                         {
  40.                         fd = i;
  41.                         ioflags |= FIL_STDIO;
  42.                         iomode = (i==STDIN) ? READ : WRITE;
  43.                         break;
  44.                         }
  45.                 }
  46.  
  47.         if      (fd == RC_FAIL)
  48.                 {
  49.                 strlower(mode);
  50.  
  51.                 switch(*mode)
  52.                         {
  53.                 case 'a':
  54.                         f_mv_eof = YES;
  55.                         f_new = NO;
  56.                         f_new_if_missing = YES;
  57.                         iomode = WRITE;
  58.                         break;
  59.                 case 'w':
  60.                         iomode = WRITE;
  61.                         f_new  = f_new_if_missing = YES;
  62.                         break;
  63.                 default:
  64.                         iomode = READ | 0x20;
  65.                         f_new = f_new_if_missing = NO;
  66.                         break;
  67.                         }
  68.  
  69.                 if      (stridxc('+', mode)>=0)
  70.                           iomode = READWRITE | 0x40;
  71.                 else
  72.                         f_buf = YES;
  73.  
  74.                 fd = (f_new)    ? doscreate(fnam,FA_ORDINARY)
  75.                                 : dosopen(fnam,iomode);
  76.  
  77.                 if      ((fd == NOTOPENED) && (f_new_if_missing))
  78.                         fd = doscreate(fnam,FA_ORDINARY);
  79.                 }
  80.  
  81.         if      (fd != NOTOPENED)
  82.                 {/* file was properly opened */
  83.                 h_fl = (HDL) memgive (sizeof(FIL));
  84.  
  85.                 H_FL->tag = ADT_FILE;
  86.                 H_FL->fd           = fd;
  87.                 H_FL->mode         = iomode;
  88.                 H_FL->ioflags      = ioflags;
  89.                 H_FL->ungot_c      = 0;
  90.                 H_FL->fnam = memgive(stralen(fnam)+1);
  91.                 stracpy(H_FL->fnam, fnam);
  92.                 H_FL->fbuf          = NULLPTR;
  93.                 H_FL->fbufsiz       = 0;
  94.                 H_FL->at_byte      = 0;
  95.                 H_FL->lst_rd_byte  = BUF_EMPTY;
  96.                 if      (f_buf)
  97.                         {
  98.                         if      ((H_FL->fbuf = memgivetrap(2048)))
  99.                                 {
  100.                                 H_FL->fbufsiz = 2048;
  101.                                 H_FL->at_byte = 0;
  102.                                 H_FL->lst_rd_byte = BUF_EMPTY;
  103.                                 }
  104.                         }
  105.                 if  (f_mv_eof)
  106.                     dosseek(H_FL->fd, 0L, FROMEND);
  107.                 }
  108.         else
  109.                 h_fl = NULLHDL;
  110.         return (h_fl);
  111. }
  112.