/*--------------------------------------------------------------------
 * FICHERO:  Zeus.c
 * OBJETIVO: Mdulo de funciones comunes de Zeus
 * AUTOR:    Pedro Reina
 * FECHA:    J.20.4.1995
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Ficheros de cabecera
 *------------------------------------------------------------------*/

#include "Zeus.h"

/*--------------------------------------------------------------------
 * Definicin de macros constantes
 *------------------------------------------------------------------*/

   /* Ninguno */

/*--------------------------------------------------------------------
 * Variables globales
 *------------------------------------------------------------------*/

char Olimpo    [MAX_OLIMPO]   [LONG_FICH_CORTO];
char Requisito [MAX_REQUISITO][LONG_FICH_CORTO];
char Fuente    [MAX_FUENTE]   [LONG_FICH_CORTO];
char Cabecera  [MAX_CABECERA] [LONG_FICH_CORTO];
char Objeto    [MAX_OBJETO]   [LONG_FICH_CORTO];

short TotalOlimpo;
short TotalRequisito;
short TotalFuente;
short TotalCabecera;
short TotalObjeto;

/*--------------------------------------------------------------------
 * Declaracin de funciones
 *------------------------------------------------------------------*/

void PresentaPrograma();
void LeeOlimpo();
void MuestraOpciones();
int  PideObjeto();

/*--------------------------------------------------------------------
 * PROGRAMA PRINCIPAL
 * OBJETIVO: Pedir acciones al usuario y ejecutarlas
 *------------------------------------------------------------------*/
void main()
  {
  char Sigue=1;
  int  Opcion, Num;

  while ( Sigue )
    {
    PresentaPrograma();
    LeeOlimpo();
    MuestraOpciones();
    printf ( "\nIntroduce nmero de opcin: " );
    scanf ( "%d", &Opcion );
    getchar();

    switch ( Opcion )
      {
      case 0:   Sigue = 0;               break;
      case 1:   if ( Num = PideObjeto() )
                  { GeneraMakefile (Olimpo[Num-1]); }
                break;
      case 2:   for ( Num=0 ; Num<TotalOlimpo ; Num++ )
                  { GeneraMakefile (Olimpo[Num]); }
                break;
      case 3:   UneH();                  break;
      case 4:   GeneraLista();           break;
      case 5:   ExtraeDocumentacion();   break;
      }
    }
  printf ("\nPrograma terminado.\n");
  }

/*--------------------------------------------------------------------
 * Definicin de funciones
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * FUNCION:  PresentaPrograma()
 * OBJETIVO: Escribir la identificacin del programa
 * ENTRADAS: Ninguna; la versin y la fecha son macros
 * SALIDAS:  Ninguna.
 *------------------------------------------------------------------*/
void PresentaPrograma()
  {
  char  Mensaje [LONG_MENSAJE];
  short i;

  sprintf (Mensaje, "Zeus para Olimpo %s; Pedro Reina, %s", VERSION, FECHA);
  printf ("\n\n%s\n", Mensaje);
  for ( i=0 ; Mensaje[i] ; i++ )
    { putchar ('='); }
  printf ("\n");
  }

/*--------------------------------------------------------------------
 * FUNCION:  LeeOlimpo()
 * OBJETIVO: Leer en el fichero Olimpo.des la lista de objetos
 * ENTRADAS: Ninguna
 * SALIDAS:  Ninguna, el programa puede abortar
 *------------------------------------------------------------------*/
void LeeOlimpo()
  {
  static char NombreFich[LONG_FICH_LARGO] = "Olimpo.des";
  char   Nombre[LONG_FICH_CORTO];
  FILE * Fichero;

  ArreglaSeparador (NombreFich);
  Fichero = AbreFicheroLeer (NombreFich);
  for ( TotalOlimpo=0 ; LeePalabra(Fichero,Nombre) ; TotalOlimpo++ )
    { strcpy (Olimpo[TotalOlimpo],Nombre); }
  }

/*--------------------------------------------------------------------
 * FUNCION:  MuestraOpciones()
 * OBJETIVO: Escribir las opciones
 * ENTRADAS: Ninguna
 * SALIDAS:  Ninguna
 *------------------------------------------------------------------*/
void MuestraOpciones()
  {
  printf ("\n0. Fin del programa");
  printf ("\n1. Generar un makefile");
  printf ("\n2. Generar todos los makefiles");
  printf ("\n3. Crear Olimpo.h");
  printf ("\n4. Crear Olimpo.lst");
  printf ("\n5. Extraer documentacin");
  printf ("\n");
  }

/*--------------------------------------------------------------------
 * FUNCION:  PresentaOpcion()
 * OBJETIVO: Escribir la identificacin de esta opcin
 * ENTRADAS: El texto que hay que presentar
 * SALIDAS:  Ninguna
 *------------------------------------------------------------------*/
void PresentaOpcion (Texto)
char *Texto;
  {
  short i;

  printf ("\n\n%s\n", Texto);
  for ( i=0 ; Texto[i] ; i++ )
    { putchar ('-'); }
  printf ("\n");
  }

