rainmeter-studio/Library/ccalc-0.5.1/mparser.h
Kimmo Pekkola 7440667743 New build-in variables: #WORKAREAWIDTH#, #WORKAREAHEIGHT#, #SCREENAREAWIDTH#, #SCREENAREAHEIGHT#
Added support for math formulas for the X, Y, W, H, WindowX and WindowY (e.g. "WindowX=(#WORKAREAWIDTH# / 2)"). The formula must be surrounded by parenthesis.
2009-07-30 15:19:47 +00:00

82 lines
2.0 KiB
C

#pragma once
/*
Math parser for CCalc library.
*/
#include "strmap.h"
#include "lexer.h"
#include "pack.h"
//#define RUSSIAN 1
#ifdef __cplusplus
extern "C" {
#endif
#define MAX_STACK_SIZE 32
extern const double DblErR;
extern const double DblNiN;
typedef enum {
// Binary
OP_SHL, OP_SHR, OP_POW,
OP_LOGIC_NEQ, OP_LOGIC_GEQ, OP_LOGIC_LEQ,
OP_LOGIC_AND, OP_LOGIC_OR, // Logical
OP_COMSTART, OP_ASSIGN, // For internal needs
OP_OBR, // Special
OP_ADD, OP_SUB, OP_MUL, OP_DIV, OP_MOD, OP_UNK, // Arithmetic
OP_XOR, OP_NOT, OP_AND, OP_OR, // Bitwise
OP_EQU, OP_GREATER, OP_LESS,
OP_LOGIC, OP_LOGIC_SEP, OP_CBR, OP_COMMA, // Logical
OP_FORMULAEND, // For script
OP_FUNC_ONEARG, OP_FUNC_MULTIARG // Special
} OperType_t;
typedef struct {
char *str;
double value;
} Parameter;
typedef double (*OneArgFunc) ( double arg );
typedef char* (*MultiArgFunc) ( int paramcnt, double *args,
hqStrMap *strparams, double *result );
typedef int (*PrmSrchFunc) ( const char *str, int len, double *value,
void *param );
#pragma pack(push,1)
typedef struct {
OperType_t OperType;
void *Func;
char PrevValTop;
hqStrMap *StrParams;
} Operation;
typedef struct {
/* public */
hqStrMap *Parameters; // List of numeric veriables
hqStrMap *ExtFunctions; // List of multi-argument external functions
PrmSrchFunc MoreParams; // Function for calculating unhandled parameters
void *ParamFuncParam; // Parameter given to this function
/* private */
Operation OpStack[MAX_STACK_SIZE];
double ValStack[MAX_STACK_SIZE];
int OpTop, ValTop;
int ObrDist;
hqLexer Lexer;
int script;
hqStrMap *VarParams;
} hqMathParser;
#pragma pack(pop)
/* API */
hqMathParser* MathParser_Create( char *MoreLetters );
void MathParser_Destroy( hqMathParser* parser );
char* MathParser_Parse( hqMathParser* parser, const char *Formula, double *result );
#ifdef __cplusplus
}
#endif