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 /* TODO separar #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");
44 void print_menu(void) {
46 printf("1. Listar variables.\n");
47 printf("2. Listar ecuaciones.\n");
48 printf("3. Evaluar ecuaciones.\n");
49 printf("4. Listar memoria.\n");
50 printf("5. Salir.\n");
53 char get_entrada(void) {
54 char buff[BUFFER_SIZE];
55 printf("Elija una opción: ");
56 fgets(buff, BUFFER_SIZE, stdin);
60 void menu_loop(DLList* var_list, DLList* eq_list) {
63 entrada = get_entrada();
64 /* Mientras no sea '5' (salir), se mantiene en el loop. */
65 while (entrada != '5') {
66 /* Mientras la entrada sea inválida, muestra mensaje de error. */
67 while ((entrada < '1') || (entrada > '5')) {
70 printf("Debe elegir un número entre 1 y 5!\n");
71 entrada = get_entrada();
75 case '1': /* Listar variables */
76 printf("Lista de variables:\n");
77 DLList_variable_print(var_list, stdout);
79 case '2': /* Listar ecuaciones */
80 printf("Lista de ecuaciones:\n");
81 DLList_equation_print(eq_list, stdout);
83 case '3': /* Evaluar ecuaciones */
85 printf("Lista de variables después de evaluar:\n");
87 case '4': /* Listar memoria */
88 printf("Lista de memoria alocada:\n");
89 memdebug_list_print(stdout);
96 entrada = get_entrada();
101 * Programa principal.
102 * Este es el programa que se encarga de resolver el trabajo práctico.
104 * \param argc Cantidad de parámetros de línea de comandos ingresados.
105 * \param argv Parámetros de línea de comandos.
107 * \return EXIT_FAILURE si hubo un error, si no EXIT_SUCCESS.
109 int main(int argc, const char** argv) {
110 /* Declaración de variables. */
111 DLList* var_list = NULL;
112 DLList* eq_list = NULL;
114 char buff[BUFFER_SIZE];
123 /* Inicializo ParseError. */
124 if (!(error = ParseError_new())) {
125 fprintf(stderr, "Error: No se pudo alocar la memoria para el manejo "
130 /* Inicializo la lista de variables. */
131 if (!(var_list = DLList_new())) {
132 fprintf(stderr, "Error: No se pudo alocar la memoria para la lista "
137 fp = fopen(argv[1], "r");
139 fprintf(stderr, "Error: No se pudo abrir el archivo '%s'.\n", argv[1]);
142 /* Parseo cada línea, mostrando mensaje por pantalla si hay error. */
143 for (i = 1; fgets(buff, BUFFER_SIZE, fp); i++) {
144 if (!parser_variable(buff, strlen(buff) - 1, var_list, error)) {
146 fprintf(stderr, "%s: ", argv[1]);
147 ParseError_print(error, stderr);
150 /* Cierro archivo. */
153 /* Inicializo la lista de ecuaciones. */
154 if (!(eq_list = DLList_new())) {
155 fprintf(stderr, "Error: No se pudo alocar la memoria para la lista "
160 fp = fopen(argv[2], "r");
162 fprintf(stderr, "Error: No se pudo abrir el archivo '%s'.\n", argv[2]);
165 /* Parseo cada línea, mostrando mensaje por pantalla si hay error. */
166 for (i = 1; fgets(buff, BUFFER_SIZE, fp); i++) {
167 if (!parser_equation(buff, strlen(buff) - 1, eq_list, error)) {
169 fprintf(stderr, "%s: ", argv[2]);
170 ParseError_print(error, stderr);
173 /* Cierro archivo. */
176 /* Elimino el error de interpretación. */
177 ParseError_delete(error);
179 menu_loop(var_list, eq_list);
181 /* Elimino listas. */
182 DLList_variable_delete(var_list);
183 DLList_equation_delete(eq_list);
185 /* Veo si quedo memoria sin desalocar. */