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
		
			
				
	
	
		
			155 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* e4calc_2.c (c)Copyright Sequiter Software Inc., 1991-1994. All rights reserved. */
 | 
						|
 | 
						|
#include "d4all.h"
 | 
						|
#ifndef S4UNIX
 | 
						|
#ifdef ___TURBOC__
 | 
						|
#pragma hdrstop
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
int S4FUNCTION expr4calc_remove( EXPR4CALC *calc, int remove_all )
 | 
						|
{
 | 
						|
  LIST4 save_calc_list, temp_calc_list ;
 | 
						|
  EXPR4CALC *calc_on ;
 | 
						|
  CODE4 *c4base = calc->expr->code_base ;
 | 
						|
  int transfered_one ;
 | 
						|
  EXPR4 *expr ;
 | 
						|
 | 
						|
  memcpy( &save_calc_list, &c4base->calc_list, sizeof( save_calc_list ) ) ;
 | 
						|
  memcpy( &temp_calc_list, &c4base->calc_list, sizeof( save_calc_list ) ) ;
 | 
						|
  memset( &c4base->calc_list, 0, sizeof( c4base->calc_list ) ) ;
 | 
						|
 | 
						|
  l4remove( &temp_calc_list, calc ) ;
 | 
						|
 | 
						|
  /* Check other calculations */
 | 
						|
  for( transfered_one = 1; transfered_one; )
 | 
						|
  {
 | 
						|
    transfered_one = 0 ;
 | 
						|
    for( calc_on = (EXPR4CALC *) l4first(&temp_calc_list); calc_on; )
 | 
						|
    {
 | 
						|
      EXPR4CALC *calc_next = (EXPR4CALC *)l4next( &temp_calc_list, calc_on ) ;
 | 
						|
 | 
						|
      c4base->expr_error = 0 ;
 | 
						|
      expr = expr4parse( calc_on->expr->data, expr4source( calc_on->expr ) ) ;
 | 
						|
      c4base->expr_error = 1 ;
 | 
						|
      if( expr )
 | 
						|
      {
 | 
						|
        expr4free( expr ) ;
 | 
						|
        l4remove( &temp_calc_list, calc_on ) ;
 | 
						|
        l4add( &c4base->calc_list, calc_on ) ;
 | 
						|
        transfered_one = 1 ;
 | 
						|
      }
 | 
						|
 | 
						|
      calc_on = calc_next ;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  if( remove_all == 0 )
 | 
						|
  {
 | 
						|
    if( temp_calc_list.n_link > 0 )
 | 
						|
    {
 | 
						|
      l4add( &temp_calc_list, calc ) ;
 | 
						|
      for( ;; )
 | 
						|
      {
 | 
						|
        calc_on = (EXPR4CALC *)l4pop( &temp_calc_list ) ;
 | 
						|
        if ( calc_on == 0 )
 | 
						|
          break ;
 | 
						|
        l4add( &c4base->calc_list, calc_on ) ;
 | 
						|
      }
 | 
						|
      return 1 ;
 | 
						|
    }
 | 
						|
    l4add( &c4base->calc_list, calc ) ;
 | 
						|
    return 0 ;
 | 
						|
  }
 | 
						|
 | 
						|
  /* Remove calculations */
 | 
						|
  l4add( &temp_calc_list, calc ) ;
 | 
						|
 | 
						|
  for( ;; )
 | 
						|
  {
 | 
						|
    calc_on = (EXPR4CALC *)l4pop( &temp_calc_list ) ;
 | 
						|
    if ( calc_on == 0 )
 | 
						|
      break ;
 | 
						|
    l4add( &c4base->calc_list, calc_on ) ;
 | 
						|
    expr4calc_delete( calc_on ) ;
 | 
						|
  }
 | 
						|
 | 
						|
  return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
int S4FUNCTION expr4calc_modify( EXPR4CALC *calc, char *expr_source )
 | 
						|
{
 | 
						|
  EXPR4 *expr ;
 | 
						|
  EXPR4CALC *next_calc, *calc_next ;
 | 
						|
  CODE4 *code_base ;
 | 
						|
  LIST4 save_calc_list, temp_calc_list ;
 | 
						|
  EXPR4CALC *calc_on ;
 | 
						|
  CODE4 *c4base = calc->expr->code_base ;
 | 
						|
  int transfered_one ;
 | 
						|
 | 
						|
  memcpy( &save_calc_list, &c4base->calc_list, sizeof( save_calc_list ) ) ;
 | 
						|
  memcpy( &temp_calc_list, &c4base->calc_list, sizeof( save_calc_list ) ) ;
 | 
						|
  memset( &c4base->calc_list, 0, sizeof( c4base->calc_list ) ) ;
 | 
						|
 | 
						|
  l4remove( &temp_calc_list, calc ) ;
 | 
						|
 | 
						|
  /* Check other calculations */
 | 
						|
  for( transfered_one = 1; transfered_one; )
 | 
						|
  {
 | 
						|
    transfered_one = 0 ;
 | 
						|
    for( calc_on = (EXPR4CALC *)l4first(&temp_calc_list); calc_on ; )
 | 
						|
    {
 | 
						|
      calc_next = (EXPR4CALC *)l4next( &temp_calc_list, calc_on ) ;
 | 
						|
 | 
						|
      c4base->expr_error = 0 ;
 | 
						|
      expr = expr4parse( calc_on->expr->data, expr4source( calc_on->expr ) ) ;
 | 
						|
      c4base->expr_error = 1 ;
 | 
						|
      if( expr )
 | 
						|
      {
 | 
						|
        expr4free( expr ) ;
 | 
						|
        l4remove( &temp_calc_list, calc_on ) ;
 | 
						|
        l4add( &c4base->calc_list, calc_on ) ;
 | 
						|
        transfered_one = 1 ;
 | 
						|
      }
 | 
						|
 | 
						|
      calc_on = calc_next ;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  expr = expr4parse( calc->expr->data, expr_source ) ;
 | 
						|
 | 
						|
  l4add( &c4base->calc_list, calc ) ;
 | 
						|
  if( temp_calc_list.n_link > 0 )
 | 
						|
    for( ;; )
 | 
						|
    {
 | 
						|
      calc_on = (EXPR4CALC *)l4pop( &temp_calc_list ) ;
 | 
						|
      if ( calc_on == 0 )
 | 
						|
        break ;
 | 
						|
      l4add( &c4base->calc_list, calc_on ) ;
 | 
						|
    }
 | 
						|
 | 
						|
  if( expr == 0 )
 | 
						|
    return -1 ;
 | 
						|
 | 
						|
  expr4free( calc->expr ) ;
 | 
						|
  calc->expr = expr ;
 | 
						|
  expr4calc_massage( calc ) ;
 | 
						|
 | 
						|
  next_calc = (EXPR4CALC *)l4first( &c4base->calc_list ) ;
 | 
						|
  while( next_calc )
 | 
						|
  {
 | 
						|
    expr = expr4parse( next_calc->expr->data, expr4source( next_calc->expr ) ) ;
 | 
						|
    if( expr == 0 )
 | 
						|
      return -1 ;
 | 
						|
 | 
						|
    expr4free( next_calc->expr ) ;
 | 
						|
    next_calc->expr = expr ;
 | 
						|
    expr4calc_massage( next_calc ) ;
 | 
						|
    next_calc = (EXPR4CALC *)l4next( &c4base->calc_list, next_calc ) ;
 | 
						|
  }
 | 
						|
 | 
						|
  return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
 |