Annotation of ADD_ver_10/Source Code/Source Files/BasesDatos.c, revision 1.1
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;
! 39: char mensaje[MAX_LINE];
! 40:
! 41:
! 42: sprintf(mensaje, "[CargarArquitecturaIA16Nemonicos] Cargando base de datos del repertorio IA16...");
! 43: Notificar(mensaje, NO_ERROR, ECO_NO);
! 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);
! 52: Notificar(mensaje, NO_ERROR, ECO_NO);
! 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");
! 61: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 62: /* el programa finaliza si no hay memoria suficiente */
! 63: }
! 64:
! 65: sprintf(mensaje, "[CargarArquitecturaIA16Nemonicos] Cargando datos de nemónicos...");
! 66: Notificar(mensaje, NO_ERROR, ECO_NO);
! 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");
! 133: Notificar(mensaje, NO_ERROR, ECO_NO);
! 134: }
! 135:
! 136:
! 137: void CargarArquitecturaIA16Simbolos(FILE *f_ia16_ubis)
! 138: {
! 139: unsigned int i;
! 140: char linea[MAX_LINE];
! 141: char *campo;
! 142: char mensaje[MAX_LINE];
! 143:
! 144: sprintf(mensaje, "[CargarArquitecturaIA16Simbolos] Cargando base de datos del repertorio IA16...");
! 145: Notificar(mensaje, NO_ERROR, ECO_NO);
! 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);
! 154: Notificar(mensaje, NO_ERROR, ECO_NO);
! 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");
! 163: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 164: /* el programa finaliza si no hay memoria suficiente */
! 165: }
! 166:
! 167: sprintf(mensaje, "[CargarArquitecturaIA16Simbolos] Cargando datos de símbolos...");
! 168: Notificar(mensaje, NO_ERROR, ECO_NO);
! 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: }
! 208:
! 209: /* echo */
! 210: /* printf(); */
! 211: /* _getch(); */
! 212:
! 213: i++; /* índice del siguiente registro */
! 214: }
! 215:
! 216: sprintf(mensaje, "[CargarArquitecturaIA16Simbolos] La tabla de símbolos se ha cargado con éxito");
! 217: Notificar(mensaje, NO_ERROR, ECO_NO);
! 218: }
! 219:
! 220:
! 221: void CargarTiemposProcesador(FILE *f_procesador)
! 222: {
! 223: unsigned int i;
! 224: char linea[MAX_LINE];
! 225: char *campo;
! 226: char mensaje[MAX_LINE];
! 227:
! 228: sprintf(mensaje, "[CargarTiemposProcesador] Cargando base de datos del procesador...");
! 229: Notificar(mensaje, NO_ERROR, ECO_NO);
! 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);
! 238: Notificar(mensaje, NO_ERROR, ECO_NO);
! 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");
! 247: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 248: /* el programa finaliza si no hay memoria suficiente */
! 249: }
! 250:
! 251: sprintf(mensaje, "[CargarTiemposProcesador] Cargando datos de tiempos...");
! 252: Notificar(mensaje, NO_ERROR, ECO_NO);
! 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(); */
! 288:
! 289: i++; /* índice del siguiente registro */
! 290: }
! 291:
! 292: sprintf(mensaje, "[CargarTiemposProcesador] La tabla de tiempos se ha cargado con éxito");
! 293: Notificar(mensaje, NO_ERROR, ECO_NO);
! 294: }
! 295:
! 296:
! 297: void CargarArquitecturaIA16()
! 298: {
! 299: FILE *f_ia16_nemos, *f_ia16_ubis;
! 300: char mensaje[MAX_LINE];
! 301:
! 302:
! 303: /* abro el fichero de nemónicos de la arquitectura del repertorio */
! 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);
! 307: Notificar(mensaje, NO_ERROR, ECO_NO);
! 308:
! 309: CargarArquitecturaIA16Nemonicos(f_ia16_nemos);
! 310:
! 311: /* cierro el fichero de nemónicos */
! 312: if(fclose(f_ia16_nemos))
! 313: {
! 314: sprintf(mensaje, "[CargarArquitecturaIA16] El fichero '%s' no se ha podido cerrar", configuracion.ficheronemos);
! 315: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
! 316: }
! 317: }
! 318: else
! 319: {
! 320: sprintf(mensaje, "[CargarArquitecturaIA16] El fichero '%s' no se ha podido abrir", configuracion.ficheronemos);
! 321: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 322: }
! 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);
! 329: Notificar(mensaje, NO_ERROR, ECO_NO);
! 330:
! 331: CargarArquitecturaIA16Simbolos(f_ia16_ubis);
! 332:
! 333: /* cierro el fichero de ubicaciones */
! 334: if(fclose(f_ia16_ubis))
! 335: {
! 336: sprintf(mensaje, "[CargarArquitecturaIA16] El fichero '%s' no se ha podido cerrar", configuracion.ficheroubis);
! 337: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
! 338: }
! 339: }
! 340: else
! 341: {
! 342: sprintf(mensaje, "[CargarArquitecturaIA16] El fichero '%s' no se ha podido abrir", configuracion.ficheroubis);
! 343: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 344: }
! 345: }
! 346:
! 347:
! 348: void CargarProcesador()
! 349: {
! 350: FILE *f_procesador;
! 351: char mensaje[MAX_LINE];
! 352:
! 353:
! 354: /* abro el fichero con la tabla de tiempos del procesador */
! 355: if((f_procesador = fopen(configuracion.ficherociclos, "r")) != NULL)
! 356: {
! 357: sprintf(mensaje, "[CargarProcesador] El fichero '%s' se ha abierto con éxito", configuracion.ficherociclos);
! 358: Notificar(mensaje, NO_ERROR, ECO_NO);
! 359:
! 360: CargarTiemposProcesador(f_procesador);
! 361:
! 362: /* cierro el fichero del procesador */
! 363: if(fclose(f_procesador))
! 364: {
! 365: sprintf(mensaje, "[CargarProcesador] El fichero '%s' no se ha podido cerrar", configuracion.ficherociclos);
! 366: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
! 367: }
! 368: }
! 369: else
! 370: {
! 371: sprintf(mensaje, "[CargarProcesador] El fichero '%s' no se ha podido abrir", configuracion.ficherociclos);
! 372: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 373: }
! 374: }
! 375:
! 376:
! 377: /* carga de las bases de datos */
! 378:
! 379: void CargarBasesDatos()
! 380: {
! 381: CargarArquitecturaIA16();
! 382: if(configuracion.cpi == SI) CargarProcesador();
! 383: }
! 384:
! 385:
! 386: /* libera memoria bases de datos */
! 387:
! 388: void LiberarMemoriaBasesDatos()
! 389: {
! 390: free(nemonicos);
! 391: free(simbolos);
! 392: if(configuracion.cpi == SI) free(ciclos);
! 393: }
! 394:
! 395:
! 396:
! 397: #if 0
! 398:
! 399: /* la función strtok de <string.h> descompone la línea en campos */
! 400: /* OJO: modifica la cadena de caracteres de la línea que se le pasa */
! 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>