campo-sirio/cb/source/e4expr.h
alex af15e0698b Codebase
git-svn-id: svn://10.65.10.50/trunk@4679 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-06-16 13:01:08 +00:00

387 lines
13 KiB
C
Executable File

/* e4expr.h (c)Copyright Sequiter Software Inc., 1988-1996. All rights reserved. */
#define E4MAX_PARMS 3
#define E4MAX_STACK_ENTRIES 20
#define E4MAX_CALC_NAME 20
struct EXPR4CALCSt;
/******************************************************************************/
/* This structure is wrapped around an EXPR4CALC calculation structure to create
a total. Note: a total structure is then wrapped by a total output object
*/
typedef struct TOTAL4st
{
LINK4 link ;
/* A total is a calculation for easy removal/name changes */
S4CONV( struct EXPR4CALCSt *calcPtr, struct EXPR4CALCSt *calc_ptr ) ;
/* These two members are used to keep track of when the total should be reset
each time the reset expression is evaluated it's value is compared to the
value stored in lastResetValue, if they are different the total is reset
and the stored value is updated */
S4CONV( EXPR4 *resetExpression, EXPR4 *reset_expression ) ;
S4CONV( char *lastResetValue, char *last_reset_value ) ;
/* normally a total is 'incremented' appropriately for every record in the
relation set. In some cases you only want a subset of these records to
apply to the total. The addCondition and lastAddValue function
similarly to the reset condition but selectively enable or disable
updating the total for the current record */
S4CONV( EXPR4 *addCondition, EXPR4 *add_condition ) ;
S4CONV( char *lastAddValue, char *last_add_value ) ;
short logcon; /* flag which indicates that the conditional total is
based on a logical condition, not a changed value */
short donce;
#ifndef S4OFF_REPORT
struct _OBJECTStruct *obj; /* report object associated with the total */
struct REPORT4St *report; /* report containing the total */
#endif
S4CONV( short totalType, short total_type ) ;
/* total4lowest, total4highest, total4sum, */
/* total4count, total4average */
short lookahead;
double total ; /* Running Total */
double low ; /* Lowest Value */
double high ; /* Hightest Value */
long count; /* used internally for computing the average */
} TOTAL4 ;
/******************************************************************************/
typedef struct
{
void (S4PTR *functionPtr)() ;
char S4PTR *name ;
short code ;
unsigned char nameLen ;
char priority ;
char returnType ;
#ifdef S4UNIX
char numParms ; /* -1 means that the number is flexible */
#else
S4CONV( signed char numParms, signed char num_parms ) ; /* -1 means that the number is flexible */
#endif
char type[E4MAX_PARMS] ; /* Parameter types */
} E4FUNCTIONS ;
typedef struct
{
const unsigned char S4PTR *ptr ; /* The original string */
int pos, len ; /* Source expression position and length */
} S4SCAN ;
typedef struct
{
char S4PTR *ptr ;
unsigned int pos, len ;
int doExtend ;
CODE4 S4PTR *codeBase ;
} S4STACK ;
typedef struct
{
EXPR4 expr ;
S4STACK constants ;
S4SCAN scan ; /* Character Expression */
S4STACK op ; /* Operation stack */
CODE4 S4PTR *codeBase ;
} E4PARSE ;
typedef struct EXPR4CALCSt
{
LINK4 link ;
EXPR4 S4PTR *expr ;
TOTAL4 *total ; /* If calculation is for a total. */
char name[E4MAX_CALC_NAME] ;
int curResultPos ;
} EXPR4CALC ;
extern char S4PTR *expr4buf ; /* Pointer to CODE4 Working memory */
/* expr4buf_len no longer exists... */ /* extern unsigned expr4buf_len ;*/ /* Length, e4execute() assumes length long enough */
extern char S4PTR * S4PTR *expr4 ; /* Expression Parms; Points to next parm to be placed */
extern EXPR4 S4PTR *expr4ptr ; /* Points to expression being evaluated */
extern E4INFO S4PTR *expr4infoPtr ;
extern char S4PTR *expr4constants ; /* Points to constant info */
#define EXPR4NUM_FUNCTIONS 122
extern E4FUNCTIONS v4functions[EXPR4NUM_FUNCTIONS] ;
/* Types normally used for Function/Operator parameters and returns */
#define r4date 'D'
#define r4dateDoub 'd'
#define r4float 'F'
#define r4log 'L'
#define r4num 'N'
#define r4numDoub 'n'
#define r4str 'C'
#define r4memo 'M'
#define r4gen 'G'
/*#ifdef S4FOX*/
#define r4currency 'Y'
#define r4dateTime 'T'
#define r4double 'B'
#define r4int 'I'
#define r4system '0'
/* r4charBin and r4memoBin get converted to 'C' and 'M' respectively.
the bin part affects another area of the field information */
#define r4charBin 'Z'
#define r4memoBin 'X'
/*#else*/
#define r4bin 'B'
/*#endif*/
/* backward compatibility redefinitions */
#define r4num_doub r4numDoub
#define r4date_doub r4dateDoub
/* POSITIONAL CODES FOR EXPRESSION FUNCTIONS */
#define E4LAST_FIELD E4FIELD_MEMO
#define E4FIRST_LOG (E4LAST_FIELD + 3) /* Range of Logical Operators */
#define E4LAST_LOG (E4FIRST_LOG + 4)
#define E4FIRST_OPERATOR (E4LAST_LOG + 1) /* Range of Other Operators */
#define E4LAST_OPERATOR (E4FIRST_OPERATOR + 50)
#define E4COMPARE_START (E4FIRST_OPERATOR + 11)
#define E4COMPARE_END (E4COMPARE_START + 34)
#define E4FIRST_FUNCTION (E4COMPARE_END + 6) /* Start of the List of Functions */
/* Codes for Immediate Data in Compile String */
#define E4FIELD_STR 0
#define E4FIELD_STR_CAT (E4FIELD_STR + 1)
#define E4FIELD_LOG (E4FIELD_STR_CAT + 1)
#define E4FIELD_DATE_D (E4FIELD_LOG + 1)
#define E4FIELD_DATE_S (E4FIELD_DATE_D + 1)
#define E4FIELD_NUM_D (E4FIELD_DATE_S + 1)
#define E4FIELD_NUM_S (E4FIELD_NUM_D + 1)
#define E4FIELD_CUR (E4FIELD_NUM_S + 1)
#define E4FIELD_DOUB (E4FIELD_CUR + 1)
#define E4FIELD_INT (E4FIELD_DOUB + 1)
#define E4FIELD_DTTIME (E4FIELD_INT + 1)
#define E4FIELD_INT_D (E4FIELD_DTTIME + 1)
#define E4FIELD_CUR_D (E4FIELD_INT_D + 1)
#define E4FIELD_MEMO (E4FIELD_CUR_D + 1)
#define E4DOUBLE (E4FIELD_MEMO + 1)
#define E4STRING (E4DOUBLE + 1)
#define E4LOG_LOW (E4STRING + 1)
#define E4LOG_HIGH (E4LOG_LOW + 3)
#define E4OR (E4LOG_HIGH + 2)
#define E4AND (E4OR + 1)
#define E4CONCATENATE (E4AND + 1)
#define E4CONCAT_TRIM (E4CONCATENATE + 1)
#define E4CONCAT_TWO (E4CONCAT_TRIM + 4)
#define E4NOT_EQUAL (E4CONCAT_TWO + 4)
#define E4GREATER_EQ (E4NOT_EQUAL + 7)
#define E4LESS_EQ (E4GREATER_EQ + 6)
#define E4EQUAL (E4LESS_EQ + 6)
#define E4GREATER (E4EQUAL + 6)
#define E4LESS (E4GREATER + 5)
#define E4CHR (E4LESS + 10)
#define E4DEL (E4CHR + 1)
#define E4STR (E4DEL + 1)
#define E4SUBSTR (E4STR + 1)
#define E4TIME (E4SUBSTR + 1)
#define E4UPPER (E4TIME + 1)
#define E4DTOS (E4UPPER + 1)
#define E4DTOC (E4DTOS + 2)
#define E4TRIM (E4DTOC + 2)
#define E4LTRIM (E4TRIM + 1)
#define E4ALLTRIM (E4LTRIM + 1)
#define E4LEFT (E4ALLTRIM + 1)
#define E4RIGHT (E4LEFT + 1)
#define E4IIF (E4RIGHT + 1)
#define E4STOD (E4IIF + 4)
#define E4CTOD (E4STOD + 1)
#define E4DELETED (E4CTOD + 8)
#define E4RECCOUNT (E4DELETED + 1)
#define E4RECNO (E4RECCOUNT + 1)
#define E4CALC_FUNCTION (E4RECNO + 2)
#define E4TOTAL (E4CALC_FUNCTION + 1)
#define E4DESCEND (E4TOTAL + 2)
#define E4ASCEND (E4DESCEND + 7)
#if EXPR4NUM_FUNCTIONS != E4ASCEND + 8
#error number functions in array mismatch
#endif
#define E4DONE -2
#define E4NO_FUNCTION -3
#define E4COMMA -4
#define E4L_BRACKET -5
#define E4ANOTHER_PARM -6
/* Interface Functions */
#ifdef __cplusplus
extern "C" {
#endif
#ifndef S4CLIENT
int expr4context( EXPR4 *, DATA4 * ) ;
#endif
/* EXTERNAL FUNCTIONS : */
#define expr4data( e4 ) ( (e4)->data )
S4EXPORT double S4FUNCTION expr4double( EXPR4 S4PTR * ) ;
S4EXPORT int S4FUNCTION expr4double2( EXPR4 S4PTR *, double * ) ;
#define expr4free( e4 ) ( u4free( e4 ), (e4) = 0 )
#define expr4len( e4 ) ( (e4)->len )
S4EXPORT EXPR4 S4PTR *S4FUNCTION expr4parseLow( DATA4 S4PTR *, const char S4PTR *, TAG4FILE * ) ;
S4EXPORT S4CONST char S4PTR *S4FUNCTION expr4source( const EXPR4 S4PTR * ) ;
S4EXPORT const char S4PTR *S4FUNCTION expr4str( EXPR4 S4PTR * ) ;
S4EXPORT int S4FUNCTION expr4true( EXPR4 S4PTR * ) ;
#define expr4type( e4 ) ( (e4)->type )
S4EXPORT int S4FUNCTION expr4vary( EXPR4 S4PTR *, char S4PTR * S4PTR * ) ;
#ifndef S4INLINE
S4EXPORT EXPR4 S4PTR *S4FUNCTION expr4parse( DATA4 S4PTR *, char S4PTR * ) ;
#endif
/* Relate Module and Report Writer Functions */
S4EXPORT EXPR4CALC *S4FUNCTION code4calcCreate( CODE4 S4PTR *, EXPR4 S4PTR *, const char S4PTR * ) ;
S4EXPORT void S4FUNCTION code4calcReset( CODE4 S4PTR * ) ;
S4EXPORT int S4FUNCTION expr4execute( EXPR4 S4PTR *, const int, void S4PTR * S4PTR * ) ;
S4EXPORT void S4FUNCTION expr4functions(E4FUNCTIONS S4PTR * S4PTR *) ;
S4EXPORT EXPR4 S4PTR *S4FUNCTION expr4calcParse( DATA4 S4PTR *, const char S4PTR * ) ;
S4EXPORT void S4FUNCTION expr4calcDelete( EXPR4CALC S4PTR * ) ;
S4EXPORT void S4FUNCTION expr4calcMassage( EXPR4CALC S4PTR * );
S4EXPORT EXPR4CALC *S4FUNCTION expr4calcLookup( CODE4 S4PTR *, const char S4PTR *, const unsigned ) ;
S4EXPORT int S4FUNCTION expr4calcNameChange( EXPR4 S4PTR * S4PTR *, const char S4PTR *, const char S4PTR * ) ;
S4EXPORT void S4FUNCTION expr4calcResultPos( EXPR4CALC S4PTR *, const int ) ;
int S4FUNCTION e4lookup( const unsigned char S4PTR *, const int, const int, const int ) ;
/* INTERNAL FUNCTIONS : */
int expr4start( EXPR4 * ) ;
int expr4keyLen( EXPR4 * ) ;
#ifndef S4CLIENT
S4EXPORT int S4FUNCTION expr4key( EXPR4 S4PTR *, char S4PTR * S4PTR * ) ;
int expr4keyConvert( EXPR4 *, char **, const int, const int ) ;
#endif
S4EXPORT int S4FUNCTION expr4nullLow( const EXPR4 S4PTR *, const int ) ;
#define expr4null( e4 ) ( expr4nullLow( (e4), 1 ) )
/* Parsing Functions */
int e4addConstant( E4PARSE *, const int, const void *, const unsigned int ) ;
E4INFO *e4functionAdd( EXPR4 *, const int ) ;
int e4getOperator( E4PARSE *, int * ) ;
int expr4parseExpr( E4PARSE * ) ;
int expr4parseFunction( E4PARSE *, const char *, const int ) ;
int expr4parseValue( E4PARSE * ) ;
int expr4trueCheck( E4PARSE * ) ;
unsigned char s4scanChar( S4SCAN * ) ;
void s4scanInit( S4SCAN *, const unsigned char * ) ;
char s4scanPop( S4SCAN * ) ; /* Returns current char and goes to the next */
int s4scanSearch( S4SCAN *, const char ) ; /* Returns # of characters scanned */
int s4scanRange( S4SCAN *, const int, const int ) ;
int s4stackCur( S4STACK * ) ;
int s4stackPop( S4STACK * ) ;
int s4stackPushInt( S4STACK *, const int ) ;
int s4stackPushStr( S4STACK *, const void *, const int ) ;
#ifdef __cplusplus
}
#endif
/* Execute Functions */
void e4add( void ) ;
void e4addDate( void ) ;
void e4alltrim( void ) ;
void e4and( void ) ;
void e4calcFunction( void ) ;
void e4calcTotal( void ) ;
void e4chr( void ) ;
void e4concatSpecial( char ) ;
void e4concatTrim( void ) ;
void e4concatTwo( void ) ;
void e4contain( void ) ;
void e4copyConstant( void ) ;
void e4copyParm( void ) ;
void e4ctod( void ) ;
void e4date( void ) ;
void e4day( void ) ;
void e4dayDoub( void ) ;
void e4del( void ) ;
void e4deleted( void ) ;
void e4divide( void ) ;
void e4dtoc( void ) ;
void e4dtocDoub( void ) ;
void e4dtosDoub( void ) ;
void e4equal( void ) ;
#ifdef S4CLIENT_OR_FOX
void e4equalCur( void ) ;
void e4equalDtTime( void ) ;
#endif
void e4false( void ) ;
void e4fieldCopy( void ) ;
void e4fieldDateD( void ) ;
void e4fieldLog( void ) ;
void e4fieldMemo( void ) ;
#ifdef S4CLIENT_OR_FOX
void e4fieldCurD( void ) ;
#endif
void e4fieldIntD( void ) ;
void e4fieldNumD( void ) ;
void e4greater( void ) ;
#ifdef S4CLIENT_OR_FOX
void e4greaterCur( void ) ;
void e4greaterDtTime( void ) ;
#endif
void e4greaterDoub( void ) ;
void e4greaterEq( void ) ;
#ifdef S4CLIENT_OR_FOX
void e4greaterEqCur( void ) ;
void e4greaterEqDtTime( void ) ;
#endif
void e4greaterEqDoub( void ) ;
void e4iif( void ) ;
void e4less( void ) ;
#ifdef S4CLIENT_OR_FOX
void e4lessCur( void ) ;
void e4lessDtTime( void ) ;
#endif
void e4lessDoub( void ) ;
void e4lessEq( void ) ;
#ifdef S4CLIENT_OR_FOX
void e4lessEqCur( void ) ;
void e4lessEqDtTime( void ) ;
#endif
void e4lessEqDoub( void ) ;
void e4ltrim( void ) ;
void e4month( void ) ;
void e4monthDoub( void ) ;
void e4multiply( void ) ;
void e4newFunction( void ) ;
void e4nop( void ) ;
void e4not( void ) ;
void e4notEqual( void ) ;
#ifdef S4CLIENT_OR_FOX
void e4notEqualCur( void ) ;
void e4notEqualDtTime( void ) ;
#endif
void e4or( void ) ;
void e4fieldAdd( void ) ;
void e4parmRemove( void ) ;
void e4power( void ) ;
void e4recCount( void ) ;
void e4recno( void ) ;
void e4stod( void ) ;
void e4str( void ) ;
void e4sub( void ) ;
void e4subDate( void ) ;
void e4substr( void ) ;
void e4time( void ) ;
void e4trim( void ) ;
void expr4trueFunction( void ) ;
void e4upper( void ) ;
void e4val( void ) ;
void e4year( void ) ;
void e4yearDoub( void ) ;
void e4pageno( void ) ;
void e4descend( void ) ;
void e4ascend( void ) ;