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
		
			
				
	
	
		
			133 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* 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 ) ;
 | |
| }
 |