campo-sirio/cb5/e4calc_2.c

155 lines
3.8 KiB
C
Raw Normal View History

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