File:  [Repository ATC2] / ADD_ver_10 / Source Code / Source Files / Configuracion.c
Revision 1.2: download - view: text, annotated - select for diffs
Tue Feb 28 14:54:21 2006 UTC (18 years, 8 months ago) by rico
Branches: MAIN
CVS tags: HEAD
*** empty log message ***

/********************************************************************/
/*  Configuracion.c                                                 */
/*                                                                  */
/*                                                                  */
/*  Copyright (c) 1997-2006 Rafael Rico      (rafael.rico@uah.es)   */
/*                                                                  */
/*  Este fichero forma parte de ADD                                 */
/*  (Analizador de Dependencias de Datos)                           */
/*  Version 5.10.                                                   */
/*                                                                  */
/*                                                                  */
/*  ADD es software libre. Puede redistribuirlo y/o modificarlo     */
/*  bajo los términos de la Licencia Pública General de GNU         */
/*  según es publicada por la Free Software Foundation, bien bajo   */
/*  la versión 2 de dicha Licencia o bien (según su elección)       */
/*  bajo cualquier versión posterior.                               */
/*                                                                  */
/*  ADD se distribuye con la esperanza de que sea útil,             */
/*  pero SIN NINGUNA GARANTÍA, incluso sin la garantía MERCANTIL    */
/*  implícita y sin garantizar la CONVENIENCIA PARA UN PROPÓSITO    */
/*  PARTICULAR. Véase la Licencia Pública General de GNU para       */
/*  más detalles.                                                   */
/*                                                                  */
/*  Debería haber recibido una copia de la Licencia Pública General */
/*  junto con ADD. Si no ha sido así, escriba a la Free Software    */
/*  Foundation, Inc., 51 Franklin St, Fifth Floor,                  */
/*  Boston, MA  02110-1301  EEUU.                                   */
/*                                                                  */
/*  -------------------------- Historia --------------------------- */
/*                                                                  */
/*  $Id: Configuracion.c,v 1.2 2006/02/28 14:54:21 rico Exp $                                                            */
/*                                                                  */
/*  Revisión 1.2. 01/2006                                           */
/*  Se añade la licencia GPL y documentación en estilo Javadoc      */
/*                                                                  */
/*  Revisión 1.1. 09/2005                                           */
/*  Versión inicial                                                 */
/*                                                                  */
/********************************************************************/

/******************************************************************************/
/* MÓDULO: Configuracion.c                                                    */
/*                                                                            */
/* Este módulo contiene las funciones relacionadas con la configuración.      */
/******************************************************************************/
/* Fecha: 28 de septiembre de 2005                                            */
/******************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "defines.h"
#include "tipos.h"
#include "ayuda.h"
#include "configuracion.h"

/* configuración */
extern struct argumentos configuracion;



/* función que realiza la validación de los parámetros de configuración */
/* introducidos por cualquiera de los medios previstos */
 
