]> git.llucax.com Git - z.facultad/75.42/calculadora.git/blob - equation.c
Últimos retoques.
[z.facultad/75.42/calculadora.git] / equation.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 "equation.h"
18 #include <stdlib.h>
19 #include <string.h>
20
21 #include "memdebug_debugger.h"
22
23 /**
24  * Copia un fragmento de una cadena devolviendo el puntero a la copia.
25  *
26  * \param str Cadena de caracteres original.
27  * \param start Comienzo del fragmento a copiar.
28  * \param len Longitud del fragmento a copiar.
29  *
30  * \return Fragmento copiado.
31  */
32 char* Equation_copy_fragment(const char* str, size_t start, size_t len) {
33     /* Reservo el espacio (incluyendo el caracter nulo). */
34     char* new = malloc(sizeof(char) * (len + 1));
35     if (new) {
36         /* Copio el fragmento. */
37         strncpy(new, str + start, len);
38         /* Termino la cadena. */
39         new[len] = '\0';
40     /* Si no pude reservar la memoria, devuelvo NULL. */
41     }
42     return new;
43 }
44
45 Equation* Equation_new(const char* line, size_t var_start, size_t var_len,
46         size_t exp_start, size_t exp_len) {
47     Equation* eq = malloc(sizeof(Equation));
48     if (eq) {
49         /* Copio el fragmento de la variable. */
50         eq->variable = Equation_copy_fragment(line, var_start, var_len);
51         /* Si no hay más memoria, libero el resto y devuelvo NULL. */
52         if (!eq->variable) {
53             free(eq);
54             return NULL;
55         }
56         /* Copio el fragmento de la ecuación. */
57         eq->expression = Equation_copy_fragment(line, exp_start, exp_len);
58         /* Si no hay más memoria, libero el resto y devuelvo NULL. */
59         if (!eq->expression) {
60             free(eq->variable);
61             free(eq);
62             return NULL;
63         }
64     }
65     return eq;
66 }
67
68 void Equation_delete(Equation* eq) {
69     if (eq) {
70         free(eq->variable);
71         free(eq->expression);
72     }
73     free(eq);
74 }
75
76 size_t Equation_print(Equation* eq, FILE* fp) {
77     return fprintf(fp, "%s = %s\n", eq->variable, eq->expression);
78 }
79