home *** CD-ROM | disk | FTP | other *** search
-
- /* (c)Copyright Sequiter Software Inc., 1987-1990. All rights reserved.
-
- d4buf_read_pos()
- */
-
- #include "p4misc.h"
- #include "d4all.h"
-
- char H_PTR d4buf_read_pos( BASE *base_ptr, long rec_num )
- {
- int i_buf ;
- unsigned urc ;
- long read_bytes ;
- BASE_BUF *buf ;
-
- i_buf = (int) ((rec_num / base_ptr->rec_per_buf) % base_ptr->n_bufs) ;
- buf = base_ptr->bufs+ i_buf ;
-
- if ( rec_num < buf->start_rec || rec_num > buf->end_rec )
- {
- /* The record is not in the buffer. Read the record. */
- if ( d4locked(-1L) )
- {
- /* File Locked */
- if ( d4buf_flush( base_ptr, i_buf ) < 0 ) return( (char H_PTR) 0 ) ;
-
- buf->start_rec = rec_num - rec_num%base_ptr->rec_per_buf ;
- buf->end_rec = buf->start_rec + base_ptr->rec_per_buf -1L ;
- if ( buf->start_rec == 0L ) buf->start_rec = 1L ;
- }
- else
- {
- /* Record Locked */
- if ( d4buf_flush( base_ptr, i_buf ) < 0 ) return( (char H_PTR) 0 );
-
- buf->start_rec = buf->end_rec = rec_num ;
- }
-
- if ( d4lseek( buf->start_rec ) < 0 ) return( (char H_PTR) 0 ) ;
- read_bytes = (buf->end_rec - buf->start_rec + 1L) * base_ptr->buffer_len ;
-
- urc = (unsigned) u4huge_read( base_ptr->file_hand,
- base_ptr->buf_ptr+ i_buf*base_ptr->bytes_per_buf, read_bytes) ;
- buf->end_rec = buf->start_rec + urc/base_ptr->buffer_len -1L ;
-
- if ( buf->end_rec < rec_num )
- {
- d4go_error( rec_num ) ;
- return ( (char H_PTR) 0 ) ;
- }
- }
-
- return( base_ptr->buf_ptr + i_buf*base_ptr->bytes_per_buf +
- (rec_num-buf->start_rec) * base_ptr->buffer_len ) ;
- }
-
-
-