Annotation of ADD_ver_10/Source Code/Source Files/Recuentos.c, revision 1.1
1.1 ! rico 1: /******************************************************************************/
! 2: /* MÓDULO: Recuentos.c */
! 3: /* */
! 4: /* Este módulo se encarga de contabilizar las operaciones y los diferentes */
! 5: /* accesos a operandos. */
! 6: /******************************************************************************/
! 7: /* Fecha: 23 de septiembre de 2005 */
! 8: /******************************************************************************/
! 9:
! 10: #include <stdio.h>
! 11: #include <string.h>
! 12: #include <malloc.h>
! 13:
! 14: #include "defines.h"
! 15: #include "tipos.h"
! 16: #include "recuentos.h"
! 17:
! 18:
! 19: /* bases de datos */
! 20: extern unsigned int num_nemonicos;
! 21: extern operacion *nemonicos;
! 22: extern unsigned int num_simbolos;
! 23: extern operando *simbolos;
! 24: extern unsigned int num_tiempos;
! 25: extern tiempo *ciclos;
! 26:
! 27: /* recuentos */
! 28: extern unsigned long int *contadornemonicos;
! 29: extern unsigned long int *contadorlecturas;
! 30: extern unsigned long int *contadorescrituras;
! 31:
! 32:
! 33: /* esta función hace una reserva de memoria para los contadores */
! 34: /* de recuentos de nemónicos y de accesos a operandos */
! 35:
! 36: void CrearContadores()
! 37: {
! 38: char mensaje[MAX_LINE];
! 39:
! 40: /* reservo memoria para los contadores de nemónicos */
! 41: contadornemonicos = calloc(num_nemonicos, sizeof(unsigned long int));
! 42: if (contadornemonicos == NULL)
! 43: {
! 44: sprintf(mensaje, "[CrearContadores] Memoria insuficiente");
! 45: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 46: /* el programa finaliza si no hay memoria suficiente */
! 47: }
! 48:
! 49:
! 50: /* reservo memoria para los contadores de accesos a operandos */
! 51: /* lecturas */
! 52: contadorlecturas = calloc(num_simbolos, sizeof(unsigned long int));
! 53: if (contadorlecturas == NULL)
! 54: {
! 55: sprintf(mensaje, "[CrearContadores] Memoria insuficiente");
! 56: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 57: /* el programa finaliza si no hay memoria suficiente */
! 58: }
! 59: /* escrituras */
! 60: contadorescrituras = calloc(num_simbolos, sizeof(unsigned long int));
! 61: if (contadorlecturas == NULL)
! 62: {
! 63: sprintf(mensaje, "[CrearContadores] Memoria insuficiente");
! 64: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 65: /* el programa finaliza si no hay memoria suficiente */
! 66: }
! 67: }
! 68:
! 69:
! 70: /* esta función actualiza los recuentos de operaciones y acceso a */
! 71: /* operandos explícitos; la contabilidad de los implícitos se puede */
! 72: /* obtener posteriormente a partir del recuento de nemónicos */
! 73:
! 74: void ActualizarRecuentos(fichainstruccion *tarjetaoperandos)
! 75: {
! 76: int id_nemo, id_simb;
! 77: char mensaje[MAX_LINE], cadena[MAX_LINE];
! 78:
! 79: /* PREFIJO (si lo hay) */
! 80: if(tarjetaoperandos->prefijo[0]!='\0')
! 81: {
! 82: id_nemo = BDBuscarCadena(TABLA_NEMONICOS, CAMPO_NEMONICO, tarjetaoperandos->prefijo);
! 83:
! 84: if(id_nemo == -1)
! 85: {
! 86: /* emito un error al fichero de log */
! 87: sprintf(mensaje, "[ActualizarRecuentos] La cadena '%s' no se ha encontrado en Tabla Nemónicos", tarjetaoperandos->prefijo);
! 88: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 89: }
! 90:
! 91: /* incremento el contador para el nemónico en cuestión */
! 92: contadornemonicos[id_nemo]++;
! 93: }
! 94:
! 95: /* NEMÓNICO */
! 96: id_nemo = BDBuscarCadena(TABLA_NEMONICOS, CAMPO_NEMONICO, tarjetaoperandos->nemonico);
! 97:
! 98: if(id_nemo == -1)
! 99: {
! 100: /* emito un error al fichero de log */
! 101: sprintf(mensaje, "[ActualizarRecuentos] La cadena '%s' no se ha encontrado en Tabla Nemónicos", tarjetaoperandos->nemonico);
! 102: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 103: }
! 104:
! 105: /* incremento el contador para el nemónico en cuestión */
! 106: contadornemonicos[id_nemo]++;
! 107:
! 108:
! 109: /* OP2 (FUENTE) si lo hay */
! 110: if(tarjetaoperandos->op2[0]!='\0')
! 111: {
! 112: strcpy(cadena, tarjetaoperandos->op2);
! 113: NormalizarUbicacion(cadena);
! 114:
! 115: id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena);
! 116:
! 117: if(id_simb == -1)
! 118: {
! 119: /* emito un error al fichero de log */
! 120: sprintf(mensaje, "[ActualizarRecuentos] La cadena '%s' no se ha encontrado en Tabla Símbolos", cadena);
! 121: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 122: }
! 123:
! 124: /* incremento el contador para el símbolo en cuestión según el tipo de acceso */
! 125: switch(nemonicos[id_nemo].modo_op2)
! 126: {
! 127: case LEIDOYESCRITO: /* leido y escrito */
! 128: contadorlecturas[id_simb]++;
! 129: case ESCRITO: /* escrito */
! 130: contadorescrituras[id_simb]++;
! 131: break;
! 132:
! 133: case LEIDO: /* leido */
! 134: contadorlecturas[id_simb]++;
! 135: break;
! 136:
! 137: case NO_EXISTE: /* no existe */
! 138: /* emitir un error al fichero de log */
! 139: sprintf(mensaje, "[ActualizarRecuentos] El operando no existe");
! 140: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 141: break;
! 142: }
! 143: }
! 144:
! 145: /* aquí se puede hacer una función ya que el código es igual al anterior */
! 146: /* OP1 (DESTINO) si lo hay */
! 147: if(tarjetaoperandos->op1[0]!='\0')
! 148: {
! 149: strcpy(cadena, tarjetaoperandos->op1);
! 150: NormalizarUbicacion(cadena);
! 151:
! 152: id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena);
! 153:
! 154: if(id_simb == -1)
! 155: {
! 156: /* emito un error al fichero de log */
! 157: sprintf(mensaje, "[ActualizarRecuentos] La cadena '%s' no se ha encontrado en Tabla Símbolos", cadena);
! 158: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 159: }
! 160:
! 161: /* incremento el contador para el símbolo en cuestión según el tipo de acceso */
! 162: switch(nemonicos[id_nemo].modo_op1)
! 163: {
! 164: case LEIDOYESCRITO: /* leido y escrito */
! 165: contadorlecturas[id_simb]++;
! 166: case ESCRITO: /* escrito */
! 167: contadorescrituras[id_simb]++;
! 168: break;
! 169:
! 170: case LEIDO: /* leido */
! 171: contadorlecturas[id_simb]++;
! 172: break;
! 173:
! 174: case NO_EXISTE: /* no existe */
! 175: /* emitir un error al fichero de log */
! 176: sprintf(mensaje, "[ActualizarRecuentos] El operando no existe");
! 177: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 178: break;
! 179: }
! 180: }
! 181: /* los accesos a memoria se pueden contabilizar también bajo el nombre 'MEM' */
! 182: }
! 183:
! 184:
! 185: /* esta función libera la memoria reservada para los contadores */
! 186:
! 187: void LiberarMemoriaContadores()
! 188: {
! 189: free(contadornemonicos);
! 190: free(contadorlecturas);
! 191: free(contadorescrituras);
! 192: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>