1 /*
2  * TINYEXPR - Tiny recursive descent parser and evaluation engine in C
3  *
4  * Copyright (c) 2015-2018 Lewis Van Winkle
5  *
6  * http://CodePlea.com
7  *
8  * This software is provided 'as-is', without any express or implied
9  * warranty. In no event will the authors be held liable for any damages
10  * arising from the use of this software.
11  *
12  * Permission is granted to anyone to use this software for any purpose,
13  * including commercial applications, and to alter it and redistribute it
14  * freely, subject to the following restrictions:
15  *
16  * 1. The origin of this software must not be misrepresented; you must not
17  * claim that you wrote the original software. If you use this software
18  * in a product, an acknowledgement in the product documentation would be
19  * appreciated but is not required.
20  * 2. Altered source versions must be plainly marked as such, and must not be
21  * misrepresented as being the original software.
22  * 3. This notice may not be removed or altered from any source distribution.
23  */
24 
25 #ifndef __TINYEXPR_H__
26 #define __TINYEXPR_H__
27 
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32 
33 
34 
35 typedef struct te_expr {
36     int type;
37     union {double value; const double *bound; const void *function;};
38     void *parameters[1];
39 } te_expr;
40 
41 
42 enum {
43     TE_VARIABLE = 0,
44 
45     TE_FUNCTION0 = 8, TE_FUNCTION1, TE_FUNCTION2, TE_FUNCTION3,
46     TE_FUNCTION4, TE_FUNCTION5, TE_FUNCTION6, TE_FUNCTION7,
47 
48     TE_CLOSURE0 = 16, TE_CLOSURE1, TE_CLOSURE2, TE_CLOSURE3,
49     TE_CLOSURE4, TE_CLOSURE5, TE_CLOSURE6, TE_CLOSURE7,
50 
51     TE_FLAG_PURE = 32
52 };
53 
54 typedef struct te_variable {
55     const char *name;
56     const void *address;
57     int type;
58     void *context;
59 } te_variable;
60 
61 
62 
63 /* Parses the input expression, evaluates it, and frees it. */
64 /* Returns NaN on error. */
65 double te_interp(const char *expression, int *error);
66 
67 /* Parses the input expression and binds variables. */
68 /* Returns NULL on error. */
69 te_expr *te_compile(const char *expression, const te_variable *variables, int var_count, int *error);
70 
71 /* Evaluates the expression. */
72 double te_eval(const te_expr *n);
73 
74 /* Prints debugging information on the syntax tree. */
75 void te_print(const te_expr *n);
76 
77 /* Frees the expression. */
78 /* This is safe to call on NULL pointers. */
79 void te_free(te_expr *n);
80 
81 
82 #ifdef __cplusplus
83 }
84 #endif
85 
86 #endif /*__TINYEXPR_H__*/
87