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
		
			
				
	
	
		
			277 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			277 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* x4filter.c   (c)Copyright Sequiter Software Inc., 1990-1992.  All rights reserved. */
 | |
| 
 | |
| #include "d4all.h"
 | |
| #include "x4filter.h"
 | |
| 
 | |
| #ifndef S4UNIX
 | |
| #ifdef __TURBOC__
 | |
| #pragma hdrstop
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| void S4FUNCTION x4init_work( X4FILTER *filter, DATA4 *data, X4FUNCTION *routine, void *routine_data )
 | |
| {
 | |
|   filter->data      =  data ;
 | |
|   filter->routine   =  routine ;
 | |
|   filter->routine_data =  routine_data ;
 | |
| }
 | |
| 
 | |
| int  S4FUNCTION x4bottom( X4FILTER *x4 )
 | |
| {
 | |
|   int rc ;
 | |
|   DATA4 *d4 ;
 | |
| 
 | |
|   d4 =  x4->data ;
 | |
| 
 | |
|   if ( (rc = d4bottom(d4)) != 0 )  return rc ;
 | |
|   rc = x4find_good(x4,-1) ;
 | |
|   if ( rc == r4keep )
 | |
|     return 0 ;
 | |
|   if ( rc == r4bof )
 | |
|   {
 | |
|     d4->bof_flag =  1 ;
 | |
|     return x4filter_go_eof(x4) ;
 | |
|   }
 | |
|   return rc ;
 | |
| }
 | |
| 
 | |
| int  S4FUNCTION x4filter_test( X4FILTER *x4 )
 | |
| {
 | |
| #ifndef S4UNIX
 | |
| #ifdef S4DEBUG
 | |
| #if ! (defined __ZTC__ && defined S4MEDIUM)
 | |
|   if (u4ptr_equal( x4->routine, 0))
 | |
|     e4severe( e4info, "x4filter_test()");
 | |
| #endif
 | |
| #endif
 | |
| #endif
 | |
|   return (*x4->routine)( x4->routine_data ) ;
 | |
| }
 | |
| 
 | |
| int  x4find_good( X4FILTER *x4, int sign )
 | |
| {
 | |
|   int rc ;
 | |
|   for(;;)
 | |
|   {
 | |
|     rc = x4filter_test(x4) ;
 | |
|     if ( rc != r4ignore )   return rc ;
 | |
|     if ( (rc = d4skip(x4->data, (long) sign)) != 0 )  return rc ;
 | |
|   }
 | |
| }
 | |
| 
 | |
| int  x4filter_go_eof( X4FILTER *x4 )
 | |
| {
 | |
|   int rc ;
 | |
|   rc =  d4go_eof(x4->data) ;
 | |
|   if ( rc != r4eof )  return rc ;
 | |
|   rc = x4filter_test(x4) ;
 | |
|   if ( rc != r4keep  &&  rc != r4ignore )  return rc ;
 | |
|   return r4eof ;
 | |
| }
 | |
| 
 | |
| int  S4FUNCTION x4go( X4FILTER *x4, long new_rec )
 | |
| {
 | |
|   int rc ;
 | |
| 
 | |
|   rc =  d4go( x4->data, new_rec) ;
 | |
|   if ( rc != 0 )  return rc ;
 | |
| 
 | |
|   rc =  (*x4->routine)( x4->routine_data ) ;
 | |
|   if ( rc == r4ignore )
 | |
|     return r4entry ;
 | |
|   if ( rc == r4keep )
 | |
|     return 0 ;
 | |
|   return rc ;
 | |
| }
 | |
| 
 | |
| int  S4FUNCTION x4seek_double( X4FILTER *x4, double d )
 | |
| {
 | |
|   int rc ;
 | |
|   double d_on, diff ;
 | |
|   TAG4 *tag_ptr ;
 | |
| 
 | |
|   rc =  x4seek_do( x4, d4seek_double(x4->data,d) ) ;
 | |
|   if ( rc != 0 )  return rc ;
 | |
| 
 | |
|   /* 0 may become r4after */
 | |
|   tag_ptr =  d4tag_default(x4->data) ;
 | |
| 
 | |
|   d_on =  expr4double( tag_ptr->expr ) ;
 | |
|   if ( x4->data->code_base->error_code < 0 )  return -1 ;
 | |
| 
 | |
|   diff = d_on - d ;
 | |
|   if ( diff < -E4ACCURACY || diff > E4ACCURACY )
 | |
|     return r4after ;
 | |
| 
 | |
|   return 0 ;
 | |
| }
 | |
| 
 | |
| int  S4FUNCTION x4seek( X4FILTER *x4, char *s )
 | |
