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