/************************************************************
    Programma bior.c per calcolo e visualizzazione
    grafica dei bioritmi
************************************************************/

#include <exec/types.h>  /* Inclusione tipi standard del C */
#include <intuition/intuition.h>      /* Include Intuition */
#include <math.h>                  /* Funzioni Matematiche */
#include <stdio.h>  /* Input ed output standard, scanf()...*/

#ifdef LATTICE  /* Se stiamo usando il Lattice e' definito */
#include <string.h>       /* Funzioni di gestione stringhe */
#include <proto/intuition.h>        /* Prototipi Intuition */
#include <proto/mathieeedoubbas.h>     /* Proto matematica */
#else                             /* Stiamo usando Aztec C */
#define PI 3.14159267       /* Aztec non definisce PIgreco */
#include <functions.h>           /* Protocolli di funzioni */
#endif

struct GfxBase        *GfxBase;
struct IntuitionBase  *IntuitionBase;
struct Window         *f, *OpenWindow();
struct RastPort       *rp;
/* Struttura di definizione della finestra del grafico */
struct NewWindow finestra = {
 0, 0,                 /* Coord. vertice alto a sinistra  */
 640, 195,             /* Larghezza ed altezza            */
 2, 1,                 /* Colori DetailPen e BlockPen     */
 NULL,                 /* Non sono richiesti flags IDCMP  */
 SMART_REFRESH | WINDOWDRAG, /* flag tipo finestra        */
 NULL,                 /* Puntatore al primo gadget       */
 NULL,                 /* Puntatore a checkmark           */
 (UBYTE *)"Bioritmi",  /* Stringa con nome finestra       */
 NULL,                 /* Puntatore allo schermo          */
 NULL,                 /* Puntatore alla bitmap           */
 0, 0,                 /* Dimensioni minime (non ridim.)  */
 0, 0,                 /* Dimensioni massime (non ridim.) */
 WBENCHSCREEN };       /* Tipo di schermo in cui aprirla  */

/* Variabili globali, visibili a tutte le funzioni */
int gmese[ 12 ]={31,29,31,30,31,30,31,31,30,31,30,31};
int gtot[ 12 ]={0,31,59,90,120,151,181,212,243,273,304,334};
char *mese[]={"Gennaio", "Febbraio", "Marzo",
              "Aprile", "Maggio", "Giugno",
              "Luglio", "Agosto", "Settembre",
              "Ottobre", "Novembre", "Dicembre" };

/* Funzione di termine con chiusura finestra e librerie */
void die( n )
{
 if ( f ) CloseWindow( f );
 if ( IntuitionBase ) CloseLibrary( IntuitionBase );
 if ( GfxBase ) CloseLibrary( GfxBase );
 exit( 0L );
}

/* Funzione di calcolo dei giorni trascorsi */
int calgio( g, m, a, b)
int g, m, a, b;
{
  int giorni;

  /* Il termine (m<3 ?b :0) serve per eliminare il giorno */
  /* in piu' aggiunto da (a/4) se l'anno e' bisestile, ma */
  /* solo se il giorno 29 Febbraio non e' ancora passato, */
  /* cioe' se il mese viene prima di Marzo: */

  giorni = g + gtot[m-1] + (a-1) * 365 + (a/4) - (m<3 ?b :0);
  return( giorni );
}

/* Funzione di calcolo del pixel da accendere per bioritmo */
int pix( gg, cic )
int gg, cic;
{
  double c, dok;
  c = ( (double) gg / (double) cic );
  dok = 100 + ((int) (-50.0 * sin( 2 * PI * c) ));
  return( (int) dok );
}