| {
 | |
|   int rc, len, compare_len ;
 | |
| #ifdef S4MDX
 | |
|   char bcd[sizeof(C4BCD)] ;
 | |
| #endif
 | |
|   char *key ;
 | |
|   double d, d_on, diff ;
 | |
|   TAG4 *tag_ptr ;
 | |
| 
 | |
|   rc =  x4seek_do( x4, d4seek( x4->data, s) ) ;
 | |
|   if ( rc != 0 )  return rc ;
 | |
| 
 | |
|   /* 0 return may become r4after. */
 | |
|   tag_ptr =  d4tag_default(x4->data) ;
 | |
|   len =  strlen(s) ;
 | |
| 
 | |
|   /* do the search according to the tag type */
 | |
|   switch ( t4type(tag_ptr) )
 | |
|   {
 | |
| #ifndef S4MDX
 | |
|   case r4num_doub:
 | |
|     d    =  c4atod( s, len ) ;
 | |
|     d_on =  expr4double(tag_ptr->expr) ;
 | |
|     if ( x4->data->code_base->error_code < 0 )  return -1 ;
 | |
| 
 | |
|     diff = d_on - d ;
 | |
|     if ( diff < -E4ACCURACY || diff > E4ACCURACY )
 | |
|       return r4after ;
 | |
| 
 | |
|     return 0 ;
 | |
| #else
 | |
|   case r4num_doub:
 | |
|     d    =  c4atod( s, len ) ;
 | |
|     d_on =  expr4double(tag_ptr->expr) ;
 | |
|     if ( x4->data->code_base->error_code < 0 )  return -1 ;
 | |
| 
 | |
|     diff = d_on - d ;
 | |
|     if ( diff < -E4ACCURACY || diff > E4ACCURACY )
 | |
|       return r4after ;
 | |
| 
 | |
|     return 0 ;
 | |
| 
 | |
|   case r4date_doub:
 | |
|     d    = (double) date4long(s) ;
 | |
|     d_on = expr4double(tag_ptr->expr) ;
 | |
| 
 | |
|     if ( x4->data->code_base->error_code < 0 )  return -1 ;
 | |
| 
 | |
|     diff = d_on - d ;
 | |
|     if ( diff < -E4ACCURACY || diff > E4ACCURACY )
 | |
|       return r4after ;
 | |
| 
 | |
|     return 0 ;
 | |
| 
 | |
|   case r4num:
 | |
|     c4bcd_from_a( bcd, s, len ) ;
 | |
| 
 | |
|     if ( expr4key( tag_ptr->expr, &key ) < 0 )
 | |
|       return -1 ;
 | |
| 
 | |
|     if (u4memcmp( bcd, key, sizeof(C4BCD)) == 0 )
 | |
|       return 0 ;
 | |
|     break ;
 | |
| #endif
 | |
| 
 | |
|     default :
 | |
|     if ( (compare_len = expr4key( tag_ptr->expr, &key)) < 0 )
 | |
|       return -1 ;
 | |
| 
 | |
|     if ( len < compare_len )
 | |
|       compare_len =  len ;
 | |
| 
 | |
|     if ( memcmp( key, s, compare_len ) == 0 )
 | |
|       return 0 ;
 | |
|     break ;
 | |
|   }
 | |
| 
 | |
|   return r4after ;
 | |
| }
 | |
| 
 | |
| int  x4seek_do( X4FILTER *x4, int seek_rc )
 | |
| {
 | |
|   int rc ;
 | |
| 
 | |
|   if ( seek_rc != r4after  &&  seek_rc != 0 )
 | |
|     return seek_rc ;
 | |
| 
 | |
|   rc =  x4find_good( x4, 1) ;
 | |
|   if ( rc != r4keep )  return rc ;
 | |
| 
 | |
|   return seek_rc ;
 | |
| }
 | |
| 
 | |
| int  S4FUNCTION x4skip( X4FILTER *x4, long n )
 | |
| {
 | |
|   CODE4 *c4 ;
 | |
|   DATA4 *d4 ;
 | |
|   int  sign, rc, save_flag ;
 | |
|   long good_rec ; 
 | |
| 
 | |
|   d4 =  x4->data ;
 | |
|   c4 =  d4->code_base ;
 | |
|   if ( c4->error_code < 0 )  return -1 ;
 | |
| 
 | |
|   if ( n < 0 )
 | |
|   {
 | |
|     n = -n ;
 | |
|     sign = -1 ;
 | |
|   }
 | |
|   else
 | |
|     sign =  1 ;
 | |
| 
 | |
|   while ( n-- )  /* skip a record */
 | |
|   {
 | |
|     good_rec =  d4recno( d4 ) ;
 | |
|     if (r4locked == d4skip( x4->data, sign) )
 | |
|       return r4locked ;
 | |
|     rc = x4find_good(x4, sign) ;
 | |
| 
 | |
|     if ( rc != r4keep )
 | |
|     {
 | |
|       if ( rc != r4eof && rc != r4bof )  return rc ;
 | |
| 
 | |
|       if ( sign > 0 )
 | |
|       {
 | |
|         if ( (rc = x4filter_go_eof(x4)) != r4eof )  return rc ;
 | |
|         return r4eof ;
 | |
|       }
 | |
|       
 | |
|       save_flag =  c4->go_error ;
 | |
|       c4->go_error =  0 ;
 | |
|       rc =  d4go( x4->data, good_rec ) ;
 | |
|       c4->go_error =  save_flag ;
 | |
|       d4->bof_flag =  1 ;
 | |
|       if ( rc != 0 )  return rc ;
 | |
|       return r4bof ;
 | |
|     }
 | |
|   }
 | |
|   if ( sign < 0 )
 | |
|   {
 | |
|     if ( d4->bof_flag )
 | |
|       return r4bof ;
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     if ( d4->eof_flag )
 | |
|       return r4eof ;
 | |
|   }
 | |
|   return 0 ;
 | |
| }
 | |
| 
 | |
| int  S4FUNCTION x4top( X4FILTER *x4 )
 | |
| {
 | |
|   int        rc ;
 | |
| 
 | |
|   if ( (rc = d4top(x4->data)) != 0 )  return rc ;
 | |
|   rc =  x4find_good(x4, 1) ;
 | |
|   if ( rc == r4keep )
 | |
|     return 0 ;
 | |
|   if ( rc == r4eof )
 | |
|   {
 | |
|     x4->data->bof_flag =  1 ;
 | |
|     if ( (rc = x4filter_go_eof(x4)) != r4eof )  return rc ;
 | |
|     return r4eof ;
 | |
|   }
 | |
|   return rc ;
 | |
| }
 |