--- ADD_ver_10/Attic/Auxiliares.c 2006/01/19 17:16:29 1.1 +++ ADD_ver_10/Attic/Auxiliares.c 2006/02/15 13:00:30 1.2 @@ -22,6 +22,9 @@ /* */ /* --------------------------- History --------------------------- */ /* */ +/* Revision 1.3. 02/2006 */ +/* Fix overflow error in expresion evaluating 'cantidad' */ +/* */ /* Revision 1.2. 01/2006 */ /* Added GPL License and JavaDoc style documentation */ /* */ @@ -29,8 +32,6 @@ /* Initial Revision */ /* */ /********************************************************************/ - - /******************************************************************************/ /* MÓDULO: Auxiliares.c */ /* */ @@ -74,7 +75,7 @@ int BDBuscarCadena(int idtabla, int idca { unsigned int i = 0; /* los registros de las bases de datos comienzan en el índice 0 */ int encontrado = NO; - char mensaje[MAX_LINE]; + char mensaje[MAX_LINE]; switch (idtabla) { @@ -91,8 +92,8 @@ int BDBuscarCadena(int idtabla, int idca default: /* emitir un error al fichero de log */ - sprintf(mensaje, "[BDBuscarCadena] El campo no existe en la Tabla Nemónicos"); - Notificar(mensaje, ERROR_SALIR, ECO_NO); + sprintf(mensaje, "[BDBuscarCadena] El campo no existe en la Tabla Nemónicos"); + Notificar(mensaje, ERROR_SALIR, ECO_NO); break; } break; @@ -110,8 +111,8 @@ int BDBuscarCadena(int idtabla, int idca default: /* emitir un error al fichero de log */ - sprintf(mensaje, "[BDBuscarCadena] El campo no existe en la Tabla Símbolos"); - Notificar(mensaje, ERROR_SALIR, ECO_NO); + sprintf(mensaje, "[BDBuscarCadena] El campo no existe en la Tabla Símbolos"); + Notificar(mensaje, ERROR_SALIR, ECO_NO); break; } break; @@ -129,8 +130,8 @@ int BDBuscarCadena(int idtabla, int idca default: /* emitir un error al fichero de log */ - sprintf(mensaje, "[BDBuscarCadena] El campo no existe en la Tabla Ciclos"); - Notificar(mensaje, ERROR_SALIR, ECO_NO); + sprintf(mensaje, "[BDBuscarCadena] El campo no existe en la Tabla Ciclos"); + Notificar(mensaje, ERROR_SALIR, ECO_NO); break; } break; @@ -148,17 +149,17 @@ int BDBuscarCadena(int idtabla, int idca default: /* emitir un error al fichero de log */ - sprintf(mensaje, "[BDBuscarCadena] El campo no existe en la Tabla Ubicaciones"); - Notificar(mensaje, ERROR_SALIR, ECO_NO); + sprintf(mensaje, "[BDBuscarCadena] El campo no existe en la Tabla Ubicaciones"); + Notificar(mensaje, ERROR_SALIR, ECO_NO); break; } break; - default: + default: /* emitir un error al fichero de log */ - sprintf(mensaje, "[BDBuscarCadena] La tabla especificada no existe"); - Notificar(mensaje, ERROR_SALIR, ECO_NO); - break; + sprintf(mensaje, "[BDBuscarCadena] La tabla especificada no existe"); + Notificar(mensaje, ERROR_SALIR, ECO_NO); + break; } if(encontrado == NO) return(-1); else return(i); @@ -180,22 +181,22 @@ void AgregarElementoLista(char *lista, c unsigned int BuscarElementoLista(char *lista, char *cadena) { - char copialista[MAX_LISTA]; + char copialista[MAX_LISTA]; char *elemento; /* es un puntero a char para la función strtok */ - unsigned int indice = 1; + unsigned int indice = 1; - strcpy(copialista, lista); + strcpy(copialista, lista); - elemento = strtok(copialista, ":"); /* el separador de elementos de la lista es ':' */ + elemento = strtok(copialista, ":"); /* el separador de elementos de la lista es ':' */ while(elemento != NULL) { if(strcmp(elemento, cadena) == 0) return indice; - else indice++; + else indice++; - /* capturo el siguiente campo */ + /* capturo el siguiente campo */ elemento = strtok(NULL, ":"); } - return 0; + return 0; /* esta función se puede implementar también usando 'strstr' */ } @@ -205,30 +206,30 @@ unsigned int BuscarElementoLista(char *l void EliminarElementoLista(char *lista, char *cadena) { - char *puntero; - unsigned int indice1; - unsigned int indice2 = 1; - - puntero = lista; - indice1 = BuscarElementoLista(lista, cadena); - - if(indice1 == 0) return; - - while(indice2 != indice1) - { - if(*puntero == ':') indice2++; - puntero++; - } - - if(puntero != lista) /* el elemento no es el primero */ - { - *(puntero - 1) = '\0'; /* corto la cadena en el separador antes del elemento */ - if(*(puntero + strlen(cadena)) == ':') /* el elemento no es el último */ - { - strcat(lista, (puntero + strlen(cadena))); - } - } - else strcpy(lista, (puntero + strlen(cadena) + 1)); + char *puntero; + unsigned int indice1; + unsigned int indice2 = 1; + + puntero = lista; + indice1 = BuscarElementoLista(lista, cadena); + + if(indice1 == 0) return; + + while(indice2 != indice1) + { + if(*puntero == ':') indice2++; + puntero++; + } + + if(puntero != lista) /* el elemento no es el primero */ + { + *(puntero - 1) = '\0'; /* corto la cadena en el separador antes del elemento */ + if(*(puntero + strlen(cadena)) == ':') /* el elemento no es el último */ + { + strcat(lista, (puntero + strlen(cadena))); + } + } + else strcpy(lista, (puntero + strlen(cadena) + 1)); } @@ -237,7 +238,7 @@ void EliminarElementoLista(char *lista, void IniciarTarjeta(fichainstruccion *tarjetaoperandos) { - strcpy(tarjetaoperandos->nemonico, ""); + strcpy(tarjetaoperandos->nemonico, ""); strcpy(tarjetaoperandos->op1, ""); strcpy(tarjetaoperandos->op2, ""); strcpy(tarjetaoperandos->hexadecimal, ""); @@ -270,77 +271,83 @@ void IniciarTarjeta(fichainstruccion *ta unsigned long TamanoFichero(char *fichero) { - FILE *handle; - unsigned long tamano = 0; - char mensaje[MAX_LINE]; + FILE *handle; + unsigned long tamano = 0; + char mensaje[MAX_LINE]; - if((handle = fopen(fichero, "rb")) != NULL) + if((handle = fopen(fichero, "rb")) != NULL) { /* - sprintf(mensaje, "[TamañoFichero] El fichero '%s' se ha abierto con éxito", fichero); - Notificar(mensaje, NO_ERROR, ECO_NO); - */ + sprintf(mensaje, "[TamañoFichero] El fichero '%s' se ha abierto con éxito", fichero); + Notificar(mensaje, NO_ERROR, ECO_NO); + */ - fseek(handle, 0L, SEEK_END); - tamano = ftell(handle); + fseek(handle, 0L, SEEK_END); + tamano = ftell(handle); /* cierro el fichero */ if(fclose(handle)) - { - sprintf(mensaje, "[TamañoFichero] El fichero '%s' no se ha podido cerrar", fichero); - Notificar(mensaje, ERROR_SEGUIR, ECO_NO); - } + { + sprintf(mensaje, "[TamañoFichero] El fichero '%s' no se ha podido cerrar", fichero); + Notificar(mensaje, ERROR_SEGUIR, ECO_NO); + } } else - { - sprintf(mensaje, "[TamañoFichero] El fichero '%s' no se ha podido abrir", fichero); - Notificar(mensaje, ERROR_SALIR, ECO_NO); - } + { + sprintf(mensaje, "[TamañoFichero] El fichero '%s' no se ha podido abrir", fichero); + Notificar(mensaje, ERROR_SALIR, ECO_NO); + } - return tamano; + return tamano; } void DeterminarRango() { - unsigned long total_instrucciones; /* total en la traza */ - unsigned long cantidad; /* cantidad a analizar */ - char mensaje[MAX_LINE]; - - /* calculo la cantidad de instrucciones en la traza a partir del tamaño del fichero */ - total_instrucciones = TamanoFichero(configuracion.ficherodatos)/BYTES_POR_INSTRUCCION; - - /* - printf("Total instrucciones en '%s' = %lu\n", configuracion.ficherodatos, total_instrucciones); - _getch(); - */ - - if(configuracion.ultima == 0) /* significa que manda el rango */ - { - cantidad = (unsigned long)(configuracion.rango * total_instrucciones)/100.00; - - if(configuracion.primera == 0) /* significa que manda el porcentaje de comienzo */ - configuracion.primera = (unsigned long) 1 + (configuracion.comienzo * total_instrucciones)/100.00; - /* la cuenta de instrucciones comienza en '1' */ - - else if(configuracion.primera > total_instrucciones) - { - sprintf(mensaje, "[DeterminarRango] La primera instrucción está fuera del fichero de datos"); - Notificar(mensaje, ERROR_SALIR, ECO_NO); - } - configuracion.ultima = configuracion.primera + cantidad; - if(configuracion.ultima > total_instrucciones) configuracion.ultima = total_instrucciones; - } - - cantidad = configuracion.ultima - configuracion.primera + 1; - - if(cantidad < configuracion.ventana) - { - sprintf(mensaje, "[DeterminarRango] El rango de análisis es demasiado pequeño"); - Notificar(mensaje, ERROR_SALIR, ECO_NO); - } + unsigned long total_instrucciones; /* total en la traza */ + unsigned long cantidad; /* cantidad a analizar */ + char mensaje[MAX_LINE]; + + /* calculo la cantidad de instrucciones en la traza a partir del tamaño del fichero */ + total_instrucciones = TamanoFichero(configuracion.ficherodatos)/BYTES_POR_INSTRUCCION; + + /* + printf("Total instrucciones en '%s' = %lu\n", configuracion.ficherodatos, total_instrucciones); + _getch(); + */ + + if(configuracion.ultima == 0) /* significa que manda el rango */ + { + /* cantidad = (unsigned long)(configuracion.rango * total_instrucciones)/100.00; */ + + cantidad = (unsigned long)((configuracion.rango/100.00) * total_instrucciones); + + + if(configuracion.primera == 0) /* significa que manda el porcentaje de comienzo */ + + /* configuracion.primera = (unsigned long) 1 + (configuracion.comienzo * total_instrucciones)/100.00; */ + + configuracion.primera = (unsigned long) 1 + (configuracion.comienzo/100.00) * total_instrucciones; + /* la cuenta de instrucciones comienza en '1' */ + + else if(configuracion.primera > total_instrucciones) + { + sprintf(mensaje, "[DeterminarRango] La primera instrucción está fuera del fichero de datos"); + Notificar(mensaje, ERROR_SALIR, ECO_NO); + } + configuracion.ultima = configuracion.primera + cantidad; + if(configuracion.ultima > total_instrucciones) configuracion.ultima = total_instrucciones; + } + + cantidad = configuracion.ultima - configuracion.primera + 1; + + if(cantidad < configuracion.ventana) + { + sprintf(mensaje, "[DeterminarRango] El rango de análisis es demasiado pequeño"); + Notificar(mensaje, ERROR_SALIR, ECO_NO); + } } @@ -353,11 +360,13 @@ void DeterminarRango() double CalcularNuevoPromedio (double promedioanterior, double valoractual, unsigned long n) { - double nuevopromedio; + double nuevopromedio; + + /* nuevopromedio = ((n - 1) * promedioanterior + valoractual) / n; */ - nuevopromedio = ((n - 1) * promedioanterior + valoractual) / n; + nuevopromedio = promedioanterior + (double)((valoractual - promedioanterior) / n); - return nuevopromedio; + return nuevopromedio; } @@ -365,24 +374,24 @@ double CalcularNuevoPromedio (double pro double InversoNormalizado (unsigned int dimension, double valor) { - double inverso; - char mensaje[MAX_LINE]; + double inverso; + char mensaje[MAX_LINE]; - if(valor == 0.0) - { - sprintf(mensaje, "[InversoNormalizado] El valor del denominador es nulo"); - Notificar(mensaje, ERROR_SALIR, ECO_NO); - } - - if(dimension == 0) - { - sprintf(mensaje, "[InversoNormalizado] La dimensión de la normalización es nula"); - Notificar(mensaje, ERROR_SEGUIR, ECO_NO); - } + if(valor == 0.0) + { + sprintf(mensaje, "[InversoNormalizado] El valor del denominador es nulo"); + Notificar(mensaje, ERROR_SALIR, ECO_NO); + } + + if(dimension == 0) + { + sprintf(mensaje, "[InversoNormalizado] La dimensión de la normalización es nula"); + Notificar(mensaje, ERROR_SEGUIR, ECO_NO); + } - inverso = dimension / valor; + inverso = dimension / valor; - return inverso; + return inverso; } @@ -395,30 +404,30 @@ double InversoNormalizado (unsigned int void CadenaEnsamblador(char *prefijo, char *nemonico, char *operando1, char *operando2, unsigned char notacion, char *cadena) { - char auxiliar[2*MAX_NEMO + 2*MAX_OPE]; - - switch(notacion) - { - case 0: /* notación de INTEL */ - - sprintf(cadena, "%s%s", prefijo, prefijo[0]!='\0' ? " ":""); - - sprintf(auxiliar, "%s", nemonico); - strcat(cadena, auxiliar); - - sprintf(auxiliar, "%s%s", operando1[0]!='\0' ? " ":"", operando1); - strcat(cadena, auxiliar); - - sprintf(auxiliar, "%s%s%s", (operando1[0]!='\0' && operando2[0]!='\0') ? ",":"", operando2[0]!='\0' ? " ":"", operando2); - strcat(cadena, auxiliar); - - /* más elegante usar el índice que devuelve sprintf y sumarlo al puntero cadena */ - /* sprintf(cadena + i, ""... */ - break; - - case 1: /* notación ATT */ - break; - } + char auxiliar[2*MAX_NEMO + 2*MAX_OPE]; + + switch(notacion) + { + case 0: /* notación de INTEL */ + + sprintf(cadena, "%s%s", prefijo, prefijo[0]!='\0' ? " ":""); + + sprintf(auxiliar, "%s", nemonico); + strcat(cadena, auxiliar); + + sprintf(auxiliar, "%s%s", operando1[0]!='\0' ? " ":"", operando1); + strcat(cadena, auxiliar); + + sprintf(auxiliar, "%s%s%s", (operando1[0]!='\0' && operando2[0]!='\0') ? ",":"", operando2[0]!='\0' ? " ":"", operando2); + strcat(cadena, auxiliar); + + /* más elegante usar el índice que devuelve sprintf y sumarlo al puntero cadena */ + /* sprintf(cadena + i, ""... */ + break; + + case 1: /* notación ATT */ + break; + } } @@ -426,42 +435,42 @@ void CadenaEnsamblador(char *prefijo, ch void ConvertirHex2Bin(char *cadenahex, unsigned char *secuencia, unsigned char maxformato) { - int i; - char bytehex[3]; - char mensaje[MAX_LINE]; - - /* control de errores */ - if(strlen(cadenahex)==0) - { - sprintf(mensaje, "[ConvertirHex2Bin] La cadena hexadecimal está vacía"); - Notificar(mensaje, ERROR_SALIR, ECO_NO); - } - else if(strlen(cadenahex)%2!=0) - { - sprintf(mensaje, "[ConvertirHex2Bin] La cadena hexadecimal '%s' no contiene un número entero de bytes", cadenahex); - Notificar(mensaje, ERROR_SALIR, ECO_NO); - } - - /* relleno la secuencia de 2 instrucciones en binario con 0s */ - /* (2 instrucciones de tamaño máximo 'maxformato') */ - for(i=0; i<2*maxformato; i++) *(secuencia+i) = 0; - - do - { - for(i=0; i<2; i++) - { - bytehex[i]=*(cadenahex+i); - if(isxdigit(bytehex[i])==0) /* error -> dígito no hexadecimal */ - { - sprintf(mensaje, "[ConvertirHex2Bin] El byte '%s' contiene un dígito no hexadecimal", cadenahex); - Notificar(mensaje, ERROR_SALIR, ECO_NO); - } - } - bytehex[3]='\0'; - sscanf(bytehex, "%2X", secuencia); - secuencia++; - } - while(*(cadenahex+=2)!='\0'); + int i; + char bytehex[3]; + char mensaje[MAX_LINE]; + + /* control de errores */ + if(strlen(cadenahex)==0) + { + sprintf(mensaje, "[ConvertirHex2Bin] La cadena hexadecimal está vacía"); + Notificar(mensaje, ERROR_SALIR, ECO_NO); + } + else if(strlen(cadenahex)%2!=0) + { + sprintf(mensaje, "[ConvertirHex2Bin] La cadena hexadecimal '%s' no contiene un número entero de bytes", cadenahex); + Notificar(mensaje, ERROR_SALIR, ECO_NO); + } + + /* relleno la secuencia de 2 instrucciones en binario con 0s */ + /* (2 instrucciones de tamaño máximo 'maxformato') */ + for(i=0; i<2*maxformato; i++) *(secuencia+i) = 0; + + do + { + for(i=0; i<2; i++) + { + bytehex[i]=*(cadenahex+i); + if(isxdigit(bytehex[i])==0) /* error -> dígito no hexadecimal */ + { + sprintf(mensaje, "[ConvertirHex2Bin] El byte '%s' contiene un dígito no hexadecimal", cadenahex); + Notificar(mensaje, ERROR_SALIR, ECO_NO); + } + } + bytehex[3]='\0'; + sscanf(bytehex, "%2X", secuencia); + secuencia++; + } + while(*(cadenahex+=2)!='\0'); } /* NOTA: otra posibilidad para esta función consiste en copiar la cadena hexadecimal */