home *** CD-ROM | disk | FTP | other *** search
-
- /* (c)Copyright Sequiter Software Inc., 1987-1990. All rights reserved.
-
- d4buf_flush()
- */
-
- #include "p4misc.h"
- #include "d4all.h"
- #include "u4error.h"
-
- #ifndef UNIX
- #include <io.h>
- #endif
-
- extern BASE *v4base ;
- extern int v4last_base ;
-
- int d4flush( int base_ref )
- {
- int base_on ;
- BASE *base_ptr ;
-
- if ( base_ref >= 0 )
- {
- base_ptr = v4base + base_ref ;
-
- if ( d4changed(base_ptr) < 0 ) return -1 ;
-
- while ( base_ptr->change_list >= 0 )
- if ( d4buf_flush( base_ptr, base_ptr->change_list) < 0 ) return -1 ;
-
- return 0 ;
- }
-
- for ( base_on = v4last_base; base_on >= 0; base_on = v4base[base_on].prev )
- if ( d4flush( base_on) < 0 ) return -1 ;
-
- return 0 ;
- }
-
-
- int d4buf_flush( BASE *base_ptr, int i_buf )
- {
- BASE_BUF *buf ;
- unsigned bytes ;
- long pos ;
-
- if ( i_buf < 0 ) return -1 ;
-
- buf = base_ptr->bufs+ i_buf ;
-
- if ( ! buf->changed ) return 0 ; /* Not changed. */
-
- base_ptr->change_list = h4remove( (char **) &base_ptr->bufs, i_buf ) ;
- buf->changed = 0 ;
-
- bytes = (unsigned ) base_ptr->buffer_len *
- (unsigned) (buf->end_rec-buf->start_rec+1L) ;
-
- pos = base_ptr->header_len+ (buf->start_rec-1)* base_ptr->buffer_len ;
- if ( lseek( base_ptr->file_hand, pos, 0 ) != pos )
- {
- u4error( E_LSEEK, base_ptr->name, (char *) 0 ) ;
- return -1 ;
- }
- if ( u4huge_write( base_ptr->file_hand,
- base_ptr->buf_ptr+ i_buf*base_ptr->bytes_per_buf, (long) bytes ) < 0 )
- {
- u4error( E_WRITE, "Flushing Buffer of File:", d4name(), (char *) 0 ) ;
- return -1 ;
- }
-
- return 0 ;
- }
-