/******************* Funzione principale *****************/
void main()
{
 char nome[20], str[20], s;
 int gn, mn, an, mb, ab, bisn, bisb, giorni, c;
 
 /* Apre le librerie Intuition e Graphics di Amiga */
 IntuitionBase=(struct IntuitionBase *) OpenLibrary("intuition.library",0);
 if (IntuitionBase == NULL) die();

 GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",0);
 if ( ! GfxBase ) die(); /* Come test per IntuitionBase! */

 /* Richiesta dei dati necessari per calcolo giorni di vita */
 printf("\f\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
 printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
 printf("Inserimento dati\n\nScrivi il tuo nome: ");
 scanf("%s",nome);
 printf("Giorno, mese e anno di nascita (gg mm aaaa): ");
 scanf("%2d %2d %4d", &gn, &mn, &an);
 printf("\nMese e anno di previsione (mm aaaa): ");
 scanf("%2d %4d", &mb, &ab);

 for ( ;; ) /* Cicla continuamente sino a immissione 'n' */
 {
  bisn=(((an*100)/4)==((an/4)*100) ? 1 : 0);
  bisb=(((ab*100)/4)==((ab/4)*100) ? 1 : 0);

  /* Se bisn e' bisestile, allora febbraio = 28 giorni */
  gmese[ 1 ] = 28 + bisn;

  /* Verifichiamo correttezza dati e finiamo se errati */
  if (gn<1 || mn<1 || mn>12 || an<1800 || an>2100) die();
  if (mb<1 || mb>12 || ab<an || ab>2100 || gn>gmese[mn-1]) die();

  /* Riassegna febbraio in base all'anno di previsione */
  gmese[ 1 ]= 28 + bisb;

  giorni = calgio(1,mb,ab,bisb) - calgio(gn,mn,an,bisn);
  if ( giorni < 0 ) die();

  /* Apre la finestra passando un puntatore alla struttura */
  /* Se tutto OK, assegnamo anche il puntatore alla RastPort */
  if ( (f = OpenWindow( &finestra )) == NULL ) die();
  rp = f -> RPort;

  /* Disegna le sezioni per preparare la finestra ai grafici */
  SetAPen( rp, 3 ); Move( rp, 140, 30 );
  Text( rp, "Bioritmo del mese di ", 21 );
  /* La funzione strlen() restituisce la lunghezza di stringa */
  Text( rp, mese[ mb-1 ], strlen( mese[ mb-1 ]) );
  Text( rp," dell'anno ", 11 );

  sprintf( str, "%d", ab ); /* Converte intero --> stringa */
  /* str punta alla stringa convertita da ab, la scriviamo */
  Text( rp, str, strlen( str ) ); 

  SetAPen(rp,1); /* Fissa colore della penna di scrittura */
  for ( c = 1 ; c < ( gmese[ mb-1 ] + 1 ) ; c++ )
   {
    Move( rp, (c*20), 50); Draw( rp,(c*20), 150 );
    Move( rp, ((c*20)-4-(c>9 ? 3 : 0)),48);
    sprintf( str, "%d", c );
    Text( rp, str, strlen( str ) );
   }
  Move(rp,5,100); Draw(rp,635,100); Move(rp,40,180);

  Draw(rp,100,180); Text(rp,"Fisico",6);
  SetAPen(rp,2); Move(rp,240,180);
  Draw(rp,300,180); Text(rp,"Emotivo",7);

  SetAPen(rp,3); Move(rp,450,180);
  Draw(rp,510,180); Text(rp,"Intellettivo",12);

  /* Inizio cicli per la tracciatura dei grafici */
  Move(rp,20,100);
  for ( c = 0 ; c < gmese[ mb-1 ] ; c++ )
    Draw( rp, 20*(c+1), pix( giorni + c, 33 ) );

  Move( rp, 20, 100 ); SetAPen( rp, 2 );
  for ( c = 0 ; c < gmese[ mb-1 ] ; c++ )
   Draw( rp, 20*(c+1), pix( giorni + c, 28 ) );

  Move( rp, 20, 100 ); SetAPen( rp, 1 );
  for ( c = 0 ; c < gmese[ mb-1 ] ; c++ )
    Draw( rp, 20*( c+1 ), pix( giorni + c, 23 ));

  Move( rp, 20, 50 ); Draw( rp, 20, 150 );
  printf("\n\n\n\nDati relativi a %s",nome);
  printf(" nato il %d %d %d\n",gn,mn,an);
  printf("\nVuoi vedere il bioritmo del mese");
  printf(" successivo (s/n)?");
  scanf("%c %c", &s, &s );
  
  /* Chiude finestra e assegna puntatore a 0 */
  CloseWindow( f ); f = NULL;
  if ( (s == 's' ) || ( s == 'S' )) /* Test risposta */
   {
    mb = ( mb == 12 ? 1 : ++mb); /* Avanza mese */
    ab += ( mb == 1 ? 1 : 0); /* ed eventualmente anno */
   }
  else
   die(); /* Termina se immesso "n" */
 }/* chiusura di for (;;) */
}/* chiusura di main() */
