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 ;
 | 
						|
}
 |