home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c160 / 1.ddi / SOURCE / U4READ.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-06-22  |  2.3 KB  |  107 lines

  1.  
  2. /* u4read.c   (c)Copyright Sequiter Software Inc., 1987-1990. All rights reserved. */
  3.  
  4. #include "p4misc.h"
  5. #include "d4all.h"
  6. #include "u4error.h"
  7.  
  8. #include <string.h>
  9. #ifndef UNIX
  10. #include <io.h>
  11. #endif
  12.  
  13. static int   hand ;
  14. static unsigned int  len_buffer, buffer_pos ;
  15. static unsigned int  bytes_left_rd ;  /* Read - # of bytes left in the buffer */
  16.  
  17. static char H_PTR buffer ;
  18.  
  19. int  u4read_init( int handle, char H_PTR ptr, unsigned int len_ptr, long start_offset )
  20. {
  21.    long  lseek_pos ;
  22.  
  23.    hand  =  handle ;
  24.    buffer=  ptr ;
  25.    len_buffer=  len_ptr & 0xFC00 ;  /* Make it a multiple of 1K */
  26.    buffer_pos =  bytes_left_rd =  0 ;
  27.  
  28.    if ( len_buffer == 0 )
  29.    {
  30.       lseek_pos =  start_offset ;
  31.       len_buffer =  len_ptr ;
  32.    }
  33.    else
  34.       lseek_pos =  start_offset & 0xFC00 ;
  35.  
  36.    if ( lseek( handle, lseek_pos, 0) != lseek_pos ) 
  37.    {
  38.       u4error( E_LSEEK, (char *) 0 ) ;
  39.       return -1 ;
  40.    }
  41.  
  42.    if ( len_buffer == 0 )  return 0 ;
  43.  
  44.    if ( u4read( buffer, (unsigned) (start_offset-lseek_pos)) < 0 )
  45.       return -1 ;
  46.                        
  47.    return 0 ;
  48. }
  49.  
  50.  
  51. /* Returns 
  52.    -1   Error
  53.     0   All info read
  54. */
  55.  
  56. int  u4read( char H_PTR ptr, unsigned int len_ptr )
  57. {
  58.    if ( len_buffer == 0 )
  59.    {
  60.       unsigned int  urc ;
  61.  
  62.       urc =  (unsigned) u4huge_read( hand, ptr, (long) len_ptr ) ;
  63.       if ( urc != len_ptr )
  64.       {
  65.          u4error( E_READ, (char *) 0 ) ;
  66.          return -1 ;
  67.       }
  68.  
  69.       return 0 ;
  70.    }
  71.  
  72.    if ( bytes_left_rd > 0 )
  73.    {
  74.       if ( bytes_left_rd >= len_ptr )
  75.       {
  76.      u4huge_cpy( ptr, buffer+buffer_pos, (long) len_ptr ) ;
  77.      buffer_pos += len_ptr ;
  78.      bytes_left_rd -= len_ptr ;
  79.      return 0 ;
  80.       }
  81.       else
  82.       {
  83.          unsigned int  first_len ;
  84.  
  85.      u4read( ptr, first_len= bytes_left_rd ) ;
  86.      return  u4read( ptr+first_len, len_ptr-first_len) ;
  87.       }
  88.    }
  89.  
  90.    /* bytes_left_rd is zero */
  91.    buffer_pos =  0 ;
  92.    bytes_left_rd = (unsigned) u4huge_read( hand, buffer, (long) len_buffer ) ;
  93.    if ( bytes_left_rd == 0 )
  94.    {
  95.       if ( len_ptr == 0 )  return 0 ;
  96.       u4error( E_READ, (char *) 0 ) ;
  97.       return -1 ;
  98.    }
  99.    if ( bytes_left_rd == 0xFFFF )
  100.    {
  101.       u4error( E_READ, (char *) 0 ) ;
  102.       return -1 ;
  103.    }
  104.  
  105.    return  u4read(ptr,len_ptr) ;
  106. }
  107.