/*--------------------------------------------------------------------
 * FUNCION:  ErrorFatal()
 * OBJETIVO: Dar al usuario un mensaje y abortar el programa
 * ENTRADAS: El mensaje
 * SALIDAS:  Ninguna. El programa aborta.
 *------------------------------------------------------------------*/
void ErrorFatal (Mensaje)
char *Mensaje;
  {
  printf ("\nError fatal: ");
  puts (Mensaje);
  exit (1);
  }

/*--------------------------------------------------------------------
 * FUNCION:  ArreglaSeparador()
 * OBJETIVO: Conseguir que el separador de un nombre de fichero sea
 *           el correcto para el ordenador objetivo
 * ENTRADAS: El nombre del fichero
 * SALIDAS:  El nombre puede quedar modificado.
 * NOTA:     Por defecto, el separador se supone que es '.'
 *------------------------------------------------------------------*/
#ifdef PC
#pragma warn -par
#endif
void ArreglaSeparador (Nombre)
char *Nombre;
  {
#ifdef QL
  char  c;
  short i;
  for ( i=0 ; c=Nombre[i] ; i++ )
    {
    if ( c=='.' )  { Nombre[i] = '_'; }
    }
#endif
  }
#ifdef PC
#pragma warn +par
#endif

/*--------------------------------------------------------------------
 * FUNCION:  AbreFicheroLeer()
 * OBJETIVO: Abrir un fichero para leerlo lnea a lnea
 * ENTRADAS: El nombre del fichero
 * SALIDAS:  El fichero. Si no se puede leer, el programa aborta
 *------------------------------------------------------------------*/
FILE *AbreFicheroLeer (Nombre)
char *Nombre;
  {
  FILE *Respuesta;
  char Mensaje[LONG_MENSAJE];

  if ( ! (Respuesta = fopen (Nombre,"r")) )
    {
    sprintf (Mensaje, "El fichero %s no se puede leer", Nombre);
    ErrorFatal (Mensaje);
    }

  return ( Respuesta );
  }

/*--------------------------------------------------------------------
 * FUNCION:  AbreFicheroGrabar()
 * OBJETIVO: Abrir un fichero para grabar en l
 * ENTRADAS: El nombre del fichero
 * SALIDAS:  El fichero. Si no se puede grabar, el programa aborta
 *------------------------------------------------------------------*/
FILE *AbreFicheroGrabar (Nombre)
char *Nombre;
  {
  FILE *Respuesta;
  char Mensaje[LONG_MENSAJE];

  if ( ! (Respuesta = fopen (Nombre,"w")) )
    {
    sprintf (Mensaje, "En el fichero %s no se puede escribir", Nombre);
    ErrorFatal (Mensaje);
    }

  return ( Respuesta );
  }

/*--------------------------------------------------------------------
 * FUNCION:  LeePalabra()
 * OBJETIVO: Leer la siguiente palabra de un fichero
 * ENTRADAS: El fichero y un lugar donde dejar la palabra
 * SALIDAS:  Lgica, que indica si se ha podido leer.
 *           La palabra puede quedar modificada.
 * NOTA:     Se lee la primera palabra de cada lnea que no comience
 *           con un asterisco ni est en blanco
 *------------------------------------------------------------------*/
char LeePalabra (Fichero, Palabra)
FILE *Fichero;
char *Palabra;
  {
  char Respuesta, Sigue=1, *Aux;
  char Linea [LONG_MENSAJE];

  while ( Sigue )
    {
    if ( fgets (Linea, LONG_MENSAJE, Fichero) )
      {
      if ( Linea[0] != '\n' && Linea[0] != '*' )
        {
        if ( Aux = strtok (Linea, " \n\t") )
          {
          strcpy (Palabra,Aux);
          Sigue = 0;
          Respuesta = 1;
          }
        }
      }
    else
      {
      Sigue = 0;
      Respuesta = 0;
      }
    }

  return ( Respuesta );
  }

/*--------------------------------------------------------------------
 * FUNCION:  PideObjeto()
 * OBJETIVO: Pedir al usuario un objeto de Olimpo
 * ENTRADAS: Ninguna
 * SALIDAS:  El nmero del objeto o cero si no se elige ninguno
 *------------------------------------------------------------------*/
int PideObjeto()
  {
  int i, Opcion, Long=0, Tope;

  PresentaOpcion ("Eleccin del objeto");
  printf ( "\n 0. Men anterior" );

  for ( i=0 ; i<TotalOlimpo ; i++ )
    {
    switch ( i%3 )
      {
      case 0:  printf ("\n");
               Long = 0;
               Tope = 20;
               break;
      case 1:  Tope = 40;    break;
      case 2:  Tope = 60;    break;
      }
    printf ("%2d. %s", i+1, Olimpo[i]);
    Long += strlen (Olimpo[i]);
    for ( ; Long<Tope ; Long++ )
      { printf (" "); }
    }

  printf ( "\n\nIntroduce nmero de objeto: " );
  scanf ( "%d", &Opcion );

  if ( Opcion>TotalOlimpo+1 || Opcion<0 )  { Opcion = 0; }

  return ( Opcion );
  }

