]> git.llucax.com Git - z.facultad/75.42/calculadora.git/blob - equation_list.c
Últimos retoques.
[z.facultad/75.42/calculadora.git] / equation_list.c
1 /* vim: set et sts=4 sw=4 fdm=indent fdl=1 fdn=0 fo+=t tw=80:
2  *
3  * Taller de Programación (75.42).
4  *
5  * Ejercicio Número 2:
6  * Programa calculadora.
7  *
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/).
11  *
12  * Creado: mar sep 16 05:52:09 ART 2003
13  *
14  * $Id$
15  */
16
17 #include "bool.h"
18 #include "strutil.h"
19 #include "variable.h"
20 #include "variable_list.h"
21 #include "equation.h"
22 #include "equation_list.h"
23 #include "parseerror.h"
24 #include "parser_expression.h"
25 #include "dllist.h"
26 #include <stdlib.h>
27 #include <stdio.h>
28 #include <string.h>
29
30 #include "memdebug_debugger.h"
31
32 size_t DLList_equation_print(DLList* l, FILE* fp) {
33     size_t cant = 0;
34     Equation* eq;
35     for (eq = DLList_begin(l); DLList_have_more(l); eq = DLList_next(l)) {
36         cant += Equation_print(eq, fp);
37     }
38     return cant;
39 }
40
41 void DLList_equation_delete(DLList* l) {
42     if (l) {
43         while (!DLList_empty(l)) {
44             Equation_delete((Equation*)DLList_pop(l));
45         }
46     }
47     DLList_delete(l);
48 }
49
50 void DLList_equation_eval(DLList* vl, DLList* el, FILE* fp) {
51     float result;
52     Equation* eq;
53     Variable* var;
54     char* exp;
55     ParseError* error = ParseError_new();
56     if (!error) {
57         fprintf(fp, "Error: No se puede crear el manejo de errores.\n");
58         return;
59     }
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);
63             continue;
64         }
65         var = DLList_current(vl);
66         exp = strutil_copy_stripspaces(eq->expression, strlen(eq->expression));
67         if (!exp) {
68             fprintf(fp, "Error: No hay memoria para copiar la expresión.\n");
69             return;
70         }
71         if (!parser_expression(exp, strlen(exp), &result, vl, error)) {
72             free(exp);
73             ParseError_print(error, fp);
74             continue;
75         }
76         free(exp);
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,
80                     result);
81             continue;
82         }
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,
86                     result);
87             continue;
88         }
89         /* Es constante. */
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);
93             continue;
94         }
95         var->value = result;
96     }
97     ParseError_delete(error);
98 }
99