|
|
#include "mit-copyright.h"
#include "node.h"
#include "eval.h"
#include "substitute.h"
#include "port.h"
#include "buffer.h"
#include "regexp.h"
#include "text_operations.h"
#include "main.h"
#include "variables.h"
Go to the source code of this file.
Defines | |
#define | string_to_bool(str) (!strcasecmp(str,"true")) |
Functions | |
int | eval_bool_expr (Node *expr) |
string | eval_expr (Node *expr) |
|
Definition at line 42 of file eval.c. Referenced by eval_bool_expr(), and eval_expr(). |
|
Definition at line 71 of file eval.c. References eval_expr(), Node, string, and string_to_bool. 00073 { 00074 string temp; 00075 int result; 00076 00077 if (!expr) 00078 return (1); 00079 00080 temp = eval_expr(expr); 00081 result = string_to_bool(temp); 00082 free(temp); 00083 00084 return (result); 00085 }
|
|
Definition at line 103 of file eval.c. References AND_OPCODE, BUFFER_OPCODE, buffer_to_string(), dEval, DOWNCASE_OPCODE, dprintf(), ed_regexp_match_p(), EQ_OPCODE, eval_expr(), GET_OPCODE, getenv(), GETENV_OPCODE, JVAR_OPCODE, jVars_get(), jVars_stoi(), lany(), LANY_OPCODE, lbreak(), LBREAK_OPCODE, lspan(), LSPAN_OPCODE, NEQ_OPCODE, Node, NOT_OPCODE, OR_OPCODE, paragraph(), PARAGRAPH_OPCODE, PLUS_OPCODE, protect(), PROTECT_OPCODE, rany(), RANY_OPCODE, rbreak(), RBREAK_OPCODE, read_from_port(), REGEQ_OPCODE, REGNEQ_OPCODE, rspan(), RSPAN_OPCODE, string, string_Concat, STRING_CONSTANT_OPCODE, string_Copy, string_Downcase(), string_Eq, string_Neq, string_to_bool, string_to_character_class(), string_Upcase(), substitute(), SUBSTITUTE_OPCODE, UPCASE_OPCODE, var_get_variable(), var_set_variable(), VARREF_OPCODE, verbatim(), and VERBATIM_OPCODE. 00105 { 00106 int opcode = expr->opcode; 00107 int bool_result = 0; 00108 string first, second; 00109 char *result = 0; 00110 string *text_ptr; 00111 char *getenv(); /* UNIX get environment variable function */ 00112 00113 dprintf(dEval, "Eval Opcode %d\n", opcode); 00114 00115 /* 00116 * Dispatch based on the opcode of the top node in the expression: 00117 */ 00118 switch (opcode) { 00119 case STRING_CONSTANT_OPCODE: 00120 return (string_Copy(expr->d.string_constant)); 00121 00122 case VARREF_OPCODE: 00123 return (string_Copy(var_get_variable(expr->d.string_constant))); 00124 00125 case BUFFER_OPCODE: 00126 return (string_Copy(buffer_to_string())); 00127 00128 /* 00129 * Handle unary expressions: 00130 */ 00131 case NOT_OPCODE: 00132 case SUBSTITUTE_OPCODE: 00133 case PROTECT_OPCODE: 00134 case VERBATIM_OPCODE: 00135 case GETENV_OPCODE: 00136 case UPCASE_OPCODE: 00137 case DOWNCASE_OPCODE: 00138 case JVAR_OPCODE: 00139 case GET_OPCODE: 00140 first = eval_expr(expr->d.nodes.first); 00141 00142 switch (opcode) { 00143 case NOT_OPCODE: 00144 result = bool_to_string(!string_to_bool(first)); 00145 break; 00146 00147 case SUBSTITUTE_OPCODE: 00148 result = substitute(var_get_variable, first); 00149 break; 00150 00151 case PROTECT_OPCODE: 00152 result = protect(first); 00153 break; 00154 00155 case VERBATIM_OPCODE: 00156 return (verbatim(first, 0)); 00157 00158 case GETENV_OPCODE: 00159 result = getenv(first); 00160 if (!result) 00161 result = string_Copy(""); 00162 else 00163 result = string_Copy(result); 00164 break; 00165 00166 case UPCASE_OPCODE: 00167 return (string_Upcase(first)); 00168 00169 case DOWNCASE_OPCODE: 00170 return (string_Downcase(first)); 00171 00172 case JVAR_OPCODE: 00173 result = jVars_get(jVars_stoi(first)); 00174 if (!result) 00175 result = string_Copy(""); 00176 else 00177 result = string_Copy(result); 00178 break; 00179 00180 case GET_OPCODE: 00181 result = read_from_port(first); 00182 break; 00183 } 00184 free(first); 00185 break; 00186 00187 /* 00188 * Handle binary operators: 00189 */ 00190 case PLUS_OPCODE: 00191 case AND_OPCODE: 00192 case OR_OPCODE: 00193 case EQ_OPCODE: 00194 case NEQ_OPCODE: 00195 case REGEQ_OPCODE: 00196 case REGNEQ_OPCODE: 00197 first = eval_expr(expr->d.nodes.first); 00198 second = eval_expr(expr->d.nodes.second); 00199 00200 switch (opcode) { 00201 case PLUS_OPCODE: 00202 result = string_Concat(first, second); 00203 free(first); 00204 free(second); 00205 return (result); 00206 00207 case AND_OPCODE: 00208 bool_result = string_to_bool(first) && string_to_bool(second); 00209 break; 00210 00211 case OR_OPCODE: 00212 bool_result = string_to_bool(first) || string_to_bool(second); 00213 break; 00214 00215 case EQ_OPCODE: 00216 bool_result = string_Eq(first, second); 00217 break; 00218 00219 case NEQ_OPCODE: 00220 bool_result = string_Neq(first, second); 00221 break; 00222 00223 case REGEQ_OPCODE: 00224 bool_result = ed_regexp_match_p(first, second); 00225 break; 00226 00227 case REGNEQ_OPCODE: 00228 bool_result = !ed_regexp_match_p(first, second); 00229 break; 00230 } 00231 free(first); 00232 free(second); 00233 result = bool_to_string(bool_result); 00234 break; 00235 00236 /* 00237 * Handle text-manipulation operators: 00238 */ 00239 case LANY_OPCODE: 00240 case RANY_OPCODE: 00241 case LBREAK_OPCODE: 00242 case RBREAK_OPCODE: 00243 case LSPAN_OPCODE: 00244 case RSPAN_OPCODE: 00245 case PARAGRAPH_OPCODE: 00246 first = eval_expr(expr->d.nodes.first); 00247 second = eval_expr(expr->d.nodes.second); 00248 text_ptr = &first; 00249 00250 switch (opcode) { 00251 case LANY_OPCODE: 00252 result = lany(text_ptr, second); 00253 break; 00254 00255 case RANY_OPCODE: 00256 result = rany(text_ptr, second); 00257 break; 00258 00259 case LBREAK_OPCODE: 00260 result = lbreak(text_ptr, string_to_character_class(second)); 00261 break; 00262 00263 case RBREAK_OPCODE: 00264 result = rbreak(text_ptr, string_to_character_class(second)); 00265 break; 00266 00267 case LSPAN_OPCODE: 00268 result = lspan(text_ptr, string_to_character_class(second)); 00269 break; 00270 00271 case RSPAN_OPCODE: 00272 result = rspan(text_ptr, string_to_character_class(second)); 00273 break; 00274 00275 case PARAGRAPH_OPCODE: 00276 result = paragraph(text_ptr, atoi(second)); 00277 break; 00278 } 00279 00280 if (expr->d.nodes.first->opcode == VARREF_OPCODE) 00281 var_set_variable(expr->d.nodes.first->d.string_constant, first); 00282 free(first); 00283 free(second); 00284 break; 00285 } 00286 00287 return (result); 00288 }
|
Last updated at Tue Dec 18 21:07:42 PST 2007. | This site and project hosted by... |