void ValidarConfiguracion()
{
    char mensaje[MAX_LINE];

    /* si necesito fichero de configuración y no lo tengo */
    /* capturo el nombre del fichero de configuración */
    if(strcmp(configuracion.captura, "Por fichero") == 0 && strcmp(configuracion.ficheroconfig, "") == 0)
    {
        printf("Introduzca el nombre del fichero de configuración\n\n->\t");
        scanf("%s", configuracion.ficheroconfig);

        sprintf(mensaje, "[ValidarConfiguracion] Se solicita fichero de configuración");
        Notificar(mensaje, NO_ERROR, ECO_NO);
    }

    /* si no tengo fichero de nemónicos */
    if(strcmp(configuracion.ficheronemos, "") == 0)
    {
        printf("Introduzca el nombre del fichero de operaciones\n\n->\t");
        scanf("%s", configuracion.ficheronemos);

        sprintf(mensaje, "[ValidarConfiguracion] Se solicita fichero de operaciones");
        Notificar(mensaje, NO_ERROR, ECO_NO);
    }

    /* si no tengo fichero de operandos */
    if(strcmp(configuracion.ficheroubis, "") == 0)
    {
        printf("Introduzca el nombre del fichero de operandos\n\n->\t");
        scanf("%s", configuracion.ficheroubis);

        sprintf(mensaje, "[ValidarConfiguracion] Se solicita fichero de operandos");
        Notificar(mensaje, NO_ERROR, ECO_NO);
    }

    /* si necesito el fichero de ciclos del procesador */
    /* y no lo tengo */
    if(configuracion.cpi == SI && strcmp(configuracion.ficherociclos, "") == 0)
    {
        printf("Introduzca el nombre del fichero de procesador\n\n->\t");
        scanf("%s", configuracion.ficherociclos);

        sprintf(mensaje, "[ValidarConfiguracion] Se solicita fichero de procesador");
        Notificar(mensaje, NO_ERROR, ECO_NO);
    }

    /* si no tengo fichero de datos */
    if(configuracion.origen != CADENAHEX && strcmp(configuracion.ficherodatos, "") == 0)
    {
        printf("Introduzca el nombre del fichero de datos\n\n->\t");
        scanf("%s", configuracion.ficherodatos);

        sprintf(mensaje, "[ValidarConfiguracion] Se solicita fichero de datos");
        Notificar(mensaje, NO_ERROR, ECO_NO);
    }

    /* si el origen de datos es una única instrucción */
    /* anulo el análisis de dependencias de datos */
    if(configuracion.origen == CADENAHEX) configuracion.dependencias = NO;

    /* validación del rango */
    if(configuracion.rango > 100.00) configuracion.rango = 100.00;
    else if(configuracion.rango < 1.00) configuracion.rango = 1.00;

    /* validación del comienzo */
    if(configuracion.comienzo > 100.00) configuracion.comienzo = 100.00;
    /* el porcentaje de comienzo puede ser 0 */

    /* si doy instrucción final se supone que tengo una inicial */
    if(configuracion.ultima != 0)
    {
        if(configuracion.primera == 0) configuracion.primera = 1;
        /* la cuenta de instrucciones comienza en '1' */
    }

    /* si el tamaño de ventana de instrucciones es nulo pido un valor */
    if(configuracion.ventana == 0)
    {
        /* capturo el tamaño de la ventana de instrucciones */
        printf("Introduzca el tamaño de la ventana de instrucciones[1 - %d]\n\n->\t", MAX_VENTANA);
        scanf("%d", &configuracion.ventana);
    }

    /* si la ventana es mayor que el máximo permitido pongo el máximo */
    if(configuracion.ventana > MAX_VENTANA) configuracion.ventana = MAX_VENTANA;
    /* si la ventana es de 1 instrucción anulo el análisis de dependencias de datos */
    if(configuracion.ventana == 1) configuracion.dependencias = NO;
    /* si la ventana es mayor de 32 instrucciones no construyo ficheros */
    /* para volcar información de las ventanas ya que no caben */
    if(configuracion.ventana > 32) strcpy(configuracion.volcarventana, "");

    /* si no considero ningún tipo no hago análisis de dependencias */
    if(configuracion.verdaderas == NO && 
        configuracion.antidependencias == NO && 
        configuracion.verdaderas == NO)    configuracion.dependencias = NO;

    if(configuracion.explicitos == NO && 
        configuracion.implicitos == NO) configuracion.dependencias = NO; 

    if(configuracion.datos == NO &&
        configuracion.direcciones == NO &&
        configuracion.pila == NO &&
        configuracion.cc == NO) configuracion.dependencias = NO;

    /* los desacoplos y sus matrices llevan un orden */
    /* mapa de posibles matrices */
    /* tipo        origen    fuente */
    /*   SI          SI     SI     */
    /*   SI          SI     NO     */
    /*   SI          NO     NO     */
    /*   NO          NO     NO     */    /* -> por defecto no se desacopla nada */

    if(configuracion.desacoplarorigen == SI)
    {
        configuracion.desacoplartipos = SI;
    }
    if(configuracion.desacoplarfuentes == SI)
    {
        configuracion.desacoplarorigen = SI;
        configuracion.desacoplartipos = SI;
    }

    /* calcular CPI medio implica asignar CPI a cada instrucción */
    if(configuracion.CPImedio == SI) configuracion.cpi = SI;
    /* calcular tiempo de ejecución implica asignar CPI a cada */
    /* y calcular las dependencias de datos entre instrucción */
    if(configuracion.tiempo == SI) 
    {
        configuracion.cpi = SI;
        configuracion.dependencias = SI;
    }
    /* calculos relativos al análisis de dependencias */
    if(configuracion.ordenparcial == SI) configuracion.dependencias = SI;
    if(configuracion.matrizcaminos == SI) configuracion.dependencias = SI;
    if(configuracion.pasoscomputacion == SI) configuracion.dependencias = SI;
    if(configuracion.gradoparalelismo == SI)
    {
        configuracion.pasoscomputacion = SI;
        configuracion.dependencias = SI;
    }
    if(configuracion.acoplamiento == SI) configuracion.dependencias = SI;
    if(configuracion.distribucionpasos == SI)
    {
        configuracion.pasoscomputacion = SI;
        configuracion.dependencias = SI;
    }
    
    /* si no quiero calcular nada anulo el análisis de dependencias */
    if(configuracion.tiempo == NO &&
        configuracion.ordenparcial == NO &&
        configuracion.matrizcaminos == NO &&
        configuracion.pasoscomputacion == NO &&
        configuracion.gradoparalelismo == NO &&
        configuracion.acoplamiento == NO &&
        configuracion.distribucionpasos == NO) configuracion.dependencias = NO;

    /* si he de crear un fichero de configuración nuevo */
    /* y no tengo nombre solicito uno nuevo */
    if(configuracion.crearficheroconfig == SI && strcmp(configuracion.nuevoficheroconfig, "") == 0)
    {
        printf("Introduzca el nombre del nuevo fichero de configuración\n\n->\t");
        scanf("%s", configuracion.nuevoficheroconfig);

        sprintf(mensaje, "[ValidarConfiguracion] Se solicita nuevo fichero de configuración");
        Notificar(mensaje, NO_ERROR, ECO_NO);
    }
}



/* función que carga la configuración por defecto de la aplicación */

