00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 #include "mit-copyright.h"
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 #include "node.h"
00018 #include "eval.h"
00019 #include "substitute.h"
00020 #include "port.h"
00021 #include "buffer.h"
00022 #include "regexp.h"
00023 #include "text_operations.h"
00024 #include "main.h"
00025 #include "variables.h"
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 #define  string_to_bool(str)      (!strcasecmp(str,"true"))
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 static string 
00056 bool_to_string(bool)
00057         int bool;
00058 {
00059         return (bool ? string_Copy("TRUE") : string_Copy("FALSE"));
00060 }
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 
00070 int 
00071 eval_bool_expr(expr)
00072         Node *expr;
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 }
00086 
00087 
00088 
00089 
00090 
00091 
00092 
00093 
00094 
00095 
00096 
00097 
00098 
00099 
00100 
00101 
00102 string 
00103 eval_expr(expr)
00104         Node *expr;
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();         
00112 
00113         dprintf(dEval, "Eval Opcode %d\n", opcode);
00114 
00115         
00116 
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 
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 
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 
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 }