1 /* -*- c -*-
2  * File: exprtool.h
3  * Author: Igor Vlasenko <vlasenko@imath.kiev.ua>
4  * Created: Mon Jul 25 15:29:04 2005
5  *
6  * $Id$
7  */
8 
9 #ifndef _EXPRTOOL_H
10 #define _EXPRTOOL_H	1
11 
12 #include "pstring.h"
13 #include "exprval.h"
14 
15 struct expr_parser {
16   struct tmplpro_state* state;
17   PSTRING exprarea;
18   const char* expr_curpos;
19   /* for callbacks */
20   struct exprval userfunc_call;
21   /*
22    * is_expect_quote_like allows recognization of quotelike.
23    * if not is_expect_quote_like we look only for 'str' and, possibly, "str"
24    * if is_expect_quote_like we also look for /str/.
25    */
26   int is_expect_quote_like;
27   /*
28    * is_tt_like_logical: if set, && and || behave like in TemplateToolkit
29    */
30   int is_tt_like_logical;
31 };
32 
33 #define DO_MATHOP(exprobj, z,op,x,y) switch (z.type=expr_to_int_or_dbl(exprobj, &x,&y)) { \
34 case EXPR_TYPE_INT: z.val.intval=x.val.intval op y.val.intval;break; \
35 case EXPR_TYPE_DBL: z.val.dblval=x.val.dblval op y.val.dblval;break; \
36 }
37 
38 #define DO_LOGOP(exprobj, z,op,x,y) z.type=EXPR_TYPE_INT; switch (expr_to_int_or_dbl_logop(exprobj, &x,&y)) { \
39 case EXPR_TYPE_INT: z.val.intval=x.val.intval op y.val.intval;break; \
40 case EXPR_TYPE_DBL: z.val.intval=x.val.dblval op y.val.dblval;break; \
41 }
42 
43 #define DO_LOGOP1(exprobj,z,op,x) z.type=EXPR_TYPE_INT; switch (expr_to_int_or_dbl_logop1(exprobj, &x)) { \
44 case EXPR_TYPE_INT: z.val.intval= op x.val.intval;break; \
45 case EXPR_TYPE_DBL: z.val.intval= op x.val.dblval;break; \
46 }
47 
48 #define DO_CMPOP(exprobj, z,op,x,y) switch (expr_to_int_or_dbl(exprobj, &x,&y)) { \
49 case EXPR_TYPE_INT: z.val.intval=x.val.intval op y.val.intval;break; \
50 case EXPR_TYPE_DBL: z.val.intval=x.val.dblval op y.val.dblval;break; \
51 }; z.type=EXPR_TYPE_INT;
52 
53 #define DO_TXTOP(z,op,x,y,buf) expr_to_str(buf, &x,&y); z.type=EXPR_TYPE_INT; z.val.intval = op (x.val.strval,y.val.strval);
54 #define DO_TXTOPLOG(z,op,x,y,exprobj) expr_to_str(exprobj->state, &x,&y); z.type=EXPR_TYPE_INT; z.val.intval = op (exprobj,x.val.strval,y.val.strval);
55 
56 static
57 EXPR_char expr_to_int_or_dbl (struct expr_parser* exprobj, struct exprval* val1, struct exprval* val2);
58 static
59 EXPR_char expr_to_int_or_dbl1 (struct expr_parser* exprobj, struct exprval* val1);
60 static
61 EXPR_char expr_to_int_or_dbl_logop (struct expr_parser* exprobj, struct exprval* val1, struct exprval* val2);
62 static
63 EXPR_char expr_to_int_or_dbl_logop1 (struct expr_parser* exprobj, struct exprval* val1);
64 static
65 void expr_to_dbl (struct expr_parser* exprobj, struct exprval* val1, struct exprval* val2);
66 static
67 void expr_to_int (struct expr_parser* exprobj, struct exprval* val1, struct exprval* val2);
68 static
69 void expr_to_dbl1 (struct expr_parser* exprobj, struct exprval* val);
70 static
71 void expr_to_int1 (struct expr_parser* exprobj, struct exprval* val1);
72 static
73 void expr_to_str (struct tmplpro_state* state, struct exprval* val1, struct exprval* val2);
74 static
75 void expr_to_str1 (struct tmplpro_state* state, struct exprval* val1);
76 static
77 void expr_to_num (struct expr_parser* exprobj, struct exprval* val1);
78 static
79 void expr_to_bool (struct expr_parser* exprobj, struct exprval* val1);
80 static
81 struct exprval exp_read_number (struct expr_parser* exprobj, const char* *curposptr, const char* endchars);
82 
83 /* this stuff is defined or used in expr.y */
84 static
85 void log_expr(struct expr_parser* exprobj, int loglevel, const char* fmt, ...) FORMAT_PRINTF(3,4);
86 
87 static
88 PSTRING expr_unescape_pstring_val(pbuffer* pbuff, PSTRING val);
89 
90 static
91 void _tmplpro_expnum_debug (struct exprval val, char* msg);
92 
93 
94 struct user_func_call {
95   ABSTRACT_USERFUNC* func;  /* for user-defined function name */
96   ABSTRACT_ARGLIST* arglist;
97 };
98 
99 static
100 struct exprval call_expr_userfunc(struct expr_parser* exprobj, struct tmplpro_param* param, struct user_func_call extfunc);
101 static
102 void pusharg_expr_userfunc(struct expr_parser* exprobj, struct tmplpro_param* param, struct user_func_call extfunc, struct exprval arg);
103 
104 #endif /* exprtool.h */
105