which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@976 c028cbd2-c16b-5b4b-a496-9718f37d4682
103 lines
2.9 KiB
C
Executable File
103 lines
2.9 KiB
C
Executable File
/* s4next.c (c)Copyright Sequiter Software Inc., 1990-1994. All rights reserved. */
|
|
|
|
#include "d4all.h"
|
|
#ifndef S4UNIX
|
|
#ifdef __TURBOC__
|
|
#pragma hdrstop
|
|
#endif
|
|
#endif
|
|
|
|
int s4next_spool_entry( SORT4 *s4 )
|
|
{
|
|
long last_disk_pos, disk_data_left, new_rec, spool_rec ;
|
|
unsigned max_read, len_read ;
|
|
int low, high, pos, rc ;
|
|
char *new_data ;
|
|
S4SPOOL save_spool ;
|
|
|
|
s4->spool_pointer->pos += s4->tot_len ;
|
|
if ( s4->spool_pointer->pos >= s4->spool_pointer->len )
|
|
{
|
|
s4->spool_pointer->pos = 0 ;
|
|
if ( s4->spool_pointer->disk >= 0L )
|
|
{
|
|
last_disk_pos = (s4->spool_pointer->spool_i+1) * s4->spool_disk_len ;
|
|
disk_data_left = last_disk_pos - s4->spool_pointer->disk ;
|
|
max_read = s4->spool_mem_len ;
|
|
if ( (long) s4->spool_mem_len > disk_data_left )
|
|
max_read = (unsigned) disk_data_left ;
|
|
len_read = file4read( &s4->file, s4->spool_pointer->disk,
|
|
s4->spool_pointer->ptr, max_read) ;
|
|
|
|
if ( s4->code_base->error_code < 0 )
|
|
{
|
|
sort4free( s4 ) ;
|
|
return -1 ;
|
|
}
|
|
|
|
s4->spool_pointer->len = len_read ;
|
|
s4->spool_pointer->disk += len_read ;
|
|
if ( len_read != max_read || len_read == 0 )
|
|
{
|
|
if ( len_read % s4->tot_len )
|
|
{
|
|
sort4free( s4 ) ;
|
|
return e4( s4->code_base, e4read, s4->file.name ) ;
|
|
}
|
|
s4->spool_pointer->disk = -1 ;
|
|
if ( len_read == 0 )
|
|
{
|
|
s4delete_spool_entry( s4 ) ;
|
|
return 0 ;
|
|
}
|
|
else
|
|
s4->spool_pointer->len = len_read ;
|
|
}
|
|
else /* Check if we are out of disk entries for the spool */
|
|
if ( s4->spool_pointer->disk >= last_disk_pos )
|
|
s4->spool_pointer->disk = -1L ;
|
|
}
|
|
else
|
|
{
|
|
s4delete_spool_entry(s4) ;
|
|
return 0 ;
|
|
}
|
|
}
|
|
|
|
/* Position the new entry to the sorted location using a binary search */
|
|
/* New entry is placed before 'result': int pos >= 1 when complete */
|
|
low = 1 ;
|
|
high = s4->spools_n ;
|
|
new_data = s4->spool_pointer->ptr + s4->spool_pointer->pos ;
|
|
memcpy( (void *)&new_rec, new_data + s4->sort_len, sizeof(new_rec) ) ;
|
|
|
|
for(;;)
|
|
{
|
|
pos = ( low + high ) / 2 ;
|
|
if ( pos == low && pos == high ) /* then found */
|
|
{
|
|
memcpy( (void *)&save_spool, (void *)s4->spool_pointer, sizeof(S4SPOOL) ) ;
|
|
memmove( s4->spool_pointer, s4->spool_pointer+1, sizeof(S4SPOOL)*(pos-1) ) ;
|
|
memcpy( (void *)(s4->spool_pointer+pos-1), (void *)&save_spool, sizeof(S4SPOOL) ) ;
|
|
return 0 ;
|
|
}
|
|
rc = (*s4->cmp)(new_data, s4->spool_pointer[pos].ptr + s4->spool_pointer[pos].pos, s4->sort_len) ;
|
|
if ( rc == 0 )
|
|
{
|
|
memcpy( (void *)&spool_rec, s4->spool_pointer[pos].ptr + s4->spool_pointer[pos].pos + s4->sort_len, sizeof(spool_rec) ) ;
|
|
if ( new_rec > spool_rec )
|
|
rc = 1 ;
|
|
}
|
|
|
|
if ( rc > 0 )
|
|
low = pos+1 ;
|
|
else
|
|
high = pos ;
|
|
#ifdef S4DEBUG
|
|
if ( high < low )
|
|
e4severe( e4result, E4_S4NEXT_SP_ENT ) ;
|
|
#endif
|
|
}
|
|
}
|
|
|