//Attributo: Attr.cc
// Implementazione della classe 'Attributo', 'AttrTaglia'
#include <stdio.h>
#include <string.h>
#include "attr.h"
/******************************************************/
/* Classe Attributo */
/******************************************************/
/* Confrota un attributo con un altro:
* Ritorna:
* 0 se a e' uguale a this
* <0 se a e' inferiore a this
* >0 se a e' superiore a this
* Se confronto l'attributo con uno di tipo diverso, mi
* risponde 'uguali'
*/
int Attributo::operator != (const Attributo &a)
{
if (a.tipo != tipo)
return 0; // Tipo diverso, quindi 'uguali'
return strcmp (a.valore,valore);
}
/* Modifica il valore dell'attributo.
* Il nuovo valore deve essere piu' corto del vecchio,
* se no viene troncato. Questo garantisce che non si
* ecceda la dimensione allocata
*/
void Attributo::changestr (char *s)
{
strncpy (valore,s,strlen (valore));
}
/* Costruttore con parametri.
* Inizializza tipo e valore
*/
Attributo::Attributo (const tipo_t t, const char *val)
{
int i;
tipo = t; // Inizializza il tipo
for (i = 0;val [i] > ' '; i++) // conta i caratteri 'stampabili'
;
valore = new char [i + 1]; // Alloca la stringa per i soli stampabili
if (valore) // Se ha allocato
{
strncpy (valore,val,i); // Copia il valore, per i soli caratteri stampabili
valore [i] = 0; // Termina la stringa con il 'null' di rigore
}
}
/* Costruttore per copia
*/
Attributo::Attributo (const Attributo &a)
{
Attributo (a.tipo , a.valore); // Usa il costruttore con parametri, per allocare
// una nuova stringa
}
/* Distruttore */
Attributo::~Attributo ()
{
if (valore) // Se la stringa e' stata allocata
delete valore; // Libera la memoria
}
/******************************************************/
/* Classe AttrTaglia */
/******************************************************/
/* Costruttore con parametri.
* Imposta la taglia a tre cifre
*/
AttrTaglia::AttrTaglia (const int val) : Attributo (taglia , "000") // Costruttore con stringa di tre cifre
{
char t [4]; // Stringa per creare la taglia a tre cifre (per i confronti)
sprintf (t,"%03d",val % 999); // Ci mette dentro la taglia a tre cifre
changestr (t); // Sostituisce '000' con la taglia vera
}