Annotation of ADD_ver_10/BasesDatos.c, revision 1.2

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

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