campo-sirio/cb5/e4functi.c

876 lines
22 KiB
C
Raw Normal View History

/* e4functi.c (c)Copyright Sequiter Software Inc., 1990-1994. All rights reserved. */
#include "d4all.h"
#ifndef S4UNIX
#ifdef __TURBOC__
#pragma hdrstop
#endif
#endif
#ifndef S4NO_POW
#include <math.h>
#endif
#ifndef S4OFF_REPORT
double S4FUNCTION total4value( TOTAL4 *t4 );
#endif
E4FUNCTIONS v4functions[] =
{
/* function, name, code, name_len, priority, return_type, num_parms, type[]*/
{ e4field_add, 0, 0, 0, 0, r4str, 0, 0, 0, 0 }, /* E4FIELD_STR */
{ e4field_copy, 0, 1, 0, 0, r4str, 0, 0, 0, 0 }, /* E4FIELD_STR_CAT */
{ e4field_log, 0, 2, 0, 0, r4log, 0, 0, 0, 0 }, /* E4FIELD_LOG */
{ e4field_date_d, 0, 3, 0, 0, r4date_doub, 0, 0, 0, 0 }, /* E4FIELD_DATE_D */
{ e4field_add, 0, 4, 0, 0, r4date, 0, 0, 0, 0 }, /* E4FIELD_DATE_S */
{ e4field_num_d, 0, 5, 0, 0, r4num_doub, 0, 0, 0, 0 }, /* E4FIELD_NUM_D */
{ e4field_add, 0, 6, 0, 0, r4num, 0, 0, 0, 0 }, /* E4FIELD_NUM_S */
#ifdef S4MEMO_OFF
{ 0, 0, 7, 0, 0, r4str, 0, 0, 0, 0 },
#else
{ e4field_memo, 0, 7, 0, 0, r4str, 0, 0, 0, 0 }, /* E4FIELD_MEMO */
#endif
{ e4copy_constant, 0, 8, 0, 0, r4num_doub, 0, 0, 0, 0 }, /* E4DOUBLE */
{ e4copy_constant, 0, 9, 0, 0, r4str, 0, 0, 0, 0 }, /* E4STRING */
{ expr4true_function, ".TRUE.", 14, 6, 0, r4log, 0, 0, 0, 0 },
{ expr4true_function, ".T.", 14, 3, 0, r4log, 0, 0, 0, 0 },
{ e4false, ".FALSE.",16, 7, 0, r4log, 0, 0, 0, 0 },
{ e4false, ".F.", 16, 3, 0, r4log, 0, 0, 0, 0 },
{ e4not, ".NOT.", 18, 5, 5, r4log, 1, r4log, 0, 0 },
{ e4or, ".OR.", 20, 4, 3, r4log, -1, r4log, 0, 0 }, /* Flexible # of parms.*/
{ e4and, ".AND.", 22, 5, 4, r4log, -1, r4log, 0, 0 },
{ e4parm_remove, "+", 25, 1, 7, r4str, 2, r4str, r4str, 0 }, /* Concatenate */
{ e4concat_trim, 0, 25, 0, 7, r4str, 2, r4str, r4str, 0 }, /* Concatenate */
{ e4add, 0, 25, 0, 7, r4num_doub, 2, r4num_doub, r4num_doub, 0 },
{ e4add_date, 0, 25, 0, 7, r4date_doub, 2, r4num_doub, r4date_doub, 0 },
{ e4add_date, 0, 25, 0, 7, r4date_doub, 2, r4date_doub,r4num_doub, 0 },
{ e4concat_two, "-", 30, 1, 7, r4str, 2, r4str, r4str, 0 },
{ e4sub, 0, 30, 0, 7, r4num_doub, 2, r4num_doub, r4num_doub, 0 },
{ e4sub_date, 0, 30, 0, 7, r4num_doub, 2, r4date_doub, r4date_doub, 0 },
{ e4sub_date, 0, 30, 0, 7, r4date_doub, 2, r4date_doub, r4num_doub, 0 },
{ e4equal, "=", 40, 1, 6, r4log, 2, r4str, r4str, 0 },
{ e4equal, 0, 40, 0, 6, r4log, 2, r4log, r4log, 0 },
{ e4equal, 0, 40, 0, 6, r4log, 2, r4num_doub, r4num_doub, 0 },
{ e4equal, 0, 40, 0, 6, r4log, 2, r4date_doub, r4date_doub, 0 },
{ e4not_equal, "#", 50, 1, 6, r4log, 2, r4str, r4str, 0 },
{ e4not_equal, "<>", 50, 2, 6, r4log, 2, r4str, r4str, 0 },
{ e4not_equal, 0, 50, 0, 6, r4log, 2, r4num_doub, r4num_doub, 0 },
{ e4not_equal, 0, 50, 0, 6, r4log, 2, r4date_doub, r4date_doub, 0 },
{ e4not_equal, 0, 50, 0, 6, r4log, 2, r4log, r4log, 0 },
{ e4greater_eq, ">=", 60, 2, 6, r4log, 2, r4str, r4str, 0 },
{ e4greater_eq_doub, 0, 60, 0, 6, r4log, 2, r4num_doub, r4num_doub, 0 },
{ e4greater_eq_doub, 0, 60, 0, 6, r4log, 2, r4date_doub,r4date_doub, 0 },
{ e4less_eq, "<=", 70, 2, 6, r4log, 2, r4str, r4str, 0 },
{ e4less_eq_doub, 0, 70, 0, 6, r4log, 2, r4num_doub, r4num_doub, 0 },
{ e4less_eq_doub, 0, 70, 0, 6, r4log, 2, r4date_doub,r4date_doub, 0 },
{ e4greater, ">", 80, 1, 6, r4log, 2, r4str, r4str, 0 },
{ e4greater_doub, 0, 80, 0, 6, r4log, 2, r4num_doub, r4num_doub, 0 },
{ e4greater_doub, 0, 80, 0, 6, r4log, 2, r4date_doub, r4date_doub, 0 },
{ e4less, "<", 90, 1, 6, r4log, 2, r4str, r4str, 0 },
{ e4less_doub, 0, 90, 0, 6, r4log, 2, r4num_doub, r4num_doub, 0 },
{ e4less_doub, 0, 90, 0, 6, r4log, 2, r4date_doub, r4date_doub, 0 },
#ifdef S4NO_POW
{ 0, 0, 95, 0, 0, r4num_doub, 2, r4num_doub, 0, 0 },
{ 0, 0, 95, 0, 0, r4num_doub, 2, r4num_doub, 0, 0 },
#else
{ e4power, "^", 100, 1, 9, r4num_doub, 2, r4num_doub, r4num_doub, 0},
{ e4power, "**", 100, 2, 9, r4num_doub, 2, r4num_doub, r4num_doub, 0},
#endif
{ e4multiply, "*", 102, 1, 8, r4num_doub, 2, r4num_doub, r4num_doub, 0},
{ e4divide, "/", 105, 1, 8, r4num_doub, 2, r4num_doub, r4num_doub, 0},
{ e4contain, "$", 110, 1, 6, r4log, 2, r4str, r4str, 0 },
{ e4del, "DEL", 130, 3, 0, r4str, 0, 0, 0, 0 },
{ e4str, "STR", 140, 3, 0, r4str, 1, r4num_doub, 0 },
{ e4substr, "SUBSTR",150, 6, 0, r4str, 1, r4str, 0 },
{ e4time, "TIME", 160, 4, 0, r4str, 0, 0, 0, 0 },
{ e4upper, "UPPER", 170, 5, 0, r4str, 1, r4str, 0, 0 },
{ e4copy_parm,"DTOS",180, 4, 0, r4str, 1, r4date, 0, 0 },
{ e4dtos_doub, 0, 180, 0, 0, r4str, 1, r4date_doub, 0, 0 },
{ e4dtoc, "DTOC",200, 4, 0, r4str, 1, r4date, 0, 0 },
{ e4dtoc_doub, 0,200, 4, 0, r4str, 1, r4date_doub, 0, 0},
{ e4trim, "TRIM",220, 4, 0, r4str, 1, r4str, 0, 0 },
{ e4ltrim, "LTRIM",230, 5, 0, r4str, 1, r4str, 0, 0 },
{ e4substr, "LEFT",240, 4, 0, r4str, 1, r4str, 0, 0 },
{ e4iif, "IIF", 250, 3, 0, r4str, 3, r4log, r4str, r4str },
{ e4iif, 0, 250, 0, 0, r4num_doub, 3, r4log, r4num_doub, r4num_doub},
{ e4iif, 0, 250, 0, 0, r4date_doub, 3, r4log, r4date_doub, r4date_doub},
{ e4iif, 0, 250, 0, 0, r4log, 3, r4log, r4log, r4log },
{ e4stod, "STOD", 260, 4, 0, r4date_doub, 1, r4str, 0, 0 },
{ e4ctod, "CTOD", 270, 4, 0, r4date_doub, 1, r4str, 0, 0 },
{ e4date, "DATE", 280, 4, 0, r4date_doub, 0, 0, 0, 0 },
{ e4day, "DAY", 290, 3, 0, r4num_doub, 1, r4date, 0, 0 },
{ e4day_doub, 0, 290, 0, 0, r4num_doub, 1, r4date_doub, 0, 0 },
{ e4month, "MONTH", 310, 5, 0, r4num_doub, 1, r4date, 0, 0 },
{ e4month_doub, 0, 310, 0, 0, r4num_doub, 1, r4date_doub },
{ e4year, "YEAR", 340, 4, 0, r4num_doub, 1, r4date, 0, 0 },
{ e4year_doub, 0, 340, 0, 0, r4num_doub, 1, r4date_doub, 0, 0 },
{ e4deleted, "DELETED", 350, 7, 0, r4log, 0, 0, 0, 0 },
{ e4reccount, "RECCOUNT", 360, 8, 0, r4num_doub, 0, 0, 0, 0 },
{ e4recno, "RECNO", 370, 5, 0, r4num_doub, 0, 0, 0, 0 },
{ e4val, "VAL", 380, 3, 0, r4num_doub, 1, r4str, 0, 0 },
#ifndef S4OFF_REPORT
{ e4calc_function, 0, 390, 0, 0, 0, 0, 0, 0, 0 },
{ e4calc_total, 0, 400, 0, 0, r4num_doub, 0, 0, 0, 0 },
{ e4pageno, "PAGENO", 410, 6, 0, r4num_doub, 0, 0, 0, 0 },
#else
{ 0, 0, 390, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 400, 0, 0, r4num_doub, 0, 0, 0, 0 },
{ 0, 0, 410, 6, 0, r4num_doub, 0, 0, 0, 0 },
#endif
#ifndef S4UNIX
#ifdef S4CLIPPER
/* DESCEND(NUM_VALUE) and DESCEND(DATE_VALUE) are now not supported.*/
/* { e4descend_num_doub, "DESCEND",420, 7, 0, r4num, 1, r4num_doub, 0, 0 },*/
/* { e4descend_num_str, "DESCEND",420, 7, 0, r4num, 1, r4num, 0, 0 },*/
{ e4descend_str, "DESCEND", 420, 7, 0, r4str, 1, r4str, 0, 0 },
/* { e4descend_date_doub, 0, 420, 0, 0, r4date,1, r4date_doub, 0, 0 }, */
#endif
#endif
{ 0,0,-1, 0, 0, 0, 0, 0, 0, 0 },
} ;
void S4FUNCTION expr4functions( E4FUNCTIONS **fptr )
{
*fptr = v4functions ;
}
void e4add()
{
double *double_ptr = (double *) (expr4buf + expr4info_ptr->result_pos) ;
*double_ptr = *(double *)expr4[-2] + *(double *)expr4[-1] ;
expr4[-2] = (char *) double_ptr ;
expr4-- ;
}
void e4add_date()
{
if ( v4functions[expr4info_ptr->function_i].type[0] == r4date_doub )
{
if ( *(double *)expr4[-2] == 0.0 )
{
*(double *)expr4-- = 0.0 ;
return ;
}
}
else
{
if ( *(double *)expr4[-1] == 0.0 )
{
*(double *)expr4-- = 0.0 ;
return ;
}
}
e4add() ;
}
void e4and()
{
int i ;
expr4 -= expr4info_ptr->num_parms ;
for( i = expr4info_ptr->num_parms-1 ; i > 0 ; i-- )
*(int *) expr4[0] = * (int *) expr4[i] && * (int *) expr4[0] ;
expr4++ ;
}
/* The total length of the result is in 'expr4info_ptr->len'. */
void e4concat_special( char move_char )
{
int num_chars, pos, first_len = expr4info_ptr[-expr4info_ptr[-1].num_entries-1].len ;
char *ptr = expr4[-2] ;
for ( pos = first_len-1; pos >= 0; pos-- )
if ( ptr[pos] != move_char )
break ;
if ( ++pos < first_len )
{
int len_two = expr4info_ptr->len - first_len ;
memmove( ptr+ pos, expr4[-1], len_two ) ;
num_chars = first_len - pos ;
memset( ptr+expr4info_ptr->len-num_chars, move_char, num_chars ) ;
}
expr4-- ;
}
void e4concat_trim()
{
e4concat_special(0) ;
}
void e4concat_two()
{
e4concat_special(' ') ;
}
void e4contain()
{
int a_len, comp_len, i ;
char first_char, *b_ptr ;
int log_result = 0 ;
a_len = expr4info_ptr[-expr4info_ptr[-1].num_entries-1].len ;
first_char = *expr4[-2] ;
comp_len = expr4info_ptr[-1].len - a_len ;
b_ptr = expr4[-1] ;
/* See if there is a match */
for ( i=0; i <= comp_len; i++ )
if ( first_char == b_ptr[i] )
if ( u4memcmp( expr4[-2], b_ptr+i, (size_t) a_len ) == 0 )
{
log_result = 1 ;
break ;
}
expr4[-2] = expr4buf + expr4info_ptr->result_pos ;
*(int *) expr4[-2] = log_result ;
expr4-- ;
}
void e4copy_constant()
{
void *ptr = *expr4++ = expr4buf+expr4info_ptr->result_pos ;
#ifdef S4DEBUG
if ( ptr == 0 )
e4severe( e4info, E4_PARM_NSD ) ;
#endif
memcpy( ptr, expr4constants+ expr4info_ptr->i1, expr4info_ptr->len ) ;
}
void e4field_copy()
{
void *ptr = *expr4++ = expr4buf+expr4info_ptr->result_pos ;
#ifdef S4DEBUG
if ( ptr == 0 )
e4severe( e4info, E4_PARM_NSD ) ;
#endif
memcpy( ptr, *(char **)expr4info_ptr->p1 + expr4info_ptr->i1, expr4info_ptr->len ) ;
}
void e4copy_parm()
{
void *ptr = expr4[-1] ;
expr4[-1] = expr4buf + expr4info_ptr->result_pos ;
#ifdef S4DEBUG
if ( ptr == 0 )
e4severe( e4info, E4_PARM_NSD ) ;
#endif
memcpy( expr4[-1], ptr, expr4info_ptr->len ) ;
}
void e4ctod()
{
char buf[8] ;
double d ;
date4init( buf, expr4[-1], expr4constants+ expr4info_ptr->i1 ) ;
expr4[-1] = expr4buf + expr4info_ptr->result_pos ;
d = date4long( buf ) ;
memcpy( expr4[-1], (void *)&d, sizeof(d) ) ;
}
void e4date()
{
char date_buf[8] ;
date4today( date_buf ) ;
*expr4++ = expr4buf + expr4info_ptr->result_pos ;
*((double *) expr4[-1]) = (double) date4long( date_buf ) ;
}
void e4day()
{
double d ;
d = (double) date4day( expr4[-1] ) ;
expr4[-1] = expr4buf + expr4info_ptr->result_pos ;
*(double *) expr4[-1] = d ;
}
void e4day_doub()
{
char date_buf[8] ;
date4assign( date_buf, (long) *(double *)expr4[-1] ) ;
expr4[-1] = expr4buf + expr4info_ptr->result_pos ;
*(double *) expr4[-1] = (double) date4day( date_buf ) ;
}
void e4del()
{
expr4[0] = expr4buf + expr4info_ptr->result_pos ;
expr4[0][0] = *( *(char **)expr4info_ptr->p1) ;
expr4++ ;
}
void e4deleted()
{
int result = 0 ;
#ifdef S4DEBUG
if ( *( *(char **)expr4info_ptr->p1 ) != '*' && *( *(char **)expr4info_ptr->p1 ) != ' ' )
e4severe( e4info, E4_EXPR_DELETED ) ;
#endif
if ( *( *(char **)expr4info_ptr->p1 ) == '*' )
result = 1 ;
*(int *) (*expr4++ = expr4buf + expr4info_ptr->result_pos ) = result ;
}
void e4divide()
{
double doub ;
double *result_ptr = (double *) (expr4buf + expr4info_ptr->result_pos) ;
memcpy( (void *)&doub, (void *)expr4[-1], sizeof(double ) ) ;
if ( doub == 0.0 )
*result_ptr = 0.0 ;
else
*result_ptr = *(double *)expr4[-2] / *(double *) expr4[-1] ;
expr4[-2] = (char *) result_ptr ;
expr4-- ;
}
void e4dtoc()
{
char buf[sizeof(expr4ptr->code_base->date_format)] ;
date4format( expr4[-1], buf, expr4constants+ expr4info_ptr->i1 ) ;
expr4[-1] = expr4buf + expr4info_ptr->result_pos ;
memcpy( expr4[-1], buf, expr4info_ptr->len ) ;
}
void e4dtoc_doub()
{
e4dtos_doub() ;
e4dtoc() ;
}
void e4dtos_doub()
{
date4assign( expr4buf + expr4info_ptr->result_pos, (long) *(double *) expr4[-1] ) ;
expr4[-1] = expr4buf + expr4info_ptr->result_pos ;
}
void e4equal()
{
int *int_ptr = (int *) (expr4buf + expr4info_ptr->result_pos) ;
*int_ptr = ! u4memcmp( expr4[-2], expr4[-1], expr4info_ptr->i1 ) ;
expr4[-2] = (char *) int_ptr ;
expr4-- ;
}
void e4false()
{
int *ptr = (int *) (*expr4++ = expr4buf+expr4info_ptr->result_pos) ;
*ptr = 0 ;
}
void e4field_date_d()
{
void *ptr = *expr4++ = expr4buf+expr4info_ptr->result_pos ;
double d = date4long( *(char **)expr4info_ptr->p1 + expr4info_ptr->i1 ) ;
#ifdef S4DEBUG
if ( ptr == 0 )
e4severe( e4info, E4_PARM_NSD ) ;
#endif
memcpy( ptr, (void *)&d, sizeof(d) ) ;
}
void e4field_log()
{
int *ptr = (int *) (*expr4++ = expr4buf+expr4info_ptr->result_pos) ;
char char_value = *(* (char **)expr4info_ptr->p1 + expr4info_ptr->i1 ) ;
if ( char_value == 'Y' || char_value == 'y' ||
char_value == 'T' || char_value == 't' )
*ptr = 1 ;
else
*ptr = 0 ;
}
#ifndef S4MEMO_OFF
void e4field_memo()
{
char *ptr, *memo_ptr ;
unsigned memo_len, copy_len, zero_len ;
ptr = *expr4++ = expr4buf + expr4info_ptr->result_pos ;
memo_len = f4memo_len( expr4info_ptr->field_ptr ) ;
memo_ptr = f4memo_ptr( expr4info_ptr->field_ptr ) ;
if( expr4ptr->code_base->error_code < 0 )
return ;
copy_len = memo_len ;
zero_len = 0 ;
if( copy_len > (unsigned) expr4info_ptr->len )
copy_len = expr4info_ptr->len ;
else
zero_len = expr4info_ptr->len - copy_len ;
#ifdef S4DEBUG
if ( ptr == 0 )
e4severe( e4info, E4_PARM_NSD ) ;
#endif
memcpy( ptr, memo_ptr, copy_len ) ;
memset( ptr + copy_len, 0, zero_len ) ;
}
#endif
void e4field_num_d()
{
void *ptr ;
double d ;
ptr = *expr4++ = expr4buf + expr4info_ptr->result_pos ;
d = c4atod( *(char **)expr4info_ptr->p1 + expr4info_ptr->i1, expr4info_ptr->len ) ;
#ifdef S4DEBUG
if ( ptr == 0 )
e4severe( e4info, E4_PARM_NSD ) ;
#endif
memcpy( ptr, (void *)&d, sizeof(d) ) ;
}
void e4greater()
{
int *int_ptr, rc ;
int_ptr = (int *)(expr4buf + expr4info_ptr->result_pos) ;
rc = u4memcmp( expr4[-2], expr4[-1], expr4info_ptr->i1 ) ;
if( rc > 0 )
*int_ptr = 1 ;
else
{
if( rc < 0 )
*int_ptr = 0 ;
else
*int_ptr = (int) ((long)expr4info_ptr->p1) ;
}
expr4[-2] = (char *) int_ptr ;
expr4-- ;
}
void e4greater_doub()
{
e4less_eq_doub() ;
*(int *)expr4[-1] = ! *(int *)expr4[-1] ;
}
void e4greater_eq()
{
e4less() ;
*((int *)expr4[-1]) = ! *((int *)expr4[-1]) ;
}
void e4greater_eq_doub()
{
int *int_ptr = (int *) (expr4buf + expr4info_ptr->result_pos) ;
int_ptr = (int *)(expr4buf + expr4info_ptr->result_pos) ;
if ( *(double *)expr4[-2] >= *(double *)expr4[-1] )
*int_ptr = 1 ;
else
*int_ptr = 0 ;
expr4[-2] = (char *) int_ptr ;
expr4-- ;
}
void e4iif()
{
if ( *(int *) expr4[-3] )
memmove( expr4buf + expr4info_ptr->result_pos, expr4[-2], expr4info_ptr->len ) ;
else
memmove( expr4buf + expr4info_ptr->result_pos, expr4[-1], expr4info_ptr->len ) ;
expr4[-3] = expr4buf + expr4info_ptr->result_pos ;
expr4-= 2 ;
}
void e4less()
{
int *int_ptr, rc ;
int_ptr = (int *)(expr4buf + expr4info_ptr->result_pos) ;
rc = u4memcmp( expr4[-2], expr4[-1], expr4info_ptr->i1 ) ;
if( rc < 0 )
*int_ptr = 1 ;
else
{
if( rc > 0 )
*int_ptr = 0 ;
else
*int_ptr = (int) ((long)expr4info_ptr->p1) ;
}
expr4[-2] = (char *) int_ptr ;
expr4-- ;
}
void e4less_doub()
{
e4greater_eq_doub() ;
*(int *)expr4[-1] = ! *(int *)expr4[-1] ;
}
void e4less_eq()
{
e4greater() ;
*((int *)expr4[-1]) = ! *((int *)expr4[-1]) ;
}
void e4less_eq_doub()
{
int *int_ptr ;
int_ptr = (int *)(expr4buf + expr4info_ptr->result_pos) ;
if ( *(double *)expr4[-2] <= *(double *)expr4[-1] )
*int_ptr = 1 ;
else
*int_ptr = 0 ;
expr4[-2] = (char *) int_ptr ;
expr4-- ;
}
void e4ltrim()
{
int n ;
char *ptr ;
for( n = 0; n < expr4info_ptr->len; n++ )
if ( expr4[-1][n] != ' ' && expr4[-1][n] != 0 )
break ;
ptr = expr4buf + expr4info_ptr->result_pos ;
memmove( ptr, expr4[-1]+n, expr4info_ptr->len - n ) ;
memset( ptr+ expr4info_ptr->len - n, 0, n ) ;
expr4[-1] = ptr ;
}
void e4month()
{
double *double_ptr = (double *) (expr4buf + expr4info_ptr->result_pos) ;
*double_ptr = (double) date4month( expr4[-1] ) ;
expr4[-1] = (char *) double_ptr ;
}
void e4month_doub()
{
char date_buf[8] ;
double *double_ptr ;
double_ptr = (double *) (expr4buf + expr4info_ptr->result_pos) ;
date4assign( date_buf, (long) *(double *)expr4[-1] ) ;
*double_ptr = (double) date4month( date_buf ) ;
expr4[-1] = (char *) double_ptr ;
}
void e4multiply()
{
double *double_ptr ;
double_ptr = (double *)(expr4buf + expr4info_ptr->result_pos) ;
*double_ptr = *(double *)expr4[-2] * *(double *)expr4[-1] ;
expr4[-2] = (char *) double_ptr ;
expr4-- ;
}
void e4nop()
{
}
void e4not()
{
int *ptr ;
ptr = (int *)expr4[-1] ;
*ptr = !*ptr ;
}
void e4not_equal()
{
int *int_ptr ;
int_ptr = (int *)(expr4buf + expr4info_ptr->result_pos) ;
*int_ptr = u4memcmp( expr4[-2], expr4[-1], expr4info_ptr->i1 ) != 0 ? 1 : 0 ;
expr4[-2] = (char *) int_ptr ;
expr4-- ;
}
void e4or()
{
int i ;
expr4 -= expr4info_ptr->num_parms ;
for( i = expr4info_ptr->num_parms-1 ; i > 0 ; i-- )
*(int *) expr4[0] = * (int *) expr4[i] || * (int *) expr4[0] ;
expr4++ ;
}
void e4field_add()
{
*expr4++ = *(char **)expr4info_ptr->p1 + expr4info_ptr->i1 ;
}
void e4parm_remove()
{
expr4-- ;
}
#ifndef S4NO_POW
void e4power()
{
double *double_ptr ;
#ifdef S4UNIX
double doub1,doub2 ;
#endif
double_ptr = (double *) (expr4buf + expr4info_ptr->result_pos) ;
#ifdef S4UNIX
memcpy( (void *)&doub2, expr4[-2], sizeof(double) ) ;
memcpy( (void *)&doub1, expr4[-1], sizeof(double) ) ;
*double_ptr = pow( doub2, doub1 ) ;
#else
*double_ptr = pow( *(double *) expr4[-2], *(double *) expr4[-1] ) ;
#endif
expr4[-2] = (char *) double_ptr ;
expr4-- ;
}
#endif
void e4reccount()
{
double d ;
d = (double)d4reccount( (DATA4 *) expr4info_ptr->p1 ) ;
memcpy( *expr4++ = expr4buf+ expr4info_ptr->result_pos, (void *)&d, sizeof(d) ) ;
}
void e4recno()
{
double d ;
d = (double) d4recno( (DATA4 *) expr4info_ptr->p1 ) ;
memcpy( *expr4++ = expr4buf+ expr4info_ptr->result_pos, (void *)&d, sizeof(d) ) ;
}
void e4stod()
{
double *double_ptr ;
double_ptr = (double *)(expr4buf + expr4info_ptr->result_pos) ;
*double_ptr = (double) date4long( expr4[-1] ) ;
expr4[-1] = (char *) double_ptr ;
}
void e4str()
{
char *ptr ;
#ifdef S4UNIX
double doub;
#endif
ptr = expr4buf + expr4info_ptr->result_pos ;
#ifdef S4UNIX
memcpy( (void *)&doub, expr4[-1], sizeof(double) );
c4dtoa45( doub, ptr, expr4info_ptr->len, expr4info_ptr->i1 ) ;
#else
c4dtoa45( *(double *) expr4[-1], ptr, expr4info_ptr->len, expr4info_ptr->i1 ) ;
#endif
expr4[-1] = ptr ;
}
void e4sub()
{
double *double_ptr ;
double_ptr = (double *)(expr4buf + expr4info_ptr->result_pos) ;
*double_ptr -= *(double *) expr4[-1] ;
expr4[-2] = (char *) double_ptr ;
expr4-- ;
}
void e4sub_date()
{
if ( v4functions[expr4info_ptr->function_i].type[0] == r4date_doub )
{
if ( *(double *)expr4[-2] == 0.0 )
{
*(double *)expr4-- = 0.0 ;
return ;
}
}
if ( v4functions[expr4info_ptr->function_i].type[1] == r4date_doub )
{
if ( *(double *)expr4[-1] == 0.0 )
{
*(double *)expr4-- = 0.0 ;
return ;
}
}
e4sub() ;
}
void e4substr()
{
memmove( expr4buf + expr4info_ptr->result_pos,
expr4buf + expr4info_ptr->result_pos + expr4info_ptr->i1,
expr4info_ptr->len ) ;
}
void e4time()
{
date4time_now( *expr4++ = expr4buf+expr4info_ptr->result_pos ) ;
}
void e4trim()
{
c4trim_n( expr4[-1], expr4info_ptr->len+ 1 ) ;
}
void expr4true_function()
{
int *ptr ;
ptr = (int *)(*expr4++ = expr4buf+expr4info_ptr->result_pos) ;
*ptr = 1 ;
}
void e4upper()
{
expr4[-1][expr4info_ptr->len] = 0 ;
c4upper( expr4[-1] ) ;
}
void e4val()
{
char *ptr ;
double d ;
ptr = expr4buf + expr4info_ptr->result_pos ;
d = c4atod( expr4[-1], expr4info_ptr[-1].len ) ;
#ifdef S4DEBUG
if ( ptr == 0 )
e4severe( e4info, E4_PARM_NSD ) ;
#endif
memcpy( ptr, (void *)&d, sizeof(d) ) ;
expr4[-1] = (char *) ptr ;
}
void e4year()
{
double d ;
d = (double) date4year( expr4[-1] ) ;
expr4[-1] = expr4buf + expr4info_ptr->result_pos ;
*(double *)expr4[-1] = d ;
}
void e4year_doub()
{
char date_buf[8] ;
date4assign( date_buf, (long) *(double *)expr4[-1] ) ;
expr4[-1] = expr4buf + expr4info_ptr->result_pos ;
*(double *) expr4[-1] = date4year( date_buf ) ;
}
#ifndef S4UNIX
#ifdef S4CLIPPER
/*
void e4descend_num_doub()
{
c4dtoa_clipper( *(double *) expr4[-1], expr4buf + expr4info_ptr->result_pos, expr4info_ptr->len, expr4ptr->key_dec ) ;
expr4[-1] = expr4buf + expr4info_ptr->result_pos ;
c4descend_num( expr4[-1], expr4[-1], expr4info_ptr->len ) ;
}
void e4descend_num_str()
{
expr4[-1] = expr4buf + expr4info_ptr->result_pos ;
c4descend_num( expr4[-1], expr4[-1], expr4info_ptr->len ) ;
}
void e4descend_date_doub()
{
double d = *(double *) expr4[-1] ;
expr4[-1] = expr4buf + expr4info_ptr->result_pos ;
c4descend_date( expr4[-1], (long) d, expr4info_ptr->len ) ;
}
*/
void e4descend_str()
{
c4descend_str( expr4[-1], expr4[-1], expr4info_ptr->len ) ;
}
#endif
#endif
#ifndef S4OFF_REPORT
void e4pageno()
{
double d = (double) expr4ptr->code_base->pageno ;
memcpy( *expr4++ = expr4buf + expr4info_ptr->result_pos, (void *)&d, sizeof(d) ) ;
}
void e4calc_function()
{
EXPR4CALC *e4calc_ptr = (EXPR4CALC *) expr4info_ptr->p1 ;
char **e4save = expr4 ;
char *expr4constants_save = expr4constants ;
char *result_ptr ;
expr4calc_result_pos( e4calc_ptr, expr4info_ptr->result_pos ) ;
expr4vary( e4calc_ptr->expr, &result_ptr ) ;
expr4start( e4calc_ptr->expr->code_base ) ; /* restart from vary */
expr4 = e4save ;
expr4constants = expr4constants_save ;
*expr4++ = result_ptr ;
}
void e4calc_total()
{
double d = total4value( (struct TOTAL4st *) expr4info_ptr->p1 ) ;
*expr4 = expr4buf + expr4info_ptr->result_pos ;
memcpy( *expr4++, (void *)&d, sizeof(d) ) ;
}
double S4FUNCTION total4value( TOTAL4 *t4 )
{
switch( t4->total_type )
{
case total4sum:
return t4->total ;
case total4count:
return (double) t4->count ;
case total4average:
if( t4->count == 0 )
return 0.0 ;
return t4->total/t4->count ;
case total4highest:
return t4->high ;
case total4lowest:
return t4->low ;
default:
break ;
}
return t4->total ;
}
#endif