Há três funções que têm que ser concretizadas de raiz:
- getStringFromMemory(PenWithMemory pen, int idx) - Devolve uma determinada cadeia de caracteres escrita anteriormente;
- resetMemory(PenWithMemory pen) - remove todas as cadeias de caracteres associadas à caneta;
- getCapacityPenWithMemory(PenWithMemory pen) - Devolve a capacidade da caneta com memória;
Há quatro funções a que é necessário adicionar novo comportamento face ao suportado por Caneta:
- writePenWithMemory - É necessário guardar a cadeia de caracteres escrita;
- newPenWithMemory - É necessário inicializar a estrutura de memória para guardar as cadeias de caracteres escritas;
- deletePenWithMemory) - Liberta a estrutura de memória que guarda as cadeias de caracteres escritas pela caneta a destruir;
- equalsPenWithMemory – É necessário considerar um novo campo, capacidade, para verificar a igualdade de duas canetas com memória;
- printPenWithMemory - É necessário apresentar ao utilizador um novo campo, a capacidade da caneta com memória;
Assim, o ficheiro com a concretização deste conceito deverá ter o seguinte conteúdo:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "Pen.h"
#include "PenWithMemory.h"
struct pen_with_memory {
Pen _pen;
int _capacity;
int _next; // idx for the next free position
const char** _memory;
};
PenWithMemory newPenWithMemory(const char *brand, const char *color, int capacity) {
PenWithMemory pen = (PenWithMemory)malloc(sizeof(struct pen_with_memory));
if (pen != NULL) {
pen->_pen = newPen(brand, color);
pen->_capacity = capacity;
pen->_next = 0;
pen->_memory = (const char **)malloc(sizeof(char*)*capacity);
if (pen->_pen == NULL || pen->_memory == NULL) { // error in allocating memory
deletePenWithMemory(pen);
pen = NULL;
}
}
return pen;
}
void deletePenWithMemory(PenWithMemory pen) {
if (pen) {
deletePen(pen->_pen);
if (pen->_memory != NULL)
free(pen->_memory);
free(pen);
}
}
void writePenWithMemory(PenWithMemory pen, const char *msg) {
if (pen->_next < pen->_capacity) {
pen->_memory[pen->_next++] = msg;
}
writePen(pen->_pen, msg);
}
const char *getStringPenWithMemory(PenWithMemory pen, int idx) {
if (idx >= 0 && idx < pen->_next) {
return pen->_memory[idx];
}
return NULL;
}
void resetMemory(PenWithMemory pen) {
pen->_next = 0;
}
int getCapacityPenWithMemory(PenWithMemory pen) { return pen->_capacity; }
const char *getBrandPenWithMemory(PenWithMemory pen) { return getBrandPen(pen->_pen); }
const char *getColorPenWithMemory(PenWithMemory pen) { return getColorPen(pen->_pen); }
/* note that we require pen1 and pen2 to be valid pens: any of
them being NULL pointers will result in a false comparison. */
int equalsPenWithMemory(PenWithMemory pen1, PenWithMemory pen2) {
return (pen1 != NULL && pen2 != NULL) && equalsPen(pen1->_pen, pen2->_pen) &&
pen1->_capacity == pen2->_capacity;
}
void printPenWithMemory(PenWithMemory pen) {
printPen(pen->_pen);
printf("Capacity: %d\n", getCapacityPenWithMemory(pen));
}