home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 13 / 13.iso / s / s001 / 1.ddi / PFC / SRC / DOSFILE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-11-10  |  2.7 KB  |  127 lines

  1. /* (c) 1985, Phoenix Computer Products Corp. and Novum Organum, Inc. */
  2. #include <stdlib.h>
  3. #include "pdefs.h"
  4.  
  5.         ushort  sydptrse(), sydptrof();
  6.  
  7. #define SEEKERR (-1L)
  8. #define LSEEK   0x4200
  9.  
  10. int dosopen(fnam,iomode)
  11.         char *fnam;
  12.         int iomode;
  13. {
  14.         REGIS   regs;
  15.         int     dosgate();
  16.  
  17.         regs.ax = 0x3d00 | iomode;
  18.     if (_osmajor < 3)  regs.ax &= 0xff03;
  19.         regs.ds = sydptrse(fnam);
  20.         regs.dx = sydptrof(fnam);
  21.         return ((dosgate(®s)==RC_FAIL) ? RC_FAIL : (int) regs.ax);
  22. }
  23.  
  24. int doscreate(fnam, dir_mode)
  25.         char    *fnam;
  26.         int     dir_mode;
  27. {
  28.         REGIS   regs;
  29.         int     dosgate();
  30.  
  31.         regs.ax = 0x3C00;
  32.         regs.cx = dir_mode;
  33.         regs.ds = sydptrse(fnam);
  34.         regs.dx = sydptrof(fnam);
  35.         return ((dosgate(®s)==RC_FAIL) ? RC_FAIL : (int) regs.ax);
  36. }
  37.  
  38. int dosread (buf, n, fd)
  39.         char    *buf;
  40.         int     n, fd;
  41. {
  42.         REGIS   regs;
  43.         int     rc;
  44.  
  45.         regs.ax = 0x3F00;
  46.         regs.bx = fd;
  47.         regs.cx = n;
  48.         regs.ds = sydptrse(buf);
  49.         regs.dx = sydptrof(buf);
  50.         rc = dosgate(®s);
  51.  
  52.         if      ((rc==RC_FAIL) || (regs.ax < 0))
  53.                 sylongjmp(SE_BADREAD);
  54.  
  55.         return ((int) regs.ax);
  56. }
  57.  
  58. long dosseek(fd, lpos, mode)
  59.         int     fd, mode;
  60.         long    lpos;
  61. {
  62.         REGIS   regs;
  63.         long    new_pos;
  64.  
  65.         regs.ax = LSEEK | LOBYTE(mode);
  66.         regs.bx = fd;
  67.         regs.cx = (uint)(lpos>>16);
  68.         regs.dx = (uint) lpos;
  69.  
  70.         if      (dosgate(®s)==RC_SUCCESS)
  71.                 new_pos = (((long)regs.dx)<<16) | (long) regs.ax;
  72.         else
  73.                 sylongjmp(SE_BADSEEK);
  74.         return (new_pos);
  75. }
  76.  
  77. int doswrite(buf,n,fd)
  78.         char    *buf;
  79.         int     n, fd;
  80. {
  81.         REGIS   regs;
  82.         int     rc;
  83.  
  84.         regs.ax = 0x4000;
  85.         regs.bx = fd;
  86.         regs.cx = n;
  87.         regs.ds = sydptrse(buf);
  88.         regs.dx = sydptrof(buf);
  89.         rc = dosgate(®s);
  90.         if      ((rc==RC_FAIL) || (regs.ax < n))
  91.                 sylongjmp(SE_BADWRITE);
  92.         return(n);
  93. }
  94.  
  95. int dosclose(fd)
  96.         int     fd;
  97. {
  98.         REGIS   regs;
  99.  
  100.         regs.ax = 0x3E00;
  101.         regs.bx = fd;
  102.  
  103.         return ((dosgate(®s)==RC_FAIL) ? RC_FAIL : (int) regs.ax);
  104. }
  105.  
  106. dosckpt(fd)
  107. {
  108.         int     dup_fd;
  109.  
  110.         dup_fd = dosfddup(fd);
  111.         if      (dup_fd > 0)
  112.                 dosclose (dup_fd);
  113. }
  114.  
  115. dosfddup(fd)
  116.         int     fd;
  117. {
  118.         REGIS   regs;
  119.  
  120.         regs.ax = 0x4500;
  121.         regs.bx = fd;
  122.         return ((dosgate(®s)==RC_FAIL) ? RC_FAIL : (int) regs.ax);
  123. }
  124.  
  125.  
  126. 
  127.