1 // ================================================================ 2 // NOTES: 3 // 4 // * Code here evaluates right-hand-side values (rvals) and return mlrvals (mv_t). 5 // 6 // * This is used by mlr filter and mlr put. 7 // 8 // * Comparison to mlrval.c: the latter is functions from mlrval(s) to mlrval; 9 // in this file we have the higher-level notion of evaluating lrec objects, 10 // using mlrval.c to do so. 11 // 12 // * Functions prototyped here evaluate right-hand-side values (rvals) and 13 // return mlrvals (mv_t). This is for scalar-valued contexts: almost all 14 // expressions except for rxval contexts. 15 // 16 // Values propagating up through the concrete syntax tree are always 17 // dynamically allocated: e.g. in '$c = $a . $b' the $a and $b are copied out 18 // as ephemerals; in the concat function their concatenation is computed and 19 // the ephemeral input arguments are freed; then the result is stored in field 20 // $c. 21 // 22 // This is distinct from rxvals which are copy-on-write: 23 // expression-intermediate values are not always ephemeral. 24 // 25 // * There are two kinds of lrec-evaluators here: those with _x_ in their names 26 // which accept various types of mlrval, with disposition-matrices in 27 // mlrval.c functions, and those with _i_/_f_/_b_/_s_ (int, float, boolean, 28 // string) which either type-check or type-coerce their arguments, invoking 29 // type-specific functions in mlrval.c. Those with _n_ take int or float 30 // and also use disposition matrices. In all cases it's the job of 31 // rval_evaluators.c to invoke functions here with mlrvals of the correct 32 // type(s). See also comments in lib/mlrval.h. 33 // 34 // ================================================================ 35 36 #ifndef RVAL_EVALUATORS_H 37 #define RVAL_EVALUATORS_H 38 39 #include <stdio.h> 40 #include "lib/mvfuncs.h" 41 #include "containers/xvfuncs.h" 42 #include "dsl/mlr_dsl_ast.h" 43 #include "dsl/rval_evaluator.h" 44 #include "dsl/function_manager.h" 45 46 // ================================================================ 47 // rval_expr_evaluators.c 48 // ================================================================ 49 50 // Topmost function: 51 rval_evaluator_t* rval_evaluator_alloc_from_ast( 52 mlr_dsl_ast_node_t* past, fmgr_t* pfmgr, int type_inferencing, int context_flags); 53 54 // Next level: 55 rval_evaluator_t* rval_evaluator_alloc_from_field_name(char* field_name, int type_inferencing); 56 rval_evaluator_t* rval_evaluator_alloc_from_indirect_field_name(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr, 57 int type_inferencing, int context_flags); 58 rval_evaluator_t* rval_evaluator_alloc_from_positional_srec_field_name(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr, 59 int type_inferencing, int context_flags); 60 rval_evaluator_t* rval_evaluator_alloc_from_oosvar_keylist(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr, 61 int type_inferencing, int context_flags); 62 rval_evaluator_t* rval_evaluator_alloc_from_local_map_keylist(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr, 63 int type_inferencing, int context_flags); 64 65 // This is used for evaluating strings and numbers in literal expressions, e.g. '$x = "abc"' 66 // or '$x = "left_\1". The values are subject to replacement with regex captures. See comments 67 // in mapper_put for more information. 68 // 69 // Compare rval_evaluator_alloc_from_string which doesn't do regex replacement: it is intended for 70 // oosvar names on expression left-hand sides (outside of this file). 71 rval_evaluator_t* rval_evaluator_alloc_from_string_literal(char* string); 72 rval_evaluator_t* rval_evaluator_alloc_from_numeric_literal(char* string); 73 rval_evaluator_t* rval_evaluator_alloc_from_boolean_literal(char* string); 74 75 // This is intended only for oosvar names on expression left-hand sides. 76 // Compare rval_evaluator_alloc_from_numeric_literal. 77 rval_evaluator_t* rval_evaluator_alloc_from_string(char* string); 78 79 rval_evaluator_t* rval_evaluator_alloc_from_boolean(int boolval); 80 rval_evaluator_t* rval_evaluator_alloc_from_environment(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr, 81 int type_inferencing, int context_flags); 82 rval_evaluator_t* rval_evaluator_alloc_from_NF(); 83 rval_evaluator_t* rval_evaluator_alloc_from_NR(); 84 rval_evaluator_t* rval_evaluator_alloc_from_FNR(); 85 rval_evaluator_t* rval_evaluator_alloc_from_FILENAME(); 86 rval_evaluator_t* rval_evaluator_alloc_from_FILENUM(); 87 rval_evaluator_t* rval_evaluator_alloc_from_PI(); 88 rval_evaluator_t* rval_evaluator_alloc_from_E(); 89 rval_evaluator_t* rval_evaluator_alloc_from_IPS(); 90 rval_evaluator_t* rval_evaluator_alloc_from_IFS(); 91 rval_evaluator_t* rval_evaluator_alloc_from_IRS(); 92 rval_evaluator_t* rval_evaluator_alloc_from_OPS(); 93 rval_evaluator_t* rval_evaluator_alloc_from_OFS(); 94 rval_evaluator_t* rval_evaluator_alloc_from_ORS(); 95 rval_evaluator_t* rval_evaluator_alloc_from_context_variable(char* variable_name); 96 rval_evaluator_t* rval_evaluator_alloc_from_local_variable(int vardef_frame_relative_index); 97 98 // For unit test: 99 rval_evaluator_t* rval_evaluator_alloc_from_mlrval(mv_t* pval); 100 101 // ================================================================ 102 // rval_func_evaluators.c 103 // ================================================================ 104 105 // These have some shared code that would otherwise be duplicated per-function in lib/mvfuncs.c. 106 rval_evaluator_t* rval_evaluator_alloc_from_variadic_func(mv_variadic_func_t* pfunc, rval_evaluator_t** pargs, int nargs); 107 rval_evaluator_t* rval_evaluator_alloc_from_b_b_func(mv_unary_func_t* pfunc, rval_evaluator_t* parg1); 108 rval_evaluator_t* rval_evaluator_alloc_from_b_bb_and_func(rval_evaluator_t* parg1, rval_evaluator_t* parg2); 109 rval_evaluator_t* rval_evaluator_alloc_from_b_bb_or_func(rval_evaluator_t* parg1, rval_evaluator_t* parg2); 110 rval_evaluator_t* rval_evaluator_alloc_from_b_bb_xor_func(rval_evaluator_t* parg1, rval_evaluator_t* parg2); 111 rval_evaluator_t* rval_evaluator_alloc_from_x_z_func(mv_zary_func_t* pfunc); 112 rval_evaluator_t* rval_evaluator_alloc_from_f_f_func(mv_unary_func_t* pfunc, rval_evaluator_t* parg1); 113 rval_evaluator_t* rval_evaluator_alloc_from_x_n_func(mv_unary_func_t* pfunc, rval_evaluator_t* parg1); 114 rval_evaluator_t* rval_evaluator_alloc_from_i_i_func(mv_unary_func_t* pfunc, rval_evaluator_t* parg1); 115 rval_evaluator_t* rval_evaluator_alloc_from_f_ff_func(mv_binary_func_t* pfunc, 116 rval_evaluator_t* parg1, rval_evaluator_t* parg2); 117 rval_evaluator_t* rval_evaluator_alloc_from_x_xx_func(mv_binary_func_t* pfunc, 118 rval_evaluator_t* parg1, rval_evaluator_t* parg2); 119 rval_evaluator_t* rval_evaluator_alloc_from_x_xx_nullable_func(mv_binary_func_t* pfunc, 120 rval_evaluator_t* parg1, rval_evaluator_t* parg2); 121 rval_evaluator_t* rval_evaluator_alloc_from_f_fff_func(mv_ternary_func_t* pfunc, 122 rval_evaluator_t* parg1, rval_evaluator_t* parg2, rval_evaluator_t* parg3); 123 rval_evaluator_t* rval_evaluator_alloc_from_i_ii_func(mv_binary_func_t* pfunc, 124 rval_evaluator_t* parg1, rval_evaluator_t* parg2); 125 rval_evaluator_t* rval_evaluator_alloc_from_i_iii_func(mv_ternary_func_t* pfunc, 126 rval_evaluator_t* parg1, rval_evaluator_t* parg2, rval_evaluator_t* parg3); 127 rval_evaluator_t* rval_evaluator_alloc_from_s_sii_func(mv_ternary_func_t* pfunc, 128 rval_evaluator_t* parg1, rval_evaluator_t* parg2, rval_evaluator_t* parg3); 129 rval_evaluator_t* rval_evaluator_alloc_from_ternop(rval_evaluator_t* parg1, rval_evaluator_t* parg2, 130 rval_evaluator_t* parg3); 131 132 rval_evaluator_t* rval_evaluator_alloc_from_s_s_func(mv_unary_func_t* pfunc, rval_evaluator_t* parg1); 133 rval_evaluator_t* rval_evaluator_alloc_from_s_f_func(mv_unary_func_t* pfunc, rval_evaluator_t* parg1); 134 rval_evaluator_t* rval_evaluator_alloc_from_s_i_func(mv_unary_func_t* pfunc, rval_evaluator_t* parg1); 135 rval_evaluator_t* rval_evaluator_alloc_from_f_s_func(mv_unary_func_t* pfunc, rval_evaluator_t* parg1); 136 rval_evaluator_t* rval_evaluator_alloc_from_i_s_func(mv_unary_func_t* pfunc, rval_evaluator_t* parg1); 137 rval_evaluator_t* rval_evaluator_alloc_from_x_x_func(mv_unary_func_t* pfunc, rval_evaluator_t* parg1); 138 139 rval_evaluator_t* rval_evaluator_alloc_from_s_si_func( 140 mv_binary_func_t* pfunc, 141 rval_evaluator_t* parg1, 142 rval_evaluator_t* parg2); 143 144 rval_evaluator_t* rval_evaluator_alloc_from_x_xi_func( 145 mv_binary_func_t* pfunc, 146 rval_evaluator_t* parg1, 147 rval_evaluator_t* parg2); 148 149 rval_evaluator_t* rval_evaluator_alloc_from_x_ns_func( 150 mv_binary_func_t* pfunc, 151 rval_evaluator_t* parg1, 152 rval_evaluator_t* parg2); 153 154 rval_evaluator_t* rval_evaluator_alloc_from_x_ss_func( 155 mv_binary_func_t* pfunc, 156 rval_evaluator_t* parg1, 157 rval_evaluator_t* parg2); 158 159 rval_evaluator_t* rval_evaluator_alloc_from_x_ssc_func( 160 mv_binary_arg3_capture_func_t* pfunc, 161 rval_evaluator_t* parg1, 162 rval_evaluator_t* parg2); 163 164 rval_evaluator_t* rval_evaluator_alloc_from_x_sr_func( 165 mv_binary_arg2_regex_func_t* pfunc, 166 rval_evaluator_t* parg1, 167 char* regex_string, 168 int ignore_case); 169 170 rval_evaluator_t* rval_evaluator_alloc_from_x_se_func( 171 mv_binary_arg2_regextract_func_t* pfunc, 172 rval_evaluator_t* parg1, 173 char* regex_string, 174 int ignore_case); 175 176 rval_evaluator_t* rval_evaluator_alloc_from_s_xs_func( 177 mv_binary_func_t* pfunc, 178 rval_evaluator_t* parg1, 179 rval_evaluator_t* parg2); 180 181 rval_evaluator_t* rval_evaluator_alloc_from_s_sss_func(mv_ternary_func_t* pfunc, 182 rval_evaluator_t* parg1, rval_evaluator_t* parg2, rval_evaluator_t* parg3); 183 184 rval_evaluator_t* rval_evaluator_alloc_from_x_srs_func(mv_ternary_arg2_regex_func_t* pfunc, 185 rval_evaluator_t* parg1, char* regex_string, int ignore_case, rval_evaluator_t* parg3); 186 187 rval_evaluator_t* rval_evaluator_alloc_from_x_ses_func(mv_ternary_arg2_regextract_func_t* pfunc, 188 rval_evaluator_t* parg1, char* regex_string, int ignore_case, rval_evaluator_t* parg3); 189 190 // ================================================================ 191 // rval_list_evaluators.c 192 // ================================================================ 193 194 // Nominally for oosvar multikeys. 195 sllmv_t* evaluate_list(sllv_t* pevaluators, variables_t* pvars, int* pall_non_null_or_error); 196 197 // ---------------------------------------------------------------- 198 // Type-inferenced srec-field getters for the expression-evaluators, as well as for boundvars in srec for-loops. 199 200 // For RHS evaluation: 201 mv_t get_srec_value_string_only(char* field_name, lrec_t* pinrec, lhmsmv_t* ptyped_overlay); 202 mv_t get_srec_value_string_float(char* field_name, lrec_t* pinrec, lhmsmv_t* ptyped_overlay); 203 mv_t get_srec_value_string_float_int(char* field_name, lrec_t* pinrec, lhmsmv_t* ptyped_overlay); 204 205 // For boundvars in for-srec: 206 typedef mv_t type_inferenced_srec_field_copy_getter_t(lrece_t* pentry, lhmsmv_t* ptyped_overlay); 207 mv_t get_copy_srec_value_string_only_aux(lrece_t* pentry, lhmsmv_t* ptyped_overlay); 208 mv_t get_copy_srec_value_string_float_aux(lrece_t* pentry, lhmsmv_t* ptyped_overlay); 209 mv_t get_copy_srec_value_string_float_int_aux(lrece_t* pentry, lhmsmv_t* ptyped_overlay); 210 211 #endif // RVAL_EVALUATORS_H 212