1 /* vim: set et sts=4 sw=4 fdm=indent fdl=1 fdn=0 fo+=t:
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 04:07:49 ART 2003
18 #include "parseerror.h"
19 #include "parser_variable.h"
20 #include "parser_equation.h"
21 #include "variable_list.h"
22 #include "equation_list.h"
28 #include "memdebug_debugger.h"
30 /** Tamaño del buffer de lectura de archivos. */
31 #define BUFFER_SIZE 4096
34 * Imprime una explicación de como usar el programa.
36 * \param fh Archivo en donde imprimir el mensaje (ej: stdout o stderr).
38 void print_help(FILE* fh) {
40 fprintf(fh, "Modo de uso:\n");
41 fprintf(fh, " tp2 <arch_variables> <arch_ecuaciones>\n");
45 * Dibuja el menú en pantalla.
47 void print_menu(void) {
49 printf(" 1. Listar variables.\n");
50 printf(" 2. Listar ecuaciones.\n");
51 printf(" 3. Evaluar ecuaciones.\n");
52 printf(" 4. Listar memoria.\n");
53 printf(" 5. Salir.\n");
57 * Obtiene la selección del menú del usuario.
59 char get_entrada(void) {
60 char buff[BUFFER_SIZE];
61 printf("Elija una opción: ");
62 fgets(buff, BUFFER_SIZE, stdin);
69 void menu_loop(DLList* var_list, DLList* eq_list) {
72 entrada = get_entrada();
73 /* Mientras no sea '5' (salir), se mantiene en el loop. */
74 while (entrada != '5') {
75 /* Mientras la entrada sea inválida, muestra mensaje de error. */
76 while ((entrada < '1') || (entrada > '5')) {
79 printf("Debe elegir un número entre 1 y 5!\n");
80 entrada = get_entrada();
84 case '1': /* Listar variables */
85 printf("Lista de variables:\n");
86 DLList_variable_print(var_list, stdout);
88 case '2': /* Listar ecuaciones */
89 printf("Lista de ecuaciones:\n");
90 DLList_equation_print(eq_list, stdout);
92 case '3': /* Evaluar ecuaciones */
93 printf("Lista de variables después de evaluar:\n");
94 DLList_equation_eval(var_list, eq_list, stderr);
95 DLList_variable_print(var_list, stdout);
97 case '4': /* Listar memoria */
98 printf("Lista de memoria alocada:\n");
99 memdebug_list_print(stdout);
106 entrada = get_entrada();
111 * Programa principal.
112 * Este es el programa que se encarga de resolver el trabajo práctico.
114 * \param argc Cantidad de parámetros de línea de comandos ingresados.
115 * \param argv Parámetros de línea de comandos.
117 * \return EXIT_FAILURE si hubo un error, si no EXIT_SUCCESS.
119 int main(int argc, const char** argv) {
120 /* Declaración de variables. */
121 DLList* var_list = NULL;
122 DLList* eq_list = NULL;
124 char buff[BUFFER_SIZE];
133 /* Inicializo ParseError. */
134 if (!(error = ParseError_new())) {
135 fprintf(stderr, "Error: No se pudo alocar la memoria para el manejo "
140 /* Inicializo la lista de variables. */
141 if (!(var_list = DLList_new())) {
142 fprintf(stderr, "Error: No se pudo alocar la memoria para la lista "
147 fp = fopen(argv[1], "r");
149 fprintf(stderr, "Error: No se pudo abrir el archivo '%s'.\n", argv[1]);
152 /* Parseo cada línea, mostrando mensaje por pantalla si hay error. */
153 for (i = 1; fgets(buff, BUFFER_SIZE, fp); i++) {
154 if (!parser_variable(buff, strlen(buff) - 1, var_list, error)) {
156 fprintf(stderr, "%s: ", argv[1]);
157 ParseError_print(error, stderr);
160 /* Cierro archivo. */
163 /* Inicializo la lista de ecuaciones. */
164 if (!(eq_list = DLList_new())) {
165 fprintf(stderr, "Error: No se pudo alocar la memoria para la lista "
170 fp = fopen(argv[2], "r");
172 fprintf(stderr, "Error: No se pudo abrir el archivo '%s'.\n", argv[2]);
175 /* Parseo cada línea, mostrando mensaje por pantalla si hay error. */
176 for (i = 1; fgets(buff, BUFFER_SIZE, fp); i++) {
177 if (!parser_equation(buff, strlen(buff) - 1, eq_list, error)) {
179 fprintf(stderr, "%s: ", argv[2]);
180 ParseError_print(error, stderr);
183 /* Cierro archivo. */
186 /* Elimino el error de interpretación. */
187 ParseError_delete(error);
189 menu_loop(var_list, eq_list);
191 /* Elimino listas. */
192 DLList_variable_delete(var_list);
193 DLList_equation_delete(eq_list);
195 /* Veo si quedo memoria sin desalocar. */