campo-sirio/cb5/d4positi.c

133 lines
2.4 KiB
C
Raw Normal View History

/* d4positi.c (c)Copyright Sequiter Software Inc., 1990-1994. All rights reserved. */
#include "d4all.h"
#ifndef S4UNIX
#ifdef __TURBOC__
#pragma hdrstop
#endif
#endif
double S4FUNCTION d4position( DATA4 *data )
{
#ifndef S4INDEX_OFF
TAG4 *tag_on ;
#endif
long count ;
#ifndef S4FOX
int rc, len ;
char *result ;
#endif
#ifdef S4VBASIC
if ( c4parm_check( data, 2, E4_D4POS ) )
return -1.0 ;
#endif
if ( data == 0 )
#ifdef S4DEBUG
e4severe( e4parm, E4_D4POS ) ;
#else
return -1.0 ;
#endif
if( data->code_base->error_code < 0 )
return -1.0 ;
if ( d4eof( data ) )
return 1.1 ;
#ifndef S4INDEX_OFF
tag_on = d4tag_selected( data ) ;
if ( tag_on == 0 || data->rec_num <= 0L )
{
#endif
count = d4reccount( data ) ;
if ( count < 0 )
return -1.0 ;
if ( count == 0 || data->rec_num <= 0L )
return 0.0 ;
return (double)( data->rec_num - 1 ) / ( count - (count != 1 ) ) ;
#ifndef S4INDEX_OFF
}
else
{
#ifndef S4FOX
len = t4expr_key( tag_on, &result ) ;
if ( len < 0 )
return -1.0 ;
t4version_check( tag_on, 0, 0 ) ;
rc = t4seek( tag_on, result, len ) ;
if ( rc != 0 && rc != r4eof && rc != r4after )
return -1.0 ;
#endif
return t4position( tag_on ) ;
}
#endif
}
int S4FUNCTION d4position2( DATA4 *data, double *result )
{
*result = d4position( data ) ;
if ( *result < 0.0 )
return -1;
return 0;
}
int S4FUNCTION d4position_set( DATA4 *data, double per )
{
#ifndef S4INDEX_OFF
TAG4 *tag_on ;
#endif
long new_rec, count ;
int rc ;
#ifdef S4VBASIC
if ( c4parm_check( data, 2, E4_D4POS_SET ) )
return -1 ;
#endif
if ( data == 0 )
#ifdef S4DEBUG
e4severe( e4parm, E4_D4POS_SET ) ;
#else
return -1 ;
#endif
if( data->code_base->error_code < 0 )
return -1 ;
if ( per > 1.0 )
return d4go_eof( data ) ;
if ( per <= 0 )
return d4top( data ) ;
#ifndef S4INDEX_OFF
tag_on = d4tag_selected( data ) ;
if ( tag_on == 0 )
{
#endif
count = d4reccount( data ) ;
if ( count <= 0L )
return d4go_eof( data ) ;
new_rec = (long)( per * ( (double)count - 1 ) + 1.5 ) ;
if ( new_rec > count )
new_rec = count ;
#ifndef S4INDEX_OFF
}
else
{
rc = t4position_set( tag_on, per ) ;
if ( rc )
return rc ;
if ( rc == r4eof )
return d4go_eof( data ) ;
new_rec = t4recno( tag_on ) ;
}
#endif
return d4go( data, new_rec ) ;
}