Annotation of ADD_ver_10/BasesDatos.c, revision 1.1

1.1     ! rico        1: /********************************************************************/
        !             2: /*  BasesDatos.c                                                    */
        !             3: /*                                                                  */
        !             4: /*  Copyright (c) 1997-2006 Rafael Rico      (rafael.rico@uah.es)   */
        !             5: /*                                                                  */
        !             6: /*  This file is part of ADD version 5.10.                          */
        !             7: /*                                                                  */
        !             8: /*  ADD is free software; you can redistribute it and/or modify     */
        !             9: /*  it under the terms of the GNU General Public License as         */
        !            10: /*  published by the Free Software Foundation; either version 2 of  */
        !            11: /*  the License, or (at your option) any later version.             */
        !            12: /*                                                                  */
        !            13: /*  ADD is distributed in the hope that it will be useful,          */
        !            14: /*  but WITHOUT ANY WARRANTY; without even the implied warranty of  */
        !            15: /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   */
        !            16: /*  GNU General Public License for more details.                    */
        !            17: /*                                                                  */
        !            18: /*  You should have received a copy of the GNU General Public       */
        !            19: /*  License along with ADD; if not, write to the Free Software      */
        !            20: /*  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA        */
        !            21: /*  02111-1307  USA                                                 */
        !            22: /*                                                                  */
        !            23: /*  --------------------------- History --------------------------- */
        !            24: /*                                                                  */
        !            25: /*  Revision 1.2. 01/2006                                           */
        !            26: /*  Added GPL License and JavaDoc style documentation               */
        !            27: /*                                                                  */
        !            28: /*  Revision 1.1. 09/2005                                           */
        !            29: /*  Initial Revision                                                */
        !            30: /*                                                                  */
        !            31: /********************************************************************/
        !            32: 
        !            33: /******************************************************************************/
        !            34: /* MÓDULO: BasesDatos.c                                                       */
        !            35: /*                                                                            */
        !            36: /* Este módulo carga en memoria la base de datos que modela la arquitectura   */
        !            37: /* del repertorio IA16 (tabla de nemónicos y tabla de ubicaciones de datos)   */
        !            38: /* y la tabla de tiempos de un procesador en ciclos (tiempo de ejecución de   */
        !            39: /* operaciones, tiempo de acceso a operandos y tiempo de cómputo de           */
        !            40: /* direcciones de memoria.                                                    */
        !            41: /******************************************************************************/
        !            42: /* Fecha: 19 de septiembre de 2005                                            */
        !            43: /******************************************************************************/
        !            44: 
        !            45: #include <stdio.h>
        !            46: #include <stdlib.h>
        !            47: #include <string.h>
        !            48: 
        !            49: #include "defines.h"
        !            50: #include "tipos.h"
        !            51: #include "basesdatos.h"
        !            52: 
        !            53: 
        !            54: /* configuración */
        !            55: extern struct argumentos configuracion;
        !            56: 
        !            57: /* bases de datos */
        !            58: extern unsigned int num_nemonicos;
        !            59: extern operacion *nemonicos;
        !            60: extern unsigned int num_simbolos;
        !            61: extern operando *simbolos;
        !            62: extern unsigned int num_tiempos;
        !            63: extern tiempo *ciclos;
        !            64: 
        !            65: 
        !            66: void CargarArquitecturaIA16Nemonicos(FILE *f_ia16_nemos)
        !            67: {
        !            68:     unsigned int i;
        !            69:     char linea[MAX_LINE];
        !            70:     char *registro, *campo;
        !            71:        char mensaje[MAX_LINE];
        !            72: 
        !            73: 
        !            74:     sprintf(mensaje, "[CargarArquitecturaIA16Nemonicos] Cargando base de datos del repertorio IA16...");
        !            75:        Notificar(mensaje, NO_ERROR, ECO_NO);
        !            76: 
        !            77:     /* salto los comentarios */
        !            78:     do fgets (linea, MAX_LINE, f_ia16_nemos); while (linea[0]=='#');
        !            79: 
        !            80:     /* leo el número de registros (primera línea con información) */
        !            81:     num_nemonicos = atoi(linea);
        !            82: 
        !            83:     sprintf(mensaje, "[CargarArquitecturaIA16Nemonicos] Reservo memoria para %d registros", num_nemonicos);
        !            84:        Notificar(mensaje, NO_ERROR, ECO_NO);
        !            85: 
        !            86:     /* malloc reserva memoria; calloc reserva memoria y rellena con 0's */
        !            87:     /* calloc es más lenta pero me asegura que los valores numéricos van */
        !            88:     /* a ser 0 y las cadenas van a ser vacías */
        !            89:     nemonicos = calloc(num_nemonicos, sizeof(operacion));
        !            90:     if (nemonicos == NULL)
        !            91:     {
        !            92:         sprintf(mensaje, "[CargarArquitecturaIA16Nemonicos] Memoria insuficiente");
        !            93:                Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !            94:                /* el programa finaliza si no hay memoria suficiente */
        !            95:     }
        !            96: 
        !            97:     sprintf(mensaje, "[CargarArquitecturaIA16Nemonicos] Cargando datos de nemónicos...");
        !            98:        Notificar(mensaje, NO_ERROR, ECO_NO);
        !            99: 
        !           100:     i = 0;
        !           101:     while(i<num_nemonicos)
        !           102:     {
        !           103:         /* salto los comentarios */
        !           104:         do fgets (linea, MAX_LINE, f_ia16_nemos); while(linea[0]=='#');
        !           105: 
        !           106:         /* hago un barrido de la línea hasta encontrar el final de línea */
        !           107:         /* cada ocurrencia de '\t' la cambio por '\0' para convertirlo   */
        !           108:         /* en una cadena separada (campo)                                */
        !           109: 
        !           110:         /* el puntero 'registro' me permite moverme por la línea */
        !           111:         /* el puntero 'campo' se encarga se señalar el comienzo de los campos */
        !           112:         registro = linea;
        !           113:         campo = linea;
        !           114:         while(*++registro!='\0')
        !           115:         {
        !           116:             if(*registro=='\t')
        !           117:             {
        !           118:                 *registro = '\0';    /* finalizo un campo */
        !           119:                 /* campo nemonico */
        !           120:                 if(campo[0]!='-') strcpy(nemonicos[i].nemonico, campo);
        !           121:                 else
        !           122:                 {
        !           123:                     switch(campo[1])
        !           124:                     {
        !           125:                         case 't':    /* tipo de nemonico */
        !           126:                         nemonicos[i].tipo = atoi(campo+3);
        !           127:                         break;
        !           128: 
        !           129:                         case '1':    /* modo del operando 1 (destino) explícito */
        !           130:                         nemonicos[i].modo_op1 = atoi(campo+3);
        !           131:                         break;
        !           132: 
        !           133:                         case '2':    /* modo del operando 2 (fuente) explícito */
        !           134:                         nemonicos[i].modo_op2 = atoi(campo+3);
        !           135:                         break;
        !           136: 
        !           137:                         case 'e':   /* implícitos escritos */
        !           138:                         strcpy(nemonicos[i].implicitos_escritos, campo+3);
        !           139:                         break;
        !           140: 
        !           141:                         case 'l':   /* implícitos leidos */
        !           142:                         strcpy(nemonicos[i].implicitos_leidos, campo+3);
        !           143:                         break;
        !           144: 
        !           145:                         default:
        !           146:                         /* mandar un error a un fichero de log */
        !           147:                         break;
        !           148:                     }
        !           149:                 }
        !           150:                 campo = registro+1;    /* hago que apunte al siguiente */
        !           151:             }
        !           152:         }
        !           153: 
        !           154:         /* echo */
        !           155:         /* printf("%3d %10s %d %d\t%15s\t%30s\n", i, operaciones[i].nemonico, 
        !           156:                      operaciones[i].modo_fuente, operaciones[i].modo_destino, 
        !           157:                      operaciones[i].implicitos_leidos, 
        !           158:                      operaciones[i].implicitos_escritos); */
        !           159:         /* _getch(); */
        !           160: 
        !           161:         i++;    /* índice del siguiente registro */
        !           162:     }
        !           163: 
        !           164:     sprintf(mensaje, "[CargarArquitecturaIA16Nemonicos] La tabla de nemónicos se ha cargado con éxito");
        !           165:        Notificar(mensaje, NO_ERROR, ECO_NO);
        !           166: }
        !           167: 
        !           168: 
        !           169: void CargarArquitecturaIA16Simbolos(FILE *f_ia16_ubis)
        !           170: {
        !           171:     unsigned int i;
        !           172:     char linea[MAX_LINE];
        !           173:     char *campo;
        !           174:        char mensaje[MAX_LINE];
        !           175: 
        !           176:     sprintf(mensaje, "[CargarArquitecturaIA16Simbolos] Cargando base de datos del repertorio IA16...");
        !           177:        Notificar(mensaje, NO_ERROR, ECO_NO);
        !           178: 
        !           179:     /* salto los comentarios */
        !           180:     do fgets (linea, MAX_LINE, f_ia16_ubis); while (linea[0]=='#');
        !           181: 
        !           182:     /* leo el número de registros (primera línea con información) */
        !           183:     num_simbolos = atoi(linea);
        !           184: 
        !           185:     sprintf(mensaje, "[CargarArquitecturaIA16Simbolos] Reservo memoria para %d registros", num_simbolos);
        !           186:        Notificar(mensaje, NO_ERROR, ECO_NO);
        !           187: 
        !           188:     /* malloc reserva memoria; calloc reserva memoria y rellena con 0's */
        !           189:     /* calloc es más lenta pero me asegura que los valores numéricos van */
        !           190:     /* a ser 0 y las cadenas van a ser vacías */
        !           191:     simbolos = calloc(num_simbolos, sizeof(operando));
        !           192:     if (simbolos == NULL)
        !           193:     {
        !           194:         sprintf(mensaje, "[CargarArquitecturaIA16Simbolos] Memoria insuficiente");
        !           195:                Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !           196:                /* el programa finaliza si no hay memoria suficiente */
        !           197:     }
        !           198: 
        !           199:     sprintf(mensaje, "[CargarArquitecturaIA16Simbolos] Cargando datos de símbolos...");
        !           200:        Notificar(mensaje, NO_ERROR, ECO_NO);
        !           201: 
        !           202:     i = 0;
        !           203:     while(i<num_simbolos)
        !           204:     {
        !           205:         /* salto los comentarios */
        !           206:         do fgets (linea, MAX_LINE, f_ia16_ubis); while(linea[0]=='#');
        !           207: 
        !           208:         campo = strtok(linea, "\t\n");    /* el separador de campos es '\t' */
        !           209:                                           /* añado '\n' porque al final de linea */
        !           210:                                           /* tengo ese caracter y lo toma por un campo */
        !           211:         while(campo != NULL)
        !           212:         {
        !           213:             /* trato el campo capturado por la función strtok */
        !           214:             /* campo símbolo */
        !           215:             if(campo[0]!='-') strcpy(simbolos[i].simbolo, campo);
        !           216:             else
        !           217:             {
        !           218:                 switch(campo[1])
        !           219:                 {
        !           220:                     case 'd':    /* dependencias */
        !           221:                     strcpy(simbolos[i].dependencias, campo+3);
        !           222:                     break;
        !           223: 
        !           224:                     case 's':    /* segmento por defecto */
        !           225:                     simbolos[i].segmento = atoi (campo+3);
        !           226:                     break;
        !           227: 
        !           228:                     case 't':    /* tipo de ubicación */
        !           229:                     simbolos[i].tipo = atoi (campo+3);
        !           230:                     break;
        !           231: 
        !           232:                     default:
        !           233:                     /* mandar un error a un fichero de log */
        !           234:                     break;
        !           235:                 }
        !           236:             }
        !           237:             /* capturo el siguiente campo */
        !           238:             campo = strtok(NULL, "\t\n");
        !           239:         }
        !           240:                
        !           241:                /* echo */
        !           242:                /* printf(); */
        !           243:                /* _getch(); */
        !           244: 
        !           245:                i++;    /* índice del siguiente registro */
        !           246:     }
        !           247: 
        !           248:     sprintf(mensaje, "[CargarArquitecturaIA16Simbolos] La tabla de símbolos se ha cargado con éxito");
        !           249:        Notificar(mensaje, NO_ERROR, ECO_NO);
        !           250: }
        !           251: 
        !           252: 
        !           253: void CargarTiemposProcesador(FILE *f_procesador)
        !           254: {
        !           255:     unsigned int i;
        !           256:     char linea[MAX_LINE];
        !           257:     char *campo;
        !           258:        char mensaje[MAX_LINE];
        !           259: 
        !           260:     sprintf(mensaje, "[CargarTiemposProcesador] Cargando base de datos del procesador...");
        !           261:        Notificar(mensaje, NO_ERROR, ECO_NO);
        !           262: 
        !           263:     /* salto los comentarios */
        !           264:     do fgets (linea, MAX_LINE, f_procesador); while (linea[0]=='#');
        !           265: 
        !           266:     /* leo el número de registros (primera línea con información) */
        !           267:     num_tiempos = atoi(linea);
        !           268: 
        !           269:     sprintf(mensaje, "[CargarTiemposProcesador] Reservo memoria para %d registros", num_tiempos);
        !           270:        Notificar(mensaje, NO_ERROR, ECO_NO);
        !           271: 
        !           272:     /* malloc reserva memoria; calloc reserva memoria y rellena con 0's */
        !           273:     /* calloc es más lenta pero me asegura que los valores numéricos van */
        !           274:     /* a ser 0 y las cadenas van a ser vacías */
        !           275:     ciclos = calloc(num_tiempos, sizeof(tiempo));
        !           276:     if (ciclos == NULL)
        !           277:     {
        !           278:         sprintf(mensaje, "[CargarTiemposProcesador] Memoria insuficiente");
        !           279:                Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !           280:                /* el programa finaliza si no hay memoria suficiente */
        !           281:     }
        !           282: 
        !           283:     sprintf(mensaje, "[CargarTiemposProcesador] Cargando datos de tiempos...");
        !           284:        Notificar(mensaje, NO_ERROR, ECO_NO);
        !           285: 
        !           286:     i = 0;
        !           287:     while(i<num_tiempos)
        !           288:     {
        !           289:         /* salto los comentarios */
        !           290:         do fgets (linea, MAX_LINE, f_procesador); while(linea[0]=='#');
        !           291: 
        !           292:         campo = strtok(linea, "\t\n");    /* el separador de campos es '\t' */
        !           293:                                           /* añado '\n' porque al final de linea */
        !           294:                                           /* tengo ese caracter y lo toma por un campo */
        !           295:         while(campo != NULL)
        !           296:         {
        !           297:             /* trato el campo capturado por la función strtok */
        !           298:             /* campo identificador */
        !           299:             if(campo[0]!='-') strcpy(ciclos[i].identificador, campo);
        !           300:             else
        !           301:             {
        !           302:                 switch(campo[1])
        !           303:                 {
        !           304:                     case 'c':    /* dependencias */
        !           305:                     ciclos[i].ciclos = atoi (campo+3);
        !           306:                     break;
        !           307: 
        !           308:                     default:
        !           309:                     /* mandar un error a un fichero de log */
        !           310:                     break;
        !           311:                 }
        !           312:             }
        !           313:             /* capturo el siguiente campo */
        !           314:             campo = strtok(NULL, "\t\n");
        !           315:         }
        !           316: 
        !           317:         /* echo */
        !           318:         /* printf(); */
        !           319:         /* _getch(); */
        !           320:                
        !           321:                i++;    /* índice del siguiente registro */
        !           322:     }
        !           323: 
        !           324:     sprintf(mensaje, "[CargarTiemposProcesador] La tabla de tiempos se ha cargado con éxito");
        !           325:        Notificar(mensaje, NO_ERROR, ECO_NO);
        !           326: }
        !           327: 
        !           328: 
        !           329: void CargarArquitecturaIA16()
        !           330: {
        !           331:        FILE *f_ia16_nemos, *f_ia16_ubis;
        !           332:        char mensaje[MAX_LINE];
        !           333: 
        !           334:     
        !           335:        /* abro el fichero de nemónicos de la arquitectura del repertorio */
        !           336:     if((f_ia16_nemos  = fopen(configuracion.ficheronemos, "r")) != NULL)
        !           337:     {
        !           338:         sprintf(mensaje, "[CargarArquitecturaIA16] El fichero '%s' se ha abierto con éxito", configuracion.ficheronemos);
        !           339:                Notificar(mensaje, NO_ERROR, ECO_NO);
        !           340: 
        !           341:         CargarArquitecturaIA16Nemonicos(f_ia16_nemos);
        !           342: 
        !           343:         /* cierro el fichero de nemónicos */
        !           344:         if(fclose(f_ia16_nemos))
        !           345:                {
        !           346:                        sprintf(mensaje, "[CargarArquitecturaIA16] El fichero '%s' no se ha podido cerrar", configuracion.ficheronemos);
        !           347:                        Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
        !           348:                }
        !           349:     }
        !           350:     else
        !           351:        {
        !           352:                sprintf(mensaje, "[CargarArquitecturaIA16] El fichero '%s' no se ha podido abrir", configuracion.ficheronemos);
        !           353:                Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !           354:        }
        !           355: 
        !           356: 
        !           357:     /* abro el fichero de ubicaciones de la arquitectura del repertorio */
        !           358:     if((f_ia16_ubis  = fopen(configuracion.ficheroubis, "r")) != NULL)
        !           359:     {
        !           360:         sprintf(mensaje, "[CargarArquitecturaIA16] El fichero '%s' se ha abierto con éxito", configuracion.ficheroubis);
        !           361:                Notificar(mensaje, NO_ERROR, ECO_NO);
        !           362: 
        !           363:         CargarArquitecturaIA16Simbolos(f_ia16_ubis);
        !           364: 
        !           365:         /* cierro el fichero de ubicaciones */
        !           366:         if(fclose(f_ia16_ubis))
        !           367:                {
        !           368:                        sprintf(mensaje, "[CargarArquitecturaIA16] El fichero '%s' no se ha podido cerrar", configuracion.ficheroubis);
        !           369:                        Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
        !           370:                }
        !           371:     }
        !           372:     else
        !           373:        {
        !           374:                sprintf(mensaje, "[CargarArquitecturaIA16] El fichero '%s' no se ha podido abrir", configuracion.ficheroubis);
        !           375:                Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !           376:        }
        !           377: }
        !           378: 
        !           379: 
        !           380: void CargarProcesador()
        !           381: {
        !           382:        FILE *f_procesador;
        !           383:        char mensaje[MAX_LINE];
        !           384: 
        !           385: 
        !           386:        /* abro el fichero con la tabla de tiempos del procesador */
        !           387:     if((f_procesador  = fopen(configuracion.ficherociclos, "r")) != NULL)
        !           388:     {
        !           389:         sprintf(mensaje, "[CargarProcesador] El fichero '%s' se ha abierto con éxito", configuracion.ficherociclos);
        !           390:                Notificar(mensaje, NO_ERROR, ECO_NO);
        !           391: 
        !           392:         CargarTiemposProcesador(f_procesador);
        !           393: 
        !           394:         /* cierro el fichero del procesador */
        !           395:         if(fclose(f_procesador))
        !           396:                {
        !           397:                        sprintf(mensaje, "[CargarProcesador] El fichero '%s' no se ha podido cerrar", configuracion.ficherociclos);
        !           398:                        Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
        !           399:                }
        !           400:     }
        !           401:     else
        !           402:        {
        !           403:                sprintf(mensaje, "[CargarProcesador] El fichero '%s' no se ha podido abrir", configuracion.ficherociclos);
        !           404:                Notificar(mensaje, ERROR_SALIR, ECO_NO);        
        !           405:        }
        !           406: }
        !           407: 
        !           408: 
        !           409: /* carga de las bases de datos */
        !           410: 
        !           411: void CargarBasesDatos()
        !           412: {
        !           413:        CargarArquitecturaIA16();
        !           414:        if(configuracion.cpi == SI) CargarProcesador();
        !           415: }
        !           416: 
        !           417: 
        !           418: /* libera memoria bases de datos */
        !           419: 
        !           420: void LiberarMemoriaBasesDatos()
        !           421: {
        !           422:     free(nemonicos);
        !           423:     free(simbolos);
        !           424:        if(configuracion.cpi == SI) free(ciclos);
        !           425: }
        !           426: 
        !           427: 
        !           428: 
        !           429: #if 0
        !           430: 
        !           431:     /* la función strtok de <string.h> descompone la línea en campos */
        !           432:        /* OJO: modifica la cadena de caracteres de la línea que se le pasa */
        !           433:     
        !           434:     /* capturo el primer campo */    
        !           435:     campo = strtok(linea, "\t");
        !           436:     while(campo != NULL)
        !           437:     {
        !           438:         /* trato el campo */
        !           439:         
        !           440:         /* capturo el siguiente campo */
        !           441:         campo = strtok( NULL, seps );
        !           442:         /* seps son los separadores, en este caso '\t' */
        !           443:     }
        !           444: 
        !           445:     /* la función getopt del POSIX hace algo parecido */
        !           446: #endif
        !           447: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>