// 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);
}