// persona.cc

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

/******************************************************/
/* Classe Persona                                     */
/******************************************************/

/* Calcola la lunghezza di una stringa, fino a quando
 * non trova un carattere noin stampabile */
int Persona::nstrlen (const char *s)
{
int n;
  for (n = 0;*s >= ' ';s ++, n++);
  return n;
}

/* Copia la stringa sorgente 's' nella stringa destinazione
 * 'd', fermandosi quando trova un carattere non stampabile */
void Persona::nstrcpy (char *d, const char *s)
{
  while (*s >= ' ')   // Finche' ci sono caratteri stmpabili (>= ' ')
    *d++ = *s++;      // Li copia dalla sorgente nella destinazione
  *d = 0;             // Termina la stringa destinazione
}

Persona::Persona (Persona **l, char *n) : list ((list**) l)
{
  nome = new char [nstrlen (n) + 1]; // Solita allocazione di stringa e copia
  if (nome)
    nstrcpy (nome,n); 
}

Persona::~Persona ()
{
  if (nome)      // Solita eleminazione di stringa, solo se esiste
    delete nome;
}

void Persona::cerca (char *n)
{
  if (!strcasecmp (nome,n))             // Se il nome corrisponde (ingorando maiuscole/minuscole)
    stampa ();                          // Stampa il dato
  if (Next ())                          // Quindi va a cercare se ce ne sono ancora
    ((Persona *) Next ()) -> cerca (n);
}

/******************************************************/
/* Classe Indirizzo                                   */
/******************************************************/

void Indirizzo::stampa ()
{
  printf ("%s\n%s\n%05d %s\n",nome,indirizzo,cap,citta);
}

Indirizzo::Indirizzo (Persona **l, char *n, char *ind, int c, char *cit) :
  Persona (l, n)
{
  indirizzo = new char [nstrlen (ind) +1]; // Solite allocazioni di stringhe e copie...
  if (indirizzo)
    nstrcpy (indirizzo, ind);
  cap = c;
  citta = new char [nstrlen (cit) +1];
  if (citta)
    nstrcpy (citta,cit);
}

Indirizzo::~Indirizzo ()
{
  if (indirizzo)         // Solita eliminazione di stringa solo se esiste
    delete (indirizzo);
  if (citta)
    delete (citta);
}

/******************************************************/
/* Classe Telefono                                    */
/******************************************************/

void Telefono::stampa ()
{
  printf ("%s Tel %s\n",nome,numTel);
}

Telefono::Telefono (Persona **l, char *n, char *nt) :
  Persona (l, n)
{
  numTel = new char [nstrlen (nt) +1]; // Solite allocazioni di stringhe e copie...
  if (numTel)
    nstrcpy (numTel,nt);
}

Telefono::~Telefono ()
{
  if (numTel)         // Solita eliminazione di stringa solo se esiste
    delete (numTel);
}

/******************************************************/
/* Classe MenuCerca                                   */
/******************************************************/

void MenuCerca::action (void *par)
{
char n [40];

  printf ("Nome da cercare :");
  fgets (n,39,stdin);                 // Legge il nome da cercare
  Persona::nstrcpy (n,n);             // Elimina l'a capo alla fine
  (*((Persona **)par)) -> cerca (n);  // cerca il nome nella lista
}

/******************************************************/
/* Classe MenuIndirizzo                               */
/******************************************************/

void MenuIndirizzo::action (void *par)
{
char n [40];
char ind [40];
char ct [10];
int cap;
char cit [40];

  printf ("Nome:");
  fgets (n,39,stdin);      // Legge il nome da inserire
  printf ("Indirizzo:");
  fgets (ind,39,stdin);    // Legge l'indirizzzo
  printf ("Cap:");
  fgets (ct,9,stdin);      // Legge il CAP
  cap = strtol (ct,0,0L);  // trasforma il CAP in numero
  printf ("Citta:");
  fgets (cit,39,stdin);    // Legge la citta'
  new Indirizzo ((Persona **)par,n,ind,cap,cit);
}

/******************************************************/
/* Classe MenuTelefono                                */
/******************************************************/

void MenuTelefono::action (void *par)
{
char n [40];
char nt [40];
Persona *p;

  printf ("Nome:");
  fgets (n,39,stdin);                 // Legge il nome da inserire
  printf ("N° Telefono:");
  fgets (nt,39,stdin);                // Legge il nome da inserire
  new Telefono ((Persona **)par,n,nt);
}