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>