void CargarConfiguracionInicial()
{
    /* OBSERVACIONES (tipo de captura de configuración) */
    strcpy(configuracion.captura, "Por defecto");

    /* FICHERO DE CONFIGURACIÓN POR DEFECTO */
    /* ruta del fichero de configuración (si se usa sin indicar ruta) */
    strcpy(configuracion.ficheroconfig, "configuracion.cfg");    

    /* FICHEROS DE BASE DE DATOS */
    /* ARQUITECTURA: fichero de operaciones */
    strcpy(configuracion.ficheronemos, "IA16-nemos.isa");
    /* ARQUITECTURA: fichero de símbolos */
    strcpy(configuracion.ficheroubis, "IA16-ubis.isa");            
    /* PROCESADOR: fichero de ciclos */
    strcpy(configuracion.ficherociclos, "uP-8086-01.pro");        

    /* ORIGEN DE DATOS */
    /* código de origen de datos */
    /* 0: TRAZA; 1: SECUENCIA; 2: CADENAHEX */
    /* si es CADENAHEX no se hace análisis de dependencias) */
    configuracion.origen = TRAZA;
    /* fichero de origen de datos -si existe- */
    strcpy(configuracion.ficherodatos, "comp.trz");
    /* instrucción en hexadecimal */
    strcpy(configuracion.cadenahex, "");
    /* porcentaje a analizar -sólo TRAZA- */
    configuracion.rango = 100.00;
    /* comienzo en porcentaje -sólo TRAZA- */
    configuracion.comienzo = 0.00;
    /* instrucción de comienzo */
    configuracion.primera = 0;                
    /* instrucción de final */
    configuracion.ultima  = 0;                    
    
    /* EVALUAR */
    /* ¿hacer recuentos? */
    configuracion.recuentos = NO;                        
    /* ¿asignar ciclos a cada instrucción? */
    configuracion.cpi = NO;    
    /* ¿hacer análisis de dependencias de datos? */
    configuracion.dependencias = SI;
    
    /* PARÁMETROS DE ANÁLISIS DE DEPENDENCIAS DE DATOS */
    /* tamaño de la ventana de instrucciones (si es 1 no se hace análisis de dependencias) */
    configuracion.ventana = 32;
    /* tipos de ubicaciones a incluir en la pizarra de dependencias */
    strcpy(configuracion.listaubis, "0:1:2:3");
    /* ¿desacoplar tipos de dependencias? */
    configuracion.desacoplartipos = NO;
    /* ¿considerar dependencias verdaderas? */
    configuracion.verdaderas = SI;                    
    /* ¿considerar antidependencias? */
    configuracion.antidependencias = SI;                
    /* ¿considerar dependencias de salida? */
    configuracion.salida = SI;
    /* ¿desacoplar implìcitas-explícitas? */
    configuracion.desacoplarorigen = NO;                
    /* ¿considerar explícitas? */
    configuracion.explicitos = SI;                    
    /* ¿considerar implícitas? */
    configuracion.implicitos = SI; 
    /* ¿desacoplar fuentes de dependencias? */
    configuracion.desacoplarfuentes = NO;                
    /* ¿origen de dependencias de datos? */
    configuracion.datos = SI;                            
    /* ¿origen de dependencias de direcciones? */
    configuracion.direcciones = SI;                    
    /* ¿origen de dependencias de pila? */
    configuracion.pila = SI;                            
    /* ¿origen de dependencias de códigos de condición? */
    configuracion.cc = SI;
    
    /* CALCULAR */
    /* ¿calcular CPI medio? (requiere asignación de CPI) */
    configuracion.CPImedio = NO;                        
    /* ¿calcular tiempo de ejecución? (requiere asignación de CPI) */
    configuracion.tiempo = NO;                        
    /* ¿obtener orden parcial? (requiere evaluación de dependencias) */
    configuracion.ordenparcial = NO;
    /* ¿calcular la matriz de caminos? (requiere evaluación de dependencias) */
    /*(tarea gran consumidora de tiempo) */
    configuracion.matrizcaminos = NO;
    /* ¿determinar pasos de computación? (requiere evaluación de dependencias) */
    configuracion.pasoscomputacion = SI;                
    /* ¿determinar grado de paralelismo? (requiere evaluación de dependencias y pasos de computación) */
    configuracion.gradoparalelismo = NO;                
    /* ¿determinar acoplamiento? (requiere evaluación de dependencias) */
    configuracion.acoplamiento = NO;
    /* ¿salvar el histograma de pasos de computación para la matriz D? */
    configuracion.distribucionpasos = NO;

    /* CONFIGURACIÓN DEL INFORME */
    /* salvar bases de datos en ficheros EXCEL */
    configuracion.volcarBD = NO;
    /* volcar configuracion en un fichero nuevo */
    configuracion.crearficheroconfig = NO;
    /* nombre del nuevo fichero de configuración */
    strcpy(configuracion.nuevoficheroconfig, "nuevoconfig");            
    /* salvar listado de ventanas en formato EXCEL */
    strcpy(configuracion.volcarventana, "");
    /* fichero de resultados en formato EXCEL */
    strcpy(configuracion.ficheroresultados, "resultados");
    /* nivel de gravedad de los mensajes volcados en el log */
    configuracion.nivelnotificaciones = ALL;
    /* (el nivel inicial es el de mayor notificación) */

    /* INTERFASE GRÁFICA */
    /* ver instrucción en pantalla */
    configuracion.verinstruccion = NO;
    /* ver ventana en pantalla */
    configuracion.verventana = NO;

    ValidarConfiguracion();
}


/* función que carga la configuración desde un fichero */
/* el fichero de configuración no tiene que tener todas las claves */

