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

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