/* 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 ) ; }