155 lines
3.8 KiB
C
155 lines
3.8 KiB
C
|
/* 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 ;
|
||
|
}
|
||
|
|
||
|
|