home *** CD-ROM | disk | FTP | other *** search
-
- /* u4read.c (c)Copyright Sequiter Software Inc., 1987-1990. All rights reserved. */
-
- #include "p4misc.h"
- #include "d4all.h"
- #include "u4error.h"
-
- #include <string.h>
- #ifndef UNIX
- #include <io.h>
- #endif
-
- static int hand ;
- static unsigned int len_buffer, buffer_pos ;
- static unsigned int bytes_left_rd ; /* Read - # of bytes left in the buffer */
-
- static char H_PTR buffer ;
-
- int u4read_init( int handle, char H_PTR ptr, unsigned int len_ptr, long start_offset )
- {
- long lseek_pos ;
-
- hand = handle ;
- buffer= ptr ;
- len_buffer= len_ptr & 0xFC00 ; /* Make it a multiple of 1K */
- buffer_pos = bytes_left_rd = 0 ;
-
- if ( len_buffer == 0 )
- {
- lseek_pos = start_offset ;
- len_buffer = len_ptr ;
- }
- else
- lseek_pos = start_offset & 0xFC00 ;
-
- if ( lseek( handle, lseek_pos, 0) != lseek_pos )
- {
- u4error( E_LSEEK, (char *) 0 ) ;
- return -1 ;
- }
-
- if ( len_buffer == 0 ) return 0 ;
-
- if ( u4read( buffer, (unsigned) (start_offset-lseek_pos)) < 0 )
- return -1 ;
-
- return 0 ;
- }
-
-
- /* Returns
- -1 Error
- 0 All info read
- */
-
- int u4read( char H_PTR ptr, unsigned int len_ptr )
- {
- if ( len_buffer == 0 )
- {
- unsigned int urc ;
-
- urc = (unsigned) u4huge_read( hand, ptr, (long) len_ptr ) ;
- if ( urc != len_ptr )
- {
- u4error( E_READ, (char *) 0 ) ;
- return -1 ;
- }
-
- return 0 ;
- }
-
- if ( bytes_left_rd > 0 )
- {
- if ( bytes_left_rd >= len_ptr )
- {
- u4huge_cpy( ptr, buffer+buffer_pos, (long) len_ptr ) ;
- buffer_pos += len_ptr ;
- bytes_left_rd -= len_ptr ;
- return 0 ;
- }
- else
- {
- unsigned int first_len ;
-
- u4read( ptr, first_len= bytes_left_rd ) ;
- return u4read( ptr+first_len, len_ptr-first_len) ;
- }
- }
-
- /* bytes_left_rd is zero */
- buffer_pos = 0 ;
- bytes_left_rd = (unsigned) u4huge_read( hand, buffer, (long) len_buffer ) ;
- if ( bytes_left_rd == 0 )
- {
- if ( len_ptr == 0 ) return 0 ;
- u4error( E_READ, (char *) 0 ) ;
- return -1 ;
- }
- if ( bytes_left_rd == 0xFFFF )
- {
- u4error( E_READ, (char *) 0 ) ;
- return -1 ;
- }
-
- return u4read(ptr,len_ptr) ;
- }
-