void CargarConfiguracionFichero()
{
    FILE *handle;
    char fichero[MAX_LINE];
    char linea[MAX_LINE];
    char mensaje[MAX_LINE];
    char *campo;
    int i;
    char encontrado;
    char *inicio, *final;

    /* nombre del fichero de configuración */
    strcpy(fichero, configuracion.ficheroconfig);

    /* abro el fichero de configuración*/
    if((handle  = fopen(fichero, "r")) != NULL)
    {
        sprintf(mensaje, "[CargarConfiguracionFichero] El fichero '%s' se ha abierto con éxito", fichero);
        Notificar(mensaje, NO_ERROR, ECO_NO);

        while(!feof(handle))
        {
            fgets (linea, MAX_LINE, handle);
            /* quito el caracter '\n' (0x0a) final de la línea */
            /* OJO: si abro en modo binario me encuentro "\r\n" (0x0d 0x0a) */
            *(linea+strlen(linea)-1)='\0';
            /* si no es ni comentario ni línea en blanco */
            if(linea[0]!='[' && linea[0]!='\0')
            {
                campo = strtok(linea, "=");
                /* limpio de espacios en blanco por delante y por detrás */
                inicio = campo; while(*inicio++==' '); campo = inicio - 1;
                final = campo + strlen(campo); while(*--final==' '); *(final+1)='\0';

                i = 0;
                encontrado = NO;
                while(i<NUM_CLAVES && encontrado == NO)
                {
                    /* solución si 'campo' tiene espacios en blanco */
                    /* if (strncmp(campo, claves[i], strlen(claves[i]))) i++; */ 
                    /* solución si 'campo' no tiene espacios en blanco */
                    if (strcmp(campo, claves[i])) i++;    /* no encontrado */
                    else encontrado = SI;   /* encontrado */
                }
                if(encontrado == NO)
                {
                    sprintf(mensaje, "No se ha encontrado la clave del fichero de configuración");
                    Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
                }
                else
                {
                    campo = strtok(NULL, "=");
                    /* limpio de espacios en blanco por delante y por detrás */
                    inicio = campo; while(*inicio++==' '); campo = inicio - 1;
                    final = campo + strlen(campo); while(*--final==' '); *(final+1)='\0';
                    /* limpio las comillas simples si están */
                    inicio = strchr(campo, '\'');
                    if(inicio!=NULL) {campo = inicio + 1; final = strrchr(campo, '\''); if(final!=NULL) *final = '\0';}

                    switch(i)
                    {
                        case 0:        /* CAPTURA DE CONFIGURACIÓN */
                        strcpy(configuracion.captura, campo);
                        break;

                        case 1:        /* FICHERO DE CONFIGURACIÓN */
                        strcpy(configuracion.ficheroconfig, campo);
                        break;

                        case 2:        /* FICHERO DE OPERACIONES */
                        strcpy(configuracion.ficheronemos, campo);
                        break;

                        case 3:        /* FICHERO DE SÍMBOLOS */
                        strcpy(configuracion.ficheroubis, campo);
                        break;

                        case 4:        /* FICHERO DE CICLOS */
                        strcpy(configuracion.ficherociclos, campo);
                        break;

                        case 5:        /* ORIGEN DE DATOS */
                        /* if(strcmp(campo, "TRAZA")==0) */
                        /* opción por defecto */
                        configuracion.origen = TRAZA;
                        if(strcmp(campo, "SECUENCIA")==0) configuracion.origen = SECUENCIA;
                        else if(strcmp(campo, "CADENAHEX")==0) configuracion.origen = CADENAHEX;
                        break;

                        case 6:        /* FICHERO DE DATOS */
                        strcpy(configuracion.ficherodatos, campo);
                        break;

                        case 7:        /* SECUENCIA DE INSTRUCCIÓN */
                        strcpy(configuracion.cadenahex, campo);
                        break;

                        case 8:        /* RANGO */
                        /* quito el signo '%' si está */
                        *(campo+strlen(campo)-1)='\0';
                        configuracion.rango = atof(campo);
                        break;

                        case 9:        /* COMIENZO */
                        /* quito el signo '%' si está */
                        *(campo+strlen(campo)-1)='\0';
                        configuracion.comienzo = atof(campo);
                        break;

                        case 10:    /* PRIMERA */
                        configuracion.primera = atoi(campo);
                        break;

                        case 11:    /* ULTIMA */
                        configuracion.ultima = atoi(campo);
                        break;

                        case 12:    /* RECUENTOS */
                        configuracion.recuentos = SI;
                        if(strcmp(campo, "NO")==0) configuracion.recuentos = NO;
                        break;

                        case 13:    /* ASIGNAR CPI */
                        configuracion.cpi = SI;
                        if(strcmp(campo, "NO")==0) configuracion.cpi = NO;
                        break;

                        case 14:    /* ANALIZAR DEPENDENCIAS */
                        configuracion.dependencias = SI;
                        if(strcmp(campo, "NO")==0) configuracion.dependencias = NO;
                        break;

                        case 15:    /* TAMAÑO VENTANA INSTRUCCIONES */
                        configuracion.ventana = atoi(campo);
                        break;

                        case 16:    /* LISTADO DE UBICACIONES */
                        strcpy(configuracion.listaubis, campo);
                        break;

                        case 17:    /* DESACOPLAR TIPOS DE DEPENDENCIAS */
                        configuracion.desacoplartipos = SI;
                        if(strcmp(campo, "NO")==0) configuracion.desacoplartipos = NO;
                        break;

                        case 18:    /* DEPENDENCIAS VERDADERAS */
                        configuracion.verdaderas = SI;
                        if(strcmp(campo, "NO")==0) configuracion.verdaderas = NO;
                        break;

                        case 19:    /* ANTIDEPENDENCIAS */
                        configuracion.antidependencias = SI;
                        if(strcmp(campo, "NO")==0) configuracion.antidependencias = NO;
                        break;

                        case 20:    /* DEPENDENCIAS DE SALIDA */
                        configuracion.salida = SI;
                        if(strcmp(campo, "NO")==0) configuracion.salida = NO;
                        break;

                        case 21:    /* DESACOPLAR ORIGEN */
                        configuracion.desacoplarorigen = SI;
                        if(strcmp(campo, "NO")==0) configuracion.desacoplarorigen = NO;
                        break;
                        
                        case 22:    /* OPERANDOS EXPLÍCITOS */
                        configuracion.explicitos = SI;
                        if(strcmp(campo, "NO")==0) configuracion.explicitos = NO;
                        break;
                        
                        case 23:    /* OPERANDOS IMPLÍCITOS */
                        configuracion.implicitos = SI;
                        if(strcmp(campo, "NO")==0) configuracion.implicitos = NO;
                        break;

                        case 24:    /* DESACOPLAR FUENTES DE DEPENDENCIAS */
                        configuracion.desacoplarfuentes = SI;
                        if(strcmp(campo, "NO")==0) configuracion.desacoplarfuentes = NO;
                        break;

                        case 25:    /* DEPENDENCIAS DE DATOS */
                        configuracion.datos = SI;
                        if(strcmp(campo, "NO")==0) configuracion.datos = NO;
                        break;

                        case 26:    /* DEPENDENCIAS DE DIRECCIONES */
                        configuracion.direcciones = SI;
                        if(strcmp(campo, "NO")==0) configuracion.direcciones = NO;
                        break;

                        case 27:    /* DEPENDENCIAS DE PILA */
                        configuracion.pila = SI;
                        if(strcmp(campo, "NO")==0) configuracion.pila = NO;
                        break;

                        case 28:    /* DEPENDENCIAS DE CÓDIGOS DE CONDICIÓN */
                        configuracion.cc = SI;
                        if(strcmp(campo, "NO")==0) configuracion.cc = NO;
                        break;

                        case 29:    /* CALCULAR CPI PROMEDIO */
                        configuracion.CPImedio = SI;
                        if(strcmp(campo, "NO")==0) configuracion.CPImedio = NO;
                        break;

                        case 30:    /* TIEMPO DE EJECUCIÓN */
                        configuracion.tiempo = SI;
                        if(strcmp(campo, "NO")==0) configuracion.tiempo = NO;
                        break;

                        case 31:    /* GENERAR LISTADO ORDEN PARCIAL */
                        configuracion.ordenparcial = SI;
                        if(strcmp(campo, "NO")==0) configuracion.ordenparcial = NO;
                        break;

                        case 32:    /* GENERAR MATRIZ DE CAMINOS */
                        configuracion.matrizcaminos = SI;
                        if(strcmp(campo, "NO")==0) configuracion.matrizcaminos = NO;
                        break;

                        case 33:    /* PASOS DE COMPUTACIÓN */
                        configuracion.pasoscomputacion = SI;
                        if(strcmp(campo, "NO")==0) configuracion.pasoscomputacion = NO;
                        break;

                        case 34:    /* GRADO DE PARALELISMO */
                        configuracion.gradoparalelismo = SI;
                        if(strcmp(campo, "NO")==0) configuracion.gradoparalelismo = NO;
                        break;

                        case 35:    /* ACOPLAMIENTO */
                        configuracion.acoplamiento = SI;
                        if(strcmp(campo, "NO")==0) configuracion.acoplamiento = NO;
                        break;

                        case 36:    /* HISTOGRAMA PASOS DE COMPUTACIÓN */
                        configuracion.distribucionpasos = SI;
                        if(strcmp(campo, "NO")==0) configuracion.distribucionpasos = NO;
                        break;

                        case 37:    /* VOLCAR BD EN FICHEROS */
                        configuracion.volcarBD = SI;
                        if(strcmp(campo, "NO")==0) configuracion.volcarBD = NO;
                        break;

                        case 38:    /* CREAR FICHERO DE CONFIGURACIÓN */
                        configuracion.crearficheroconfig = SI;
                        if(strcmp(campo, "NO")==0) configuracion.crearficheroconfig = NO;
                        break;

                        case 39:    /* NOMBRE DEL NUEVO FICHERO DE CONFIGURACIÓN */
                        strcpy(configuracion.nuevoficheroconfig, campo);
                        break;

                        case 40:    /* LISTADO DE VENTANAS A SALVAR */
                        strcpy(configuracion.volcarventana, campo);
                        break;

                        case 41:    /* FICHERO DE RESULTADOS */
                        strcpy(configuracion.ficheroresultados, campo);
                        break;

                        case 42:    /* NIVEL DE NOTIFICACIÓN EN EL LOG */
                        /* opción por defecto */
                        configuracion.nivelnotificaciones = ALL;
                        if(strcmp(campo, "EX_CFG")==0) configuracion.nivelnotificaciones = EX_CFG;
                        else if(strcmp(campo, "ERRORS")==0) configuracion.nivelnotificaciones = ERRORS;
                        break;

                        case 43:    /* VER INSTRUCCIÓN EN CURSO EN LA PANTALLA */
                        configuracion.verinstruccion = SI;
                        if(strcmp(campo, "NO")==0) configuracion.verinstruccion = NO;
                        break;

                        case 44:    /* VER VENTANA EN CURSO EN LA PANTALLA */
                        configuracion.verventana = SI;
                        if(strcmp(campo, "NO")==0) configuracion.verventana = NO;
                        break;
                    }
                }
            }
        }

        /* hago validación de datos de entrada */
        ValidarConfiguracion();

        
        if(fclose(handle))
        {
            sprintf(mensaje, "[CargarConfiguracionFichero] El fichero '%s' no se ha podido cerrar", fichero);
            Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
        }
        else
        {
            sprintf(mensaje, "[CargarConfiguracionFichero] El fichero '%s' ha sido cerrado con éxito", fichero);
            Notificar(mensaje, NO_ERROR, ECO_NO);
        }
    }
    else
    {
        sprintf(mensaje, "[CargarConfiguracionFichero] El fichero '%s' no se ha podido abrir", fichero);
        Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
    }
}


