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