1 /* vim: set et sts=4 sw=4 fdm=indent fdl=1 fdn=0 fo+=t tw=80:
3 * Taller de Programación (75.42).
6 * Programa calculadora.
8 * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
9 * Puede copiar, modificar y distribuir este programa bajo los términos de
10 * la licencia GPL (http://www.gnu.org/).
12 * Creado: mar sep 16 05:52:09 ART 2003
20 #include "variable_list.h"
22 #include "equation_list.h"
23 #include "parseerror.h"
24 #include "parser_expression.h"
30 #include "memdebug_debugger.h"
32 size_t DLList_equation_print(DLList* l, FILE* fp) {
35 for (eq = DLList_begin(l); DLList_have_more(l); eq = DLList_next(l)) {
36 cant += Equation_print(eq, fp);
41 void DLList_equation_delete(DLList* l) {
43 while (!DLList_empty(l)) {
44 Equation_delete((Equation*)DLList_pop(l));
50 void DLList_equation_eval(DLList* vl, DLList* el, FILE* fp) {
55 ParseError* error = ParseError_new();
57 fprintf(fp, "Error: No se puede crear el manejo de errores.\n");
60 for (eq = DLList_begin(el); DLList_have_more(el); eq = DLList_next(el)) {
61 if (!DLList_variable_find(vl, eq->variable)) {
62 fprintf(fp, "Error: No existe la variable '%s'.\n", eq->variable);
65 var = DLList_current(vl);
66 exp = strutil_copy_stripspaces(eq->expression, strlen(eq->expression));
68 fprintf(fp, "Error: No hay memoria para copiar la expresión.\n");
71 if (!parser_expression(exp, strlen(exp), &result, vl, error)) {
73 ParseError_print(error, fp);
77 if (var->have_min && (result < var->min)) {
78 fprintf(fp, "Error: El valor de la variable '%s' no puede ser "
79 "menor a %f (resultado: %f).\n", var->variable, var->min,
83 if (var->have_max && (result > var->max)) {
84 fprintf(fp, "Error: El valor de la variable '%s' no puede ser "
85 "mayor a %f (resultado: %f).\n", var->variable, var->max,
90 if (!var->have_min && !var->have_max) {
91 fprintf(fp, "Error: La variable (constante) '%s' no puede ser "
92 "modificada (resultado: %f).\n", var->variable, result);
97 ParseError_delete(error);