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