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