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

  1.  
  2. /*  (c)Copyright Sequiter Software Inc., 1987-1990.  All rights reserved.
  3.  
  4.     d4buf_flush()
  5. */
  6.  
  7. #include "p4misc.h"
  8. #include "d4all.h"
  9. #include "u4error.h"
  10.  
  11. #ifndef UNIX
  12. #include <io.h>
  13. #endif
  14.  
  15. extern BASE *v4base ;
  16. extern int   v4last_base ;
  17.  
  18. int  d4flush( int base_ref )
  19. {
  20.    int  base_on ;
  21.    BASE *base_ptr ;
  22.  
  23.    if ( base_ref >= 0 )
  24.    {
  25.       base_ptr =  v4base + base_ref ;
  26.  
  27.       if ( d4changed(base_ptr) < 0 )  return -1 ;
  28.  
  29.       while ( base_ptr->change_list >= 0 )
  30.      if ( d4buf_flush( base_ptr, base_ptr->change_list) < 0 )  return -1 ;
  31.  
  32.       return 0 ;
  33.    }
  34.  
  35.    for ( base_on = v4last_base; base_on >= 0; base_on =  v4base[base_on].prev )
  36.       if ( d4flush( base_on) < 0 )  return -1 ;
  37.  
  38.    return 0 ;
  39. }
  40.  
  41.  
  42. int  d4buf_flush( BASE *base_ptr, int i_buf )
  43. {
  44.    BASE_BUF *buf ;
  45.    unsigned  bytes ;
  46.    long      pos ;
  47.  
  48.    if ( i_buf < 0 )  return -1 ;
  49.  
  50.    buf =  base_ptr->bufs+ i_buf ;
  51.  
  52.    if ( ! buf->changed )  return 0 ;  /* Not changed. */
  53.  
  54.    base_ptr->change_list =  h4remove( (char **) &base_ptr->bufs, i_buf ) ;
  55.    buf->changed = 0 ;
  56.  
  57.    bytes = (unsigned ) base_ptr->buffer_len *
  58.         (unsigned) (buf->end_rec-buf->start_rec+1L) ;
  59.  
  60.    pos = base_ptr->header_len+ (buf->start_rec-1)* base_ptr->buffer_len ;
  61.    if ( lseek( base_ptr->file_hand, pos, 0 ) != pos )
  62.    {
  63.       u4error( E_LSEEK, base_ptr->name, (char *) 0 ) ;
  64.       return -1 ;
  65.    }
  66.    if ( u4huge_write( base_ptr->file_hand, 
  67.         base_ptr->buf_ptr+ i_buf*base_ptr->bytes_per_buf, (long) bytes ) < 0 )
  68.    {
  69.       u4error( E_WRITE, "Flushing Buffer of File:", d4name(), (char *) 0 ) ;
  70.       return -1 ;
  71.    }
  72.  
  73.    return 0 ;
  74. }
  75.