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
		
			
				
	
	
		
			278 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			278 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* i4positi.c   (c)Copyright Sequiter Software Inc., 1990-1994.  All rights reserved. */
 | |
| 
 | |
| #include "d4all.h"
 | |
| #ifndef S4UNIX
 | |
| #ifdef __TURBOC__
 | |
| #pragma hdrstop
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #ifndef S4INDEX_OFF
 | |
| 
 | |
| /* 'pos' is an percentage, positioning is approximate. */
 | |
| int S4FUNCTION t4position2( TAG4 *t4, double *result )
 | |
| {
 | |
| #ifdef S4DEBUG
 | |
|   if ( t4 == 0 )
 | |
|     e4severe( e4parm, E4_T4POSITION2 ) ;
 | |
| #endif
 | |
| 
 | |
|   if ( t4->code_base->error_code < 0 )
 | |
|     return -1 ;
 | |
| 
 | |
|   *result = t4position( t4 );
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| #ifndef N4OTHER
 | |
| 
 | |
| double S4FUNCTION t4positionDbl( TAG4 *t4 )
 | |
| {
 | |
|   double pos ;
 | |
|   B4BLOCK *block_on ;
 | |
|   int n ;
 | |
| 
 | |
| #ifdef S4DEBUG
 | |
|   if ( t4 == 0 )
 | |
|     e4severe( e4parm, E4_T4POSITION ) ;
 | |
| #endif
 | |
| 
 | |
|   if ( t4->code_base->error_code < 0 )
 | |
|     return -1 ;
 | |
| 
 | |
|   pos = .5 ;
 | |
|   for ( block_on = (B4BLOCK *)t4->blocks.last_node ; block_on != 0 ; )
 | |
|   {
 | |
| #ifdef S4FOX
 | |
|     n = block_on->header.n_keys ;
 | |
| #else
 | |
|     n = block_on->n_keys + 1 ;
 | |
|     if ( b4leaf( block_on ) )
 | |
|       n-- ;
 | |
| #endif
 | |
| 
 | |
|     if( n == 0 )
 | |
|       pos = 0.0 ;
 | |
|     else
 | |
|       pos = (block_on->key_on+pos)/n ;
 | |
| 
 | |
|     block_on = (B4BLOCK *) block_on->link.p ;
 | |
|     if ( block_on == (B4BLOCK *) t4->blocks.last_node )
 | |
|       break ;
 | |
|   }
 | |
| #ifdef S4FOX
 | |
|   if ( t4->header.descending )   /* backwards in file... */
 | |
|     return 1.0 - pos ;
 | |
|   else
 | |
| #endif
 | |
|     return pos ;
 | |
| }
 | |
| 
 | |
| double S4FUNCTION t4position( TAG4 *t4 )
 | |
| {
 | |
| #ifdef S4FOX
 | |
|   int rc, len ;
 | |
|   char *result ;
 | |
| 
 | |
| #ifdef S4DEBUG
 | |
|   if ( t4 == 0 )
 | |
|     e4severe( e4parm, E4_T4POSITION ) ;
 | |
| #endif
 | |
| 
 | |
|   if ( t4->code_base->error_code < 0 )
 | |
|     return -1 ;
 | |
| 
 | |
|   if ( d4tag_selected( t4->index->data ) == t4 )
 | |
|   {
 | |
|     len = t4expr_key( t4, &result ) ;
 | |
|     if ( len < 0 )
 | |
|       return -1.0 ;
 | |
|     t4version_check( t4, 0, 0 ) ;
 | |
|     rc = t4seek( t4, result, len ) ;
 | |
|     if ( rc != 0  && rc != r4eof && rc != r4after )
 | |
|       return -1.0 ;
 | |
|   }
 | |
| #endif
 | |
| 
 | |
|   return t4positionDbl( t4 ) ;
 | |
| }
 | |
| 
 | |
| int S4FUNCTION t4position_set( TAG4 *t4, double pos )
 | |
| {
 | |
|   int rc, n, final_pos ;
 | |
|   B4BLOCK *block_on ;
 | |
| 
 | |
| #ifdef S4DEBUG
 | |
|   if ( t4 == 0 )
 | |
|     e4severe( e4parm, E4_T4POSITION_SET ) ;
 | |
| #endif
 | |
| 
 | |
|   if ( t4->code_base->error_code < 0 )
 | |
|     return -1 ;
 | |
| 
 | |
| #ifndef S4SINGLE
 | |
|   i4version_check( t4->index, 0, 0 ) ;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4FOX
 | |
|   if ( t4->header.descending )   /* backwards in file... */
 | |
|     pos = 1.0 - pos ;
 | |
| #endif
 | |
| 
 | |
|   if ( t4up_to_root( t4 ) < 0 )
 | |
|     return -1 ;
 | |
| 
 | |
|   for(;;)
 | |
|   {
 | |
| #ifdef S4DEBUG
 | |
|     if ( pos < 0.0 || pos > 1.0 )  /* Could be caused by rounding error ? */
 | |
|       e4severe( e4parm, E4_INFO_ILP ) ;
 | |
| #endif
 | |
| 
 | |
|     block_on = t4block(t4) ;
 | |
| 
 | |
| #ifdef S4FOX
 | |
|     n = block_on->header.n_keys ;
 | |
| #else
 | |
|     n = block_on->n_keys+1 ;
 | |
|     if ( b4leaf( block_on ) )
 | |
|       n-- ;
 | |
| #endif
 | |
| 
 | |
|     final_pos = (int)( n * pos ) ;
 | |
|     if ( final_pos == n )
 | |
|       final_pos-- ;
 | |
| 
 | |
| #ifdef S4FOX
 | |
|     b4go( block_on, final_pos ) ;
 | |
| #else
 | |
|     block_on->key_on = final_pos ;
 | |
| #endif
 | |
| 
 | |
|     pos = pos*n - final_pos ;
 | |
| 
 | |
|     rc = t4down( t4 ) ;
 | |
|     if ( rc < 0 )
 | |
|       return -1 ;
 | |
|     if ( rc == 1 )
 | |
|       return 0 ;
 | |
|   }
 | |
| }
 | |
| 
 | |
| #endif   /*  ifndef N4OTHER  */
 | |
| 
 | |
| #ifdef N4OTHER
 | |
| 
 | |
| double S4FUNCTION t4positionDbl( TAG4 *t4 )
 | |
| {
 | |
|   return t4position( t4 ) ;
 | |
| }
 | |
| 
 | |
| double S4FUNCTION t4position( TAG4 *t4 )
 | |
| {
 | |
|   double pos ;
 | |
|   B4BLOCK *block_on ;
 | |
|   int n ;
 | |
| #ifdef S4CLIPPER
 | |
|   int first = 1 ;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4DEBUG
 | |
|   if ( t4 == 0 )
 | |
|     e4severe( e4parm, E4_T4POSITION ) ;
 | |
| #endif
 | |
| 
 | |
|   if ( t4->code_base->error_code < 0 )
 | |
|     return -1 ;
 | |
| 
 | |
|   block_on = (B4BLOCK *) t4->blocks.last_node ;
 | |
| 
 | |
|   if ( !b4leaf(block_on) )
 | |
|     pos = 1.0 ;
 | |
|   else
 | |
|     pos = .5 ;
 | |
| 
 | |
|   for ( ; block_on != 0 ; )
 | |
|   {
 | |
|     n = block_on->n_keys + 1 ;
 | |
| #ifdef S4CLIPPER
 | |
|     if ( first )
 | |
|     {
 | |
|       if ( b4leaf( block_on ) )
 | |
|         n-- ;
 | |
|       first = 0 ;
 | |
|     }
 | |
| #else
 | |
|     if ( b4leaf( block_on ) )
 | |
|       n-- ;
 | |
| #endif
 | |
| 
 | |
|     if( n == 0 )
 | |
|       pos = 0.0 ;
 | |
|     else
 | |
|       pos = ( block_on->key_on + pos ) / n ;
 | |
| 
 | |
|     block_on = (B4BLOCK *) block_on->link.p ;
 | |
|     if ( block_on == (B4BLOCK *)t4->blocks.last_node )
 | |
|       break ;
 | |
|   }
 | |
| #ifdef S4CLIPPER
 | |
|   if ( t4->header.descending )   /* backwards in file... */
 | |
|     return 1.0 - pos ;
 | |
|   else
 | |
| #endif
 | |
|     return pos ;
 | |
| }
 | |
| 
 | |
| int S4FUNCTION t4position_set( TAG4 *t4, double pos )
 | |
| {
 | |
|   int rc, n, final_pos ;
 | |
|   B4BLOCK *block_on ;
 | |
| 
 | |
| #ifdef S4DEBUG
 | |
|   if ( t4 == 0 )
 | |
|     e4severe( e4parm, E4_T4POSITION_SET ) ;
 | |
| #endif
 | |
| 
 | |
|   if ( t4->code_base->error_code < 0 )
 | |
|     return -1 ;
 | |
| 
 | |
| #ifdef S4CLIPPER
 | |
|   if ( t4->header.descending )   /* backwards in file... */
 | |
|     pos = 1.0 - pos ;
 | |
| #endif
 | |
| 
 | |
|   if ( t4up_to_root( t4 ) < 0 )
 | |
|     return -1 ;
 | |
| 
 | |
|   for(;;)
 | |
|   {
 | |
| #ifdef S4DEBUG
 | |
|     if ( pos < 0.0 || pos > 1.0 )  /* Could be caused by rounding error ? */
 | |
|       e4severe( e4parm, E4_INFO_ILP ) ;
 | |
| #endif
 | |
| 
 | |
|     block_on = t4block( t4 ) ;
 | |
| 
 | |
|     n = block_on->n_keys + 1 ;
 | |
|     if ( b4leaf( block_on ) )
 | |
|       n-- ;
 | |
| 
 | |
|     final_pos = (int)( n * pos ) ;
 | |
|     if ( final_pos == n )
 | |
|       final_pos-- ;
 | |
| 
 | |
|     block_on->key_on = final_pos ;
 | |
|     pos = pos*n - final_pos ;
 | |
| 
 | |
|     rc = t4down( t4 ) ;
 | |
|     if ( rc < 0 )
 | |
|       return -1 ;
 | |
|     if ( rc == 1 )
 | |
|       return 0 ;
 | |
|   }
 | |
| }
 | |
| 
 | |
| #endif  /* N4OTHER */
 | |
| #endif  /* S4INDEX_OFF */
 |