/* función que carga la configuración desde los argumentos del 'main' */

/* también realiza una pequeña validación de las entradas */
/* si se requiere asignación de CPI lo fuerza */
/* si se anula el análisis de dependencias de datos lo fuerza */
/* si se requiere un cálculo previo lo fuerza */

void CapturarArgumentos(int argc, char *argv[])
{
    char mensaje[MAX_LINE];
    char cadena[10];
    char arg_leido = NO;

    /*
    int i;

    printf("%d\n", argc);
    for(i=0; i<argc; i++)
    {
        printf("%s\n", argv[i]);
    }

    _getch();
    */

    while(--argc > 0 && (*++argv)[0]=='-')
    {
        switch((*argv)[1])
        {
            case 'h':        /* mostrar texto de ayuda */
            printf("%s", *textoayuda);
            exit(1);
            break;

            case 'f':        /* cargar la configuración desde fichero */
            /* si queda al menos un argumento y es una ruta y no otra opción */
            if(--argc!=0 && (*++argv)[0]!='-') strcpy(configuracion.ficheroconfig, argv[0]);
            /* cargo la configuración desde fichero (el indicado por defecto o el nuevo) */
            /* haciendo caso omiso del resto de argumentos (capturados o por capturar) */
            strcpy(configuracion.captura, "Por fichero"); 
            /* el fichero de configuración no lleva la clave del tipo de captura ni el */
            /* nombre del fichero de configuración */
            CargarConfiguracionFichero();
            argc = 0;        /* dejo de leer el resto de argumentos */
            break;

            case 'n':        /* fichero de arquitectura del repertorio (nemónicos) */
            /* si queda al menos un argumento y es una ruta y no otra opción */
            if(--argc!=0 && (*++argv)[0]!='-')    
            {                
                strcpy(configuracion.ficheronemos, argv[0]);
                arg_leido = SI;
            }
            else
            {
                sprintf(mensaje, "[CapturarArgumentos] La opción -n no especifica ruta y no se tendrá en cuenta");
                Notificar(mensaje, NO_ERROR, ECO_NO);
                ++argc;    *--argv;    /* recupero la situación */
            }
            break;

            case 'u':        /* fichero de arquitectura del repertorio (ubicaciones) */
            /* si queda al menos un argumento y es una ruta y no otra opción */
            if(--argc!=0 && (*++argv)[0]!='-')    
            {                
                strcpy(configuracion.ficheroubis, argv[0]);
                arg_leido = SI;
            }
            else
            {
                sprintf(mensaje, "[CapturarArgumentos] La opción -u no especifica ruta y no se tendrá en cuenta");
                Notificar(mensaje, NO_ERROR, ECO_NO);
                ++argc;    *--argv;    /* recupero la situación */
            }
            break;

            case 'O':        /* origen de datos */
            /* el siguiente caracter indica situaciones excluyentes */
            switch((*argv)[2])
            {
                case 't':
                /* si queda al menos un argumento y es una ruta y no otra opción */
                if(--argc!=0 && (*++argv)[0]!='-')    
                {                
                    configuracion.origen = TRAZA;
                    strcpy(configuracion.ficherodatos, argv[0]);
                    arg_leido = SI;
                }
                else
                {
                    sprintf(mensaje, "[CapturarArgumentos] La opción -Ot no especifica ruta y no se tendrá en cuenta");
                    Notificar(mensaje, NO_ERROR, ECO_NO);
                    ++argc;    *--argv;    /* recupero la situación */
                }
                break;

                case 's':
                /* si queda al menos un argumento y es una ruta y no otra opción */
                if(--argc!=0 && (*++argv)[0]!='-')    
                {                
                    configuracion.origen = SECUENCIA;
                    strcpy(configuracion.ficherodatos, argv[0]);
                    arg_leido = SI;
                }
                else
                {
                    sprintf(mensaje, "[CapturarArgumentos] La opción -Os no especifica ruta y no se tendrá en cuenta");
                    Notificar(mensaje, NO_ERROR, ECO_NO);
                    ++argc;    *--argv;    /* recupero la situación */
                }
                break;

                case 'i':
                /* si queda al menos un argumento y es una ruta y no otra opción */
                if(--argc!=0 && (*++argv)[0]!='-')    
                {                
                    configuracion.origen = CADENAHEX;
                    strcpy(configuracion.cadenahex, argv[0]);
                    arg_leido = SI;
                }
                else
                {
                    sprintf(mensaje, "[CapturarArgumentos] La opción -Oi no especifica instrucción y no se tendrá en cuenta");
                    Notificar(mensaje, NO_ERROR, ECO_NO);
                    ++argc;    *--argv;    /* recupero la situación */
                }
                break;

                default:
                sprintf(mensaje, "[CapturarArgumentos] La opción -O%c no se reconoce", (*argv)[2]);
                Notificar(mensaje, NO_ERROR, ECO_NO);
                break;
            }
            break;

            case 'p':        /* porcentaje de datos a analizar (sólo para trazas) */
            /* estos argumentos se cargan en los parámetros de configuración */
            /* pero si se procesa una traza no se tienen en cuenta */
            switch((*argv)[2])
            {
                case 'r':    /* rango total en porcentaje */
                /* si queda al menos un argumento y es una ruta y no otra opción */
                if(--argc!=0 && (*++argv)[0]!='-')    
                {                
                    strcpy(cadena, argv[0]);
                    cadena[strlen(cadena)-1]='\0';        /* quito el caracter '%' */
                    configuracion.rango = atof(argv[0]);
                    arg_leido = SI;
                }
                else
                {
                    sprintf(mensaje, "[CapturarArgumentos] La opción -pr no especifica valor y no se tendrá en cuenta");
                    Notificar(mensaje, NO_ERROR, ECO_NO);
                    ++argc;    *--argv;    /* recupero la situación */
                }
                break;

                case 'c':    /* comienzo en porcentaje */
                /* si queda al menos un argumento y es una ruta y no otra opción */
                if(--argc!=0 && (*++argv)[0]!='-')    
                {                
                    strcpy(cadena, argv[0]);
                    cadena[strlen(cadena)-1]='\0';        /* quito el caracter '%' */
                    configuracion.comienzo = atof(argv[0]);
                    arg_leido = SI;
                }
                else
                {
                    sprintf(mensaje, "[CapturarArgumentos] La opción -pc no especifica valor y no se tendrá en cuenta");
                    Notificar(mensaje, NO_ERROR, ECO_NO);
                    ++argc;    *--argv;    /* recupero la situación */
                }
                break;

                default:
                sprintf(mensaje, "[CapturarArgumentos] La opción -p%c no se reconoce", (*argv)[2]);
                Notificar(mensaje, NO_ERROR, ECO_NO);
                break;
            }
            break;

            case 'i':        /* primera y última instrucción del análisis (sólo para trazas) */
            /* estos argumentos se cargan en los parámetros de configuración */
            /* pero si se procesa una traza no se tienen en cuenta */
            switch((*argv)[2])
            {
                case 'p':
                /* si queda al menos un argumento y es una ruta y no otra opción */
                if(--argc!=0 && (*++argv)[0]!='-')    
                {                
                    configuracion.primera = atoi(argv[0]);
                    arg_leido = SI;
                }
                else
                {
                    sprintf(mensaje, "[CapturarArgumentos] La opción -ip no especifica valor y no se tendrá en cuenta");
                    Notificar(mensaje, NO_ERROR, ECO_NO);
                    ++argc;    *--argv;    /* recupero la situación */
                }
                break;
            
                case 'u':
                /* si queda al menos un argumento y es una ruta y no otra opción */
                if(--argc!=0 && (*++argv)[0]!='-')    
                {                
                    configuracion.ultima = atoi(argv[0]);
                    arg_leido = SI;
                }
                else
                {
                    sprintf(mensaje, "[CapturarArgumentos] La opción -iu no especifica valor y no se tendrá en cuenta");
                    Notificar(mensaje, NO_ERROR, ECO_NO);
                    ++argc;    *--argv;    /* recupero la situación */
                }
                break;

                default:
                sprintf(mensaje, "[CapturarArgumentos] La opción -i%c no se reconoce", (*argv)[2]);
                Notificar(mensaje, NO_ERROR, ECO_NO);
                break;
            }
            break;

            case 'r':        /* hacer recuentos */
            configuracion.recuentos = SI;
            arg_leido = SI;
            break;

            case 'c':        /* asignar CPI a cada instrucción */
            configuracion.cpi = SI;
            arg_leido = SI;
            /* si queda al menos un argumento y es una ruta y no otra opción */
            if(--argc!=0 && (*++argv)[0]!='-') strcpy(configuracion.ficherociclos , argv[0]);
            else {++argc;    *--argv;}    /* recupero la situación */
            break;

            case 'D':        /* analizar dependencias de datos */
            configuracion.dependencias = NO;
            arg_leido = SI;
            break;

            case 'v':        /* tamaño de la ventana de instrucciones */
            /* si queda al menos un argumento y es una ruta y no otra opción */
            if(--argc!=0 && (*++argv)[0]!='-')    
            {                
                configuracion.ventana = atoi(argv[0]);
                arg_leido = SI;
            }
            else
            {
                sprintf(mensaje, "[CapturarArgumentos] La opción -v no especifica tamaño y no se tendrá en cuenta");
                Notificar(mensaje, NO_ERROR, ECO_NO);
                ++argc;    *--argv;    /* recupero la situación */
            }
            break;

            case 'L':    /* listado de ubicaciones de la pizarra de análisis de dependencias */
            /* si queda al menos un argumento y es una lista y no otra opción */
            if(--argc!=0 && (*++argv)[0]!='-')    
            {                
                strcpy(configuracion.listaubis, argv[0]);
                arg_leido = SI;
            }
            else
            {
                sprintf(mensaje, "[CapturarArgumentos] La opción -L no especifica lista y no se tendrá en cuenta");
                Notificar(mensaje, NO_ERROR, ECO_NO);
                ++argc;    *--argv;    /* recupero la situación */
            }
            break;

            case 'k':        /* desacoplar tipos de dependencias */
            configuracion.desacoplartipos = SI;
            arg_leido = SI;
            break;

            case 'd':        /* no considerar tipos de dependencias */
            switch((*argv)[2])
            {
                case 'v':    /* evitar las dependencias verdaderas */
                configuracion.verdaderas = NO;
                arg_leido = SI;
                break;

                case 'a':    /* evitar las antidependencias */
                configuracion.antidependencias = NO;
                arg_leido = SI;
                break;

                case 's':    /* evitar las dependencias de salida */
                configuracion.salida = NO;
                arg_leido = SI;
                break;

                default:
                sprintf(mensaje, "[CapturarArgumentos] La opción -d%c no se reconoce", (*argv)[2]);
                Notificar(mensaje, NO_ERROR, ECO_NO);
                break;
            }
            break;

            case 'o':        /* desacoplar origen de dependencias */
            configuracion.desacoplarorigen = SI;
            arg_leido = SI;
            break;

            case 't':        /* no considerar origen de dependencias */
            switch((*argv)[2])
            {
                case 'e':    /* evitar los operandos explícitos */
                configuracion.explicitos = NO;
                arg_leido = SI;
                break;

                case 'i':    /* evitar los operandos implicitos */
                configuracion.implicitos = NO;
                arg_leido = SI;
                break;

                default:
                sprintf(mensaje, "[CapturarArgumentos] La opción -t%c no se reconoce", (*argv)[2]);
                Notificar(mensaje, NO_ERROR, ECO_NO);
                break;
            }
            break;

            case 's':        /* desacoplar fuentes de dependencias */
            configuracion.desacoplarfuentes = SI;
            arg_leido = SI;
            break;

            case 'q':        /* no considerar fuentes de dependencias */
            switch((*argv)[2])
            {
                case 'd':    /* evitar las dependencias debidas a datos */
                configuracion.datos = NO;
                arg_leido = SI;
                break;

                case 'a':    /* evitar las dependencias debidas a cómputo de direcciones */
                configuracion.direcciones = NO;
                arg_leido = SI;
                break;

                case 's':    /* evitar las dependencias debidas a tráfico con la pila */
                configuracion.pila = NO;
                arg_leido = SI;
                break;
                
                case 'c':    /* evitar las dependencias debidas a códigos de condición */
                configuracion.cc = NO;
                arg_leido = SI;
                break;

                default:
                sprintf(mensaje, "[CapturarArgumentos] La opción -q%c no se reconoce", (*argv)[2]);
                Notificar(mensaje, NO_ERROR, ECO_NO);
                break;
            }
            break;

            case 'C':        /* cálculos a realizar */
            /* detrás de la 'C' podemos colocar seguidos todos los argumentos del grupo */
            *++(*argv);        /* avanzo hasta el primer caracter después de la 'C' */
            while((char)*++(*argv))        /* barro todos los caracteres hasta el final de la cadena */
            {
                switch((char)*(*argv))
                {
                    case 'm':    /* calcular el CPI promedio */
                    configuracion.CPImedio = SI;
                    arg_leido = SI;
                    break;

                    case 't':    /* calcular tiempo de ejecución */
                    configuracion.tiempo = SI;
                    arg_leido = SI;
                    break;

                    case 'o':    /* obtener lista de orden parcial */
                    configuracion.ordenparcial = SI;
                    arg_leido = SI;
                    break;
                
                    case 'c':    /* generar matriz de caminos */
                    configuracion.matrizcaminos = SI;
                    arg_leido = SI;
                    break;

                    case 'p':    /* calcular pasos de computación */
                    configuracion.pasoscomputacion = NO;
                    arg_leido = SI;
                    break;

                    case 'g':    /* calcular grado de paralelismo */
                    configuracion.gradoparalelismo = SI;
                    arg_leido = SI;
                    break;

                    case 'a':    /* calcular acoplamiento */
                    configuracion.acoplamiento = SI;
                    arg_leido = SI;
                    break;

                    case 'h':    /* construir histograma */
                    configuracion.distribucionpasos = SI;
                    arg_leido = SI;
                    break;

                    default:
                    sprintf(mensaje, "[CapturarArgumentos] La opción -C%c no se reconoce", (char)*(*argv));
                    Notificar(mensaje, NO_ERROR, ECO_NO);
                    break;
                }
            }
            break;

            case 'V':        /* informes: volcar datos en ficheros */
            switch((*argv)[2])
            {
                case 'd':    /* volcar bases de datos */
                configuracion.volcarBD = NO;
                arg_leido = SI;
                break;

                case 'c':    /* crear nuevo fichero de configuración */
                configuracion.crearficheroconfig = SI;
                arg_leido = SI;
                /* si queda al menos un argumento y es una ruta y no otra opción */
                if(--argc!=0 && (*++argv)[0]!='-') strcpy(configuracion.nuevoficheroconfig, argv[0]);
                else {++argc;    *--argv;}    /* recupero la situación */
                break;

                case 'v':    /* listado de ventanas a salvar */
                /* si queda al menos un argumento y es una lista y no otra opción */
                if(--argc!=0 && (*++argv)[0]!='-')    
                {                
                    strcpy(configuracion.volcarventana, argv[0]);
                    arg_leido = SI;
                }
                else
                {
                    sprintf(mensaje, "[CapturarArgumentos] La opción -Vv no especifica lista y no se tendrá en cuenta");
                    Notificar(mensaje, NO_ERROR, ECO_NO);
                    ++argc;    *--argv;    /* recupero la situación */
                }
                break;
                
                default:
                sprintf(mensaje, "[CapturarArgumentos] La opción -V%c no se reconoce", (*argv)[2]);
                Notificar(mensaje, NO_ERROR, ECO_NO);
                break;
            }
            break;

            case 'R':        /* fichero de resultados */
            /* si queda al menos un argumento y es una ruta y no otra opción */
            if(--argc!=0 && (*++argv)[0]!='-')    
            {                
                strcpy(configuracion.ficheroresultados, argv[0]);
                arg_leido = SI;
            }
            else
            {
                sprintf(mensaje, "[CapturarArgumentos] La opción -R no especifica ruta y no se tendrá en cuenta");
                Notificar(mensaje, NO_ERROR, ECO_NO);
                ++argc;    *--argv;    /* recupero la situación */
            }
            break;

            case 'N':        /* nivel de notificaciones en el fichero de log */
            /* si queda al menos un argumento y es una ruta y no otra opción */
            if(--argc!=0 && (*++argv)[0]!='-')    
            {                
                configuracion.nivelnotificaciones = atoi(argv[0]);
                arg_leido = SI;
            }
            else
            {
                sprintf(mensaje, "[CapturarArgumentos] La opción -N no especifica nivel y no se tendrá en cuenta");
                Notificar(mensaje, NO_ERROR, ECO_NO);
                ++argc;    *--argv;    /* recupero la situación */
            }
            break;

            case 'M':        /* mostrar en pantalla */
            /* detrás de la 'M' podemos colocar seguidos todos los argumentos del grupo */
            *++(*argv);        /* avanzo hasta el primer caracter después de la 'M' */
            while((char)*++(*argv))        /* barro todos los caracteres hasta el final de la cadena */
            {
                switch((char)*(*argv))
                {
                    case 'i':    /* mostrar instrucción en curso en la pantalla */
                    configuracion.verinstruccion = SI;
                    arg_leido = SI;
                    break;

#if 0                /* no se ha incluido el parámetro aún */
                    case 'e':    /* mostrar estado */
                    configuracion.XXXXXX = SI;
                    arg_leido = SI;
                    break;
#endif

                    case 'v':    /* mostrar ventana */
                    configuracion.verventana = SI;
                    arg_leido = SI;
                    break;
                
                    default:
                    sprintf(mensaje, "[CapturarArgumentos] La opción -M%c no se reconoce", (char)*(*argv));
                    Notificar(mensaje, NO_ERROR, ECO_NO);
                    break;
                }
            }
            break;

            default:
            sprintf(mensaje, "[CapturarArgumentos] La opción -%c no se reconoce", (*argv)[1]);
            Notificar(mensaje, NO_ERROR, ECO_NO);
            break;
        }
    }

    if(arg_leido == SI) strcpy(configuracion.captura, "Paso de argumentos"); 
    
    ValidarConfiguracion();
}


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>