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>