Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/include/sffe.h
blob: 3f21869284ae8a139a45f3f826b689f09008de04 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*/////////////////////////////////////////////////////////////////////////////////////
// project : sFFe ( SegFault (or Segmentation Fault :) ) formula evalutaor )
// author  : Mateusz Malczak ( mateusz@malczak.info )
// wpage   : www.segfaultlabs.com/projects/sffe
///////////////////////////////////////////////////////////////////////////////////////
// possible config definitions
//   general
//	SFFE_DEVEL - print extra info to stdout
//	SFFE_DLL - Windows DLL
//   complex numbers
//	SFFE_CMPLX_GSL - uses GSL complex number routines
//	SFFE_CMPLX_ASM - uses my asm complex unit (compile it with NASM)
///////////////////////////////////////////////////////////////////////////////////////
// special build for XaoS, for more info visit
// http://www.segfaultlabs.com/projects/sfXaos
/////////////////////////////////////////////////////////////////////////////////////*/

#ifndef SFFE_H
#define SFFE_H
#include <config.h>
#include <stdlib.h>

/* dont udef next line. removing this definitions can lead to compile and/or runtime errors */
#define SFFE_COMPLEX 1

/* --- */
/*TODO long double needed*/
#ifdef SFFE_CMPLX_ASM
typedef struct cmpx__ {
    double r, i;
} cmplx;
#define sfNumber 		cmplx
#elif SFFE_CMPLX_GSL
#include <gsl/gsl_complex.h>
typedef gsl_complex cmplx;
#define sfNumber 		gsl_complex
#endif

/* basic sffe argument 'stack' */
typedef struct sfargument__ {
    struct sfargument__ *parg;
    sfNumber *value;
} sfarg;

/* sffe function prototype, parameters order is right-to-left (cdecl) */
typedef sfarg *(*sffptr) (sfarg * const a);

/* constats eval functions */
typedef void (*cfptr) (sfNumber * cnst);

/* function type structure */
typedef struct sffunction__ {
    sffptr fptr;
    unsigned char parcnt;
    /*FIXME changed from char* to char[20] to get rid of warnings during compilation */
    char name[20];
} sffunction;

/* basic sffe 'stack' operation ( function + result slot ) */
typedef struct sfoperation__ {
    sfarg *arg;
    sffptr f;
} sfopr;

/* SFFE main structure */
typedef struct sffe__ {
/*public*/
    char *expression;		/* parsed expression (read-only) */
    char *errormsg;		/* parser errors (read-only) */
    sfNumber *result;		/* evaluation result (read-only) */
/* protected/private */
    unsigned int argCount;	/* number of argument in use */
    sfarg *args;
    unsigned int oprCount;	/* number of operations in use */
    sfopr *oprs;
    unsigned int varCount;	/* number of used variables */
    char *varChars;
    sfNumber **varPtrs;
    unsigned int userfCount;	/* number of user functions */
    sffunction *userf;
/* not used 
  unsigned int	stCount;	    
  sfNumber*		statics;
*/
} sffe;

#define SFFE sffe
#define sffeparser sffe
#define sfparser sffe
#define SFFEPARSER sffe

/* 'stack' slot value */
#define sfvalue(p) (*((p)->value))

/* function parameters */
#define sfaram1(p) ((p)->parg)
#define sfaram2(p) ((p)->parg->parg)
#define sfaram3(p) ((p)->parg->parg->parg)
#define sfaram4(p) ((p)->parg->parg->parg->parg)
#define sfaram5(p) ((p)->parg->parg->parg->parg->parg)
/* and so on */


#ifdef __cplusplus
extern "C" {
#endif

/* create formula evaluator structure */
    sffe *sffe_alloc(void);
/* free fe structure */
    void sffe_free(sffe ** parser);
/* parse expression 'expression' and strore result in 'parser' struct, error (if any) returned */
    int sffe_parse(sffe ** parser, char *expression);
/* evaulate function and return evaluation result */
    sfNumber sffe_eval(sffe * const parser);
/* evaluate without returnig result */
//void sffe_eval2(sffe *const parser);
/* register user function with name 'vname', with 'parcnt' parameters and defined with function pointed by 'funptr'*/
    void *sffe_regfunc(sffe ** parser, char *vname, unsigned int parcnt,
		       sffptr funptr);
/* register single variable 'vptrs' identified by name 'vchars' */
    void *sffe_regvar(sffe ** parser, sfNumber * vptrs, char vchars);
/* register multiple variables */
    void *sffe_regvars(sffe ** parser, unsigned int cN, sfNumber ** vptrs,
		       char *vchars);
/* get variable 'vchar' pointer */
    sfNumber *sffe_varptr(sffe * const parser, char vchar);
/* set 'vptrs' as 'vchars' variable  */
    sfNumber *sffe_setvar(sffe ** parser, sfNumber * vptrs, char vchars);

#ifdef __cplusplus
}
#endif
#ifdef SFFE_CMPLX_ASM
#include "sffe_cmplx_asm.h"
#elif SFFE_CMPLX_GSL
#include "sffe_cmplx_gsl.h"
#endif
#endif