/********************************************************************/
/* GUI.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: GUI.c,v 1.3 2006/07/17 18:26:27 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: GUI.c */
/* */
/* Este módulo contiene las funciones de presentación visual. */
/******************************************************************************/
/* Fecha: 16 de septiembre de 2005 */
/******************************************************************************/
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "defines.h"
#include "tipos.h"
#include "gui.h"
/* configuración */
extern struct argumentos configuracion;
/* contadores de instrucciones y ventanas */
extern unsigned long instruccion, ventana;
/* esta función presenta en la pantalla el anuncio de software libre GPL en castellano */
void PresentarAnuncioGPL_Castellano()
{
printf(" O DDD DDD \n");
printf(" / \\ D D D D \n");
printf(" O---O D D D D \n");
printf(" | | DDD DDD \n");
printf(" ___________________________________\n");
printf(" Analizador de Dependencias de Datos\n");
printf(" Versión 5.10\n\n");
printf(" Copyright (C) 1997-2006 Rafael Rico\n\n");
printf(" ADD es software libre, publicado bajo\n");
printf(" la Licencia Pública General GNU\n\n\n");
}
/* esta función presenta en la pantalla el anuncio de software libre GPL en inglés */
void PresentarAnuncioGPL_Ingles()
{
printf(" O DDD DDD \n");
printf(" / \\ D D D D \n");
printf(" O---O D D D D \n");
printf(" | | DDD DDD \n");
printf(" _________________________\n");
printf(" Data Dependences Analyzer\n");
printf(" Version 5.10\n\n");
printf(" Copyright (C) 1997-2006 Rafael Rico\n\n");
printf(" ADD is free software, realesed under\n");
printf(" the GNU General Public License\n\n\n");
}
/* esta función presenta en la pantalla información acerca del análisis en curso */
void PresentarConfiguracionPantalla()
{
/* información sobre origen de datos */
printf(" Procesando %s en '%s'\n\n",
configuracion.origen==TRAZA ? "traza":"secuencia",
configuracion.ficherodatos);
/* información sobre rango a procesar */
printf(" Rango %2.2f%% desde %2.2f%%\n\n",
configuracion.rango,
configuracion.comienzo);
/* información sobre el tamaño de la ventana de instrucciones */
printf(" Tamaño de ventana = %d instrucciones\n\n", configuracion.ventana);
/* información sobre las contribuciones a tener en cuenta en */
/* la composición de dependencias de datos */
printf(" Mapa de composición de dependencias:\n");
printf(" (T A O) (E I) (D A S C)\n");
printf(" (%c %c %c) (%c %c) (%c %c %c %c)",
configuracion.verdaderas==SI ? 'x':'o',
configuracion.antidependencias==SI ? 'x':'o',
configuracion.salida==SI ? 'x':'o',
configuracion.explicitos==SI ? 'x':'o',
configuracion.implicitos==SI ? 'x':'o',
configuracion.datos==SI ? 'x':'o',
configuracion.direcciones==SI ? 'x':'o',
configuracion.pila==SI ? 'x':'o',
configuracion.cc==SI ? 'x':'o');
printf("\n\n");
}
/* esta función muestra información acerca del procesamiento en curso */
void MostrarCabecera()
{
if(configuracion.origen != CADENAHEX)
{
/*
printf("ADD 5.10 --Analizador de Dependencias de Datos--\n\n");
*/
PresentarAnuncioGPL_Castellano();
/*
PresentarAnuncioGPL_Ingles();
*/
/*
printf("Procesando %s en '%s' (rango %2.2f%%)\n\n",
configuracion.origen==TRAZA ? "traza":"secuencia",
configuracion.ficherodatos,
configuracion.rango);
*/
PresentarConfiguracionPantalla();
}
}
/* esta función muestra el estado de procesamiento */
void PresentarEstadoProcesamiento(unsigned long total, unsigned long encurso)
{
time_t tiempo;
struct tm *ptr_tm;
char fechahora[40];
static char paso25; /* flags para indicar estado de procesamiento */
static char paso50;
static char paso75;
/* inicializo los flags la primera vez y escribo la hora de comienzo */
if(encurso == 1)
{
paso25=SI; paso50=SI; paso75=SI;
/* fecha y hora */
tiempo = time(NULL);
ptr_tm = localtime(&tiempo);
strftime(fechahora, MAX_LINE, "%d/%m/%y %H:%M", ptr_tm);
printf(" Hora de comienzo [%s]\n", fechahora);
}
if(paso75==SI)
{
if(paso50==SI)
{
if(paso25==SI)
{
if(((double)encurso/total) > 0.25)
{
/* fecha y hora */
tiempo = time(NULL);
ptr_tm = localtime(&tiempo);
strftime(fechahora, MAX_LINE, "%d/%m/%y %H:%M", ptr_tm);
printf(" Completado el 25%% [%s]\n", fechahora);
paso25=NO;
}
}
else
{
if(((double)encurso/total) > 0.50)
{
/* fecha y hora */
tiempo = time(NULL);
ptr_tm = localtime(&tiempo);
strftime(fechahora, MAX_LINE, "%d/%m/%y %H:%M", ptr_tm);
printf(" Completado el 50%% [%s]\n", fechahora);
paso50=NO;
}
}
}
else
{
if(((double)encurso/total) > 0.75)
{
/* fecha y hora */
tiempo = time(NULL);
ptr_tm = localtime(&tiempo);
strftime(fechahora, MAX_LINE, "%d/%m/%y %H:%M", ptr_tm);
printf(" Completado el 75%% [%s]\n", fechahora);
paso75=NO;
}
}
}
}
/* esta función muestra en la pantalla la información de la tarjeta de operandos */
void MostrarTarjeta(fichainstruccion *tarjetaoperandos)
{
/* imprimo la tarjeta de la instrucción para ver si funciona bien */
int i;
unsigned long total;
char cadena[MAX_LINE];
/* todo esto no funciona aquí */
/* printf("\x01B[2J"); */ /* código de escape ANSI para borrar la pantalla */
/* printf("\027[2J"); */ /* código de escape ANSI para borrar la pantalla */
/* printf("%c[2J", 27);*/ /* código de escape ANSI para borrar la pantalla */
/* printf("\033[2J"); */
printf("\n");
total = configuracion.ultima - configuracion.primera + 1;
i = printf("-| instruccion %lu de %lu (%.2f%%) |", instruccion, total, 100.00*instruccion/total);
/* parece que '.2' redondea algo hacia arriba (llegamos al 100% cuando estamos en 99.99%) */
i += printf("-| ventana %lu de %lu (%d ins/ven) |", ventana, total/configuracion.ventana, configuracion.ventana);
for(i; i<80; i++) printf("-");
printf("%-14s ", tarjetaoperandos->hexadecimal);
/* formato de instrucción (notación de INTEL) */
/*
printf("%s%s", tarjetaoperandos->prefijo, tarjetaoperandos->prefijo[0]!='\0' ? " ":"");
printf("%s", tarjetaoperandos->nemonico);
printf("%s%s", tarjetaoperandos->op1[0]!='\0' ? " ":"", tarjetaoperandos->op1);
printf("%s%s%s", (tarjetaoperandos->op1[0]!='\0' && tarjetaoperandos->op2[0]!='\0') ? ",":"", tarjetaoperandos->op2[0]!='\0' ? " ":"", tarjetaoperandos->op2);
*/
/* igual con la función del módulo 'Auxiliares.c' */
CadenaEnsamblador(tarjetaoperandos->prefijo, tarjetaoperandos->nemonico, tarjetaoperandos->op1, tarjetaoperandos->op2, INTEL, cadena);
printf("%s", cadena);
printf(" ");
printf("(long:%d", tarjetaoperandos->longitud);
switch(tarjetaoperandos->salto)
{
case INCONDICIONAL:
printf(" salto:INCONDICIONAL");
break;
case NO_SALTO:
printf(" salto:NO SALTO");
break;
case TOMADO:
printf(" salto:TOMADO");
break;
case NOTOMADO:
printf(" salto:NO TOMADO");
break;
}
printf(" ALU=%d", tarjetaoperandos->ciclosALU);
printf(" BIU=%d)\n", tarjetaoperandos->ciclosBIU);
printf("\nExpl leido datos: %s", tarjetaoperandos->leidoexpldatos);
printf("\nExpl leido dir: %s", tarjetaoperandos->leidoexpldir);
printf("\nExpl leido pila: %s", tarjetaoperandos->leidoexplpila);
printf("\nExpl leido estado: %s", tarjetaoperandos->leidoexplestado);
printf("\nExpl escrito datos: %s", tarjetaoperandos->escritoexpldatos);
printf("\nExpl escrito dir: %s", tarjetaoperandos->escritoexpldir);
printf("\nExpl escrito pila: %s", tarjetaoperandos->escritoexplpila);
printf("\nExpl escrito estado: %s", tarjetaoperandos->escritoexplestado);
printf("\nImpl leido datos: %s", tarjetaoperandos->leidoimpldatos);
printf("\nImpl leido dir: %s", tarjetaoperandos->leidoimpldir);
printf("\nImpl leido pila: %s", tarjetaoperandos->leidoimplpila);
printf("\nImpl leido estado: %s", tarjetaoperandos->leidoimplestado);
printf("\nImpl escrito datos: %s", tarjetaoperandos->escritoimpldatos);
printf("\nImpl escrito dir: %s", tarjetaoperandos->escritoimpldir);
printf("\nImpl escrito pila: %s", tarjetaoperandos->escritoimplpila);
printf("\nImpl escrito estado: %s", tarjetaoperandos->escritoimplestado);
printf("\n");
getchar();
}
/* esta función muestra en la pantalla la información relativa a la ventana en curso */
void MostrarVentana()
{
printf("\nEsta función no ha sido implementada\n");
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>