Annotation of ADD_ver_10/Recuentos.c, revision 1.2
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: {
1.2 ! rico 38: char mensaje[MAX_LINE];
1.1 rico 39:
40: /* reservo memoria para los contadores de nemónicos */
1.2 ! rico 41: contadornemonicos = calloc(num_nemonicos, sizeof(unsigned long int));
1.1 rico 42: if (contadornemonicos == NULL)
43: {
44: sprintf(mensaje, "[CrearContadores] Memoria insuficiente");
1.2 ! rico 45: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 46: /* el programa finaliza si no hay memoria suficiente */
1.1 rico 47: }
48:
49:
50: /* reservo memoria para los contadores de accesos a operandos */
1.2 ! rico 51: /* lecturas */
1.1 rico 52: contadorlecturas = calloc(num_simbolos, sizeof(unsigned long int));
53: if (contadorlecturas == NULL)
54: {
55: sprintf(mensaje, "[CrearContadores] Memoria insuficiente");
1.2 ! rico 56: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 57: /* el programa finaliza si no hay memoria suficiente */
1.1 rico 58: }
1.2 ! rico 59: /* escrituras */
1.1 rico 60: contadorescrituras = calloc(num_simbolos, sizeof(unsigned long int));
61: if (contadorlecturas == NULL)
62: {
63: sprintf(mensaje, "[CrearContadores] Memoria insuficiente");
1.2 ! rico 64: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 65: /* el programa finaliza si no hay memoria suficiente */
1.1 rico 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;
1.2 ! rico 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);
1.1 rico 83:
1.2 ! rico 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);
1.1 rico 97:
98: if(id_nemo == -1)
99: {
100: /* emito un error al fichero de log */
1.2 ! rico 101: sprintf(mensaje, "[ActualizarRecuentos] La cadena '%s' no se ha encontrado en Tabla Nemónicos", tarjetaoperandos->nemonico);
! 102: Notificar(mensaje, ERROR_SALIR, ECO_NO);
1.1 rico 103: }
104:
1.2 ! rico 105: /* incremento el contador para el nemónico en cuestión */
! 106: contadornemonicos[id_nemo]++;
1.1 rico 107:
108:
1.2 ! rico 109: /* OP2 (FUENTE) si lo hay */
! 110: if(tarjetaoperandos->op2[0]!='\0')
! 111: {
1.1 rico 112: strcpy(cadena, tarjetaoperandos->op2);
113: NormalizarUbicacion(cadena);
114:
1.2 ! rico 115: id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena);
1.1 rico 116:
1.2 ! rico 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: }
1.1 rico 123:
1.2 ! rico 124: /* incremento el contador para el símbolo en cuestión según el tipo de acceso */
1.1 rico 125: switch(nemonicos[id_nemo].modo_op2)
126: {
1.2 ! rico 127: case LEIDOYESCRITO: /* leido y escrito */
! 128: contadorlecturas[id_simb]++;
! 129: case ESCRITO: /* escrito */
! 130: contadorescrituras[id_simb]++;
1.1 rico 131: break;
132:
1.2 ! rico 133: case LEIDO: /* leido */
! 134: contadorlecturas[id_simb]++;
1.1 rico 135: break;
136:
1.2 ! rico 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);
1.1 rico 141: break;
142: }
1.2 ! rico 143: }
1.1 rico 144:
1.2 ! rico 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: {
1.1 rico 149: strcpy(cadena, tarjetaoperandos->op1);
150: NormalizarUbicacion(cadena);
151:
1.2 ! rico 152: id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena);
1.1 rico 153:
1.2 ! rico 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: }
1.1 rico 160:
1.2 ! rico 161: /* incremento el contador para el símbolo en cuestión según el tipo de acceso */
1.1 rico 162: switch(nemonicos[id_nemo].modo_op1)
163: {
1.2 ! rico 164: case LEIDOYESCRITO: /* leido y escrito */
! 165: contadorlecturas[id_simb]++;
! 166: case ESCRITO: /* escrito */
! 167: contadorescrituras[id_simb]++;
1.1 rico 168: break;
169:
1.2 ! rico 170: case LEIDO: /* leido */
! 171: contadorlecturas[id_simb]++;
1.1 rico 172: break;
173:
1.2 ! rico 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);
1.1 rico 178: break;
179: }
1.2 ! rico 180: }
! 181: /* los accesos a memoria se pueden contabilizar también bajo el nombre 'MEM' */
1.1 rico 182: }
183:
184:
185: /* esta función libera la memoria reservada para los contadores */
186:
187: void LiberarMemoriaContadores()
188: {
1.2 ! rico 189: free(contadornemonicos);
! 190: free(contadorlecturas);
! 191: free(contadorescrituras);
! 192: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>