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

  1.  
  2. /*  (c)Copyright Sequiter Software Inc., 1987-1990.  All rights reserved.
  3.  
  4.     d4buf_read_pos()
  5. */
  6.  
  7. #include "p4misc.h"
  8. #include "d4all.h"
  9.  
  10. char H_PTR  d4buf_read_pos( BASE *base_ptr, long rec_num )
  11. {
  12.    int       i_buf ;
  13.    unsigned  urc ;
  14.    long      read_bytes ;
  15.    BASE_BUF *buf ;
  16.  
  17.    i_buf =  (int) ((rec_num / base_ptr->rec_per_buf) % base_ptr->n_bufs) ;
  18.    buf   =  base_ptr->bufs+ i_buf ;
  19.  
  20.    if ( rec_num < buf->start_rec  ||  rec_num > buf->end_rec )
  21.    {
  22.       /* The record is not in the buffer.  Read the record. */
  23.       if ( d4locked(-1L) )
  24.       {
  25.          /* File Locked */
  26.      if ( d4buf_flush( base_ptr, i_buf ) < 0 )  return( (char H_PTR) 0 ) ;
  27.  
  28.      buf->start_rec =  rec_num - rec_num%base_ptr->rec_per_buf ;
  29.      buf->end_rec = buf->start_rec + base_ptr->rec_per_buf -1L ;
  30.      if ( buf->start_rec == 0L )  buf->start_rec =  1L ;
  31.       }
  32.       else
  33.       {
  34.          /* Record Locked */
  35.      if ( d4buf_flush( base_ptr, i_buf ) < 0 )  return( (char H_PTR) 0 );
  36.  
  37.          buf->start_rec =  buf->end_rec =  rec_num ;
  38.       }
  39.  
  40.       if ( d4lseek( buf->start_rec ) < 0 )  return( (char H_PTR) 0 ) ;
  41.       read_bytes =  (buf->end_rec - buf->start_rec + 1L) * base_ptr->buffer_len ;
  42.  
  43.       urc = (unsigned) u4huge_read( base_ptr->file_hand,
  44.         base_ptr->buf_ptr+ i_buf*base_ptr->bytes_per_buf, read_bytes) ;
  45.       buf->end_rec =  buf->start_rec + urc/base_ptr->buffer_len -1L ;
  46.  
  47.       if ( buf->end_rec < rec_num )
  48.       {
  49.          d4go_error( rec_num ) ;
  50.      return ( (char H_PTR) 0 ) ;
  51.       }
  52.    }
  53.  
  54.    return( base_ptr->buf_ptr + i_buf*base_ptr->bytes_per_buf +
  55.           (rec_num-buf->start_rec) * base_ptr->buffer_len ) ;
  56. }
  57.  
  58.  
  59.