#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "Pen.h"
 
struct pen {
  const char*   _brand;
  const char*   _color;
};

 
Pen newPen(const char *brand, const char *color) {
  Pen pen = (Pen)malloc(sizeof(struct pen));
  pen->_brand = brand;
  pen->_color = color;

  return pen;
}
 
void  deletePen(Pen pen) {
  if (pen) 
    free(pen);
}

void writePen(Pen pen, const char *msg) {
  printf("(%s) %s\n", pen->_color, msg);
}
 
const char *getBrandPen(Pen pen) { return pen->_brand;   }

const char *getColorPen(Pen pen) { return pen->_color;   }
 
/* note that we require pen1 and pen2 to be valid pens: any of
   them being NULL pointers will result in a false comparison. */
int equalsPen(Pen pen1, Pen pen2) {
  if (pen1 == NULL || pen2 == NULL)
    return 0;
  
  return !strcmp(getBrandPen(pen1), getBrandPen(pen2)) &&
    !strcmp(getColorPen(pen1), getColorPen(pen2));
}

void printPen(Pen pen) {
  printf("== Pen ==\n");
  printf("Brand:   %s\n", getBrandPen(pen));
  printf("Color:   %s\n", getColorPen(pen));
}


Note-se que a função de criação de uma caneta está simplificada. Deveria ser alocado espaço em memória para guardar duas novas cadeias de caracteres para guardar a marca e cor da caneta, em vez de estarmos simplesmente a reutilizar as cadeias de caracteres recebidas como argumento. Esta solução tem a desvantagem de possibilitar fugas de memória dado que não se sabe quando é que se pode libertar a memória associada à marca e cor de uma caneta a destruir.