]> git.llucax.com Git - z.facultad/75.42/calculadora.git/blob - variable.c
74f403ce45f549039bc36b6820c34e1c40a61699
[z.facultad/75.42/calculadora.git] / variable.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: lun sep 15 01:10:28 ART 2003
13  *
14  * $Id$
15  */
16
17 #include "variable.h"
18 #include "strutil.h"
19 #include <stdlib.h>
20 #include <string.h>
21
22 #include "memdebug_debugger.h"
23
24 Variable* Variable_new(const char* line, size_t var_start, size_t var_len) {
25     Variable* var = malloc(sizeof(Variable));
26     if (var) {
27         /* Copio el fragmento de la variable. */
28         var->variable = strutil_copy_fragment(line, var_start, var_len);
29         /* Si no hay más memoria, libero el resto y devuelvo NULL. */
30         if (!var->variable) {
31             free(var);
32             return NULL;
33         }
34         var->have_min = FALSE;
35         var->have_max = FALSE;
36     }
37     return var;
38 }
39
40 void Variable_delete(Variable* var) {
41     if (var) {
42         free(var->variable);
43     }
44     free(var);
45 }
46
47 /* simplifico el manejo de errores, false si hubo error. */
48 bool Variable_set_value(Variable* var, const char* line, size_t start,
49         size_t len) {
50     char* err = NULL;
51     char* str = strutil_copy_fragment(line, start, len);
52     if (!str) {
53         return FALSE;
54     }
55     var->value = strtod(str, &err);
56     /* Si el caracter donde apunta error no es 0 es porque hay error. */
57     if (*err != '\0') {
58         /* Libero memoria reservada. */
59         free(str);
60         return FALSE;
61     }
62     free(str);
63     return TRUE;
64 }
65
66 /* simplifico el manejo de errores, false si hubo error. */
67 bool Variable_set_min(Variable* var, const char* line, size_t start,
68         size_t len) {
69     char* err = NULL;
70     char* str = strutil_copy_fragment(line, start, len);
71     if (!str) {
72         return FALSE;
73     }
74     var->min = strtod(str, &err);
75     /* Si el caracter donde apunta error no es 0 es porque hay error. */
76     if (*err != '\0') {
77         /* Libero memoria reservada. */
78         free(str);
79         return FALSE;
80     }
81     free(str);
82     var->have_min = TRUE;
83     return TRUE;
84 }
85
86 /* simplifico el manejo de errores, false si hubo error. */
87 bool Variable_set_max(Variable* var, const char* line, size_t start,
88         size_t len) {
89     char* err = NULL;
90     char* str = strutil_copy_fragment(line, start, len);
91     if (!str) {
92         return FALSE;
93     }
94     var->max = strtod(str, &err);
95     /* Si el caracter donde apunta error no es 0 es porque hay error. */
96     if (*err != '\0') {
97         /* Libero memoria reservada. */
98         free(str);
99         return FALSE;
100     }
101     free(str);
102     var->have_max = TRUE;
103     return TRUE;
104 }
105
106 /* simplifico el manejo de errores, false si hubo error. */
107 bool Variable_check_min_max(Variable* var) {
108     return !var->have_min
109         || !var->have_max
110         || (var->min <= var->max);
111 }
112
113 size_t Variable_print(Variable* var, FILE* fp) {
114     size_t cant = 0;
115     cant += fprintf(fp, "%s = %f", var->variable, var->value);
116     if (var->have_min || var->have_max) {
117         cant += fprintf(fp, "(");
118     }
119     if (var->have_min) {
120         cant += fprintf(fp, "min = %f", var->min);
121     }
122     if (var->have_min && var->have_max) {
123         cant += fprintf(fp, ", ");
124     }
125     if (var->have_max) {
126         cant += fprintf(fp, "max = %f", var->max);
127     }
128     if (var->have_min || var->have_max) {
129         cant += fprintf(fp, ")");
130     }
131     cant += fprintf(fp, "\n");
132     return cant;
133 }
134