+/* vim: set et sts=4 sw=4 fdm=indent fdl=1 fdn=0 fo+=t tw=80:
+ *
+ * Taller de Programación (75.42).
+ *
+ * Ejercicio Número 2:
+ * Programa calculadora.
+ *
+ * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
+ * Puede copiar, modificar y distribuir este programa bajo los términos de
+ * la licencia GPL (http://www.gnu.org/).
+ *
+ * Creado: mar sep 16 05:52:09 ART 2003
+ *
+ * $Id$
+ */
+
+#include "bool.h"
+#include "strutil.h"
+#include "variable.h"
+#include "variable_list.h"
+#include "equation.h"
+#include "equation_list.h"
+#include "parseerror.h"
+#include "parser_expression.h"
+#include "dllist.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "memdebug_debugger.h"
+
+size_t DLList_equation_print(DLList* l, FILE* fp) {
+ size_t cant = 0;
+ Equation* eq;
+ for (eq = DLList_begin(l); DLList_have_more(l); eq = DLList_next(l)) {
+ cant += Equation_print(eq, fp);
+ }
+ return cant;
+}
+
+void DLList_equation_delete(DLList* l) {
+ if (l) {
+ while (!DLList_empty(l)) {
+ Equation_delete((Equation*)DLList_pop(l));
+ }
+ }
+ DLList_delete(l);
+}
+
+void DLList_equation_eval(DLList* vl, DLList* el, FILE* fp) {
+ float result;
+ Equation* eq;
+ Variable* var;
+ char* exp;
+ ParseError* error = ParseError_new();
+ if (!error) {
+ fprintf(fp, "Error: No se puede crear el manejo de errores.\n");
+ return;
+ }
+ for (eq = DLList_begin(el); DLList_have_more(el); eq = DLList_next(el)) {
+ if (!DLList_variable_find(vl, eq->variable)) {
+ fprintf(fp, "Error: No existe la variable '%s'.\n", eq->variable);
+ continue;
+ }
+ var = DLList_current(vl);
+ exp = strutil_copy_stripspaces(eq->expression, strlen(eq->expression));
+ if (!exp) {
+ fprintf(fp, "Error: No hay memoria para copiar la expresión.\n");
+ return;
+ }
+ if (!parser_expression(exp, strlen(exp), &result, vl, error)) {
+ free(exp);
+ ParseError_print(error, fp);
+ continue;
+ }
+ free(exp);
+ if (var->have_min && (result < var->min)) {
+ fprintf(fp, "Error: El valor de la variable '%s' no puede ser "
+ "menor a %f (resultado: %f).\n", var->variable, var->min,
+ result);
+ continue;
+ }
+ if (var->have_max && (result > var->max)) {
+ fprintf(fp, "Error: El valor de la variable '%s' no puede ser "
+ "mayor a %f (resultado: %f).\n", var->variable, var->max,
+ result);
+ continue;
+ }
+ /* Es constante. */
+ if (!var->have_min && !var->have_max) {
+ fprintf(fp, "Error: La variable (constante) '%s' no puede ser "
+ "modificada (resultado: %f).\n", var->variable, result);
+ continue;
+ }
+ var->value = result;
+ }
+ ParseError_delete(error);
+}
+