home *** CD-ROM | disk | FTP | other *** search
/ PC Extra Super CD 1998 January / PCPLUS131.iso / DJGPP / V2 / DJLSR201.ZIP / src / libc / dos / compat / d_read.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-09  |  1.6 KB  |  62 lines

  1. /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
  2. /*
  3.  * D_READ.C.
  4.  *
  5.  * Written by Peter Sulyok 1995 <sulyok@math.klte.hu>.
  6.  *
  7.  * This file is distributed WITHOUT ANY WARRANTY; without even the implied
  8.  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9.  *
  10.  */
  11.  
  12. #include <libc/stubs.h>
  13. #include <libc/dosio.h>
  14. #include <go32.h>
  15. #include <dpmi.h>
  16. #include <errno.h>
  17. #include <dos.h>
  18.  
  19. unsigned int _dos_read(int handle, void *buffer, unsigned int count, unsigned int *result)
  20. {
  21.   __dpmi_regs r;
  22.   unsigned int dos_segment, dos_selector, dos_buffer_size, read_size;
  23.   unsigned char *p_buffer;
  24.  
  25.   /* Allocate ~64K or less transfer buffer from DOS */
  26.   dos_buffer_size = ( count < 0xFFE0 ) ? count : 0xFFE0;
  27.   if ( (dos_segment=__dpmi_allocate_dos_memory((dos_buffer_size + 15) >> 4, &dos_selector)) == -1 )
  28.   {
  29.     errno = ENOMEM;
  30.     return 8;
  31.   }
  32.  
  33.   /* Reads blocks of file and transfers these into user buffer. */
  34.   p_buffer = buffer;
  35.   *result  = 0;
  36.   while( count )
  37.   {
  38.     read_size = ( count < dos_buffer_size ) ? count : dos_buffer_size;
  39.     r.h.ah = 0x3F;
  40.     r.x.bx = handle;
  41.     r.x.cx = read_size;
  42.     r.x.ds = dos_segment;
  43.     r.x.dx = 0;
  44.     __dpmi_int(0x21, &r);
  45.     if ( r.x.flags & 1 )
  46.     {
  47.       __dpmi_free_dos_memory(dos_selector);
  48.       errno = __doserr_to_errno(r.x.ax);
  49.       return r.x.ax;
  50.     }
  51.     if ( r.x.ax )
  52.       movedata(dos_selector, 0, _my_ds(), (unsigned int)p_buffer, r.x.ax);
  53.     count    -= read_size;
  54.     p_buffer += r.x.ax;
  55.     *result  += r.x.ax;
  56.   }
  57.  
  58.   /* Frees allocated DOS transfer buffer. */
  59.   __dpmi_free_dos_memory(dos_selector);
  60.   return 0;
  61. }
  62.