Skip to content

Commit

Permalink
Revamped label repository
Browse files Browse the repository at this point in the history
  • Loading branch information
BlockoS committed Sep 7, 2024
1 parent f6df750 commit 388b5cc
Show file tree
Hide file tree
Showing 3 changed files with 175 additions and 244 deletions.
136 changes: 64 additions & 72 deletions label.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,23 +38,20 @@

#define LABEL_ARRAY_INC 16

/**
* Label repository.
*/
struct label_repository_impl {
size_t size; /**< Size of label repository */
size_t last; /**< Last element in the repository */
label_t *labels; /**< Labels */
/// Label repository.
struct LabelRepositoryImpl {
size_t size; //< Size of label repository.
size_t last; //< Last element in the repository.
Label *labels; //< Labels.
};

/**
* Get label index by its address.
* \param [in] repository Label repository.
* \param [in] logical Logical address.
* \param [in] page Memory page.
* \return label index or -1 if the label was not found.
*/
static int label_repository_index(label_repository_t* repository, uint16_t logical, uint8_t page) {
/// Get label index by its address.
/// \param [in] repository Label repository.
/// \param [in] logical Logical address.
/// \param [in] page Memory page.
/// \return label index.
/// \return -1 if the label was not found.
static int label_repository_index(LabelRepository *repository, uint16_t logical, uint8_t page) {
size_t i;
for(i=0; i<repository->last; i++) {
if( (repository->labels[i].page == page) &&
Expand All @@ -65,53 +62,45 @@ static int label_repository_index(label_repository_t* repository, uint16_t logic
return -1;
}

/* Create label repository. */
label_repository_t* label_repository_create() {
label_repository_t *repository;
repository = (label_repository_t*)malloc(sizeof(label_repository_t));
// Create label repository.
LabelRepository* label_repository_create() {
LabelRepository *repository = (LabelRepository*)malloc(sizeof(LabelRepository));
if(repository == NULL) {
ERROR_MSG("Failed to create label repository: %s", strerror(errno));
return NULL;
}

repository->last = 0;

repository->labels = NULL;

repository->size = LABEL_ARRAY_INC;
repository->labels = (label_t*)malloc(repository->size * sizeof(label_t));
if(repository->labels == NULL) {
ERROR_MSG("Failed to create label: %s", strerror(errno));
label_repository_destroy(repository);
free(repository);
return NULL;
}

} else {
repository->last = 0;
repository->labels = NULL;
repository->size = LABEL_ARRAY_INC;
repository->labels = (Label*)malloc(repository->size * sizeof(Label));
if(repository->labels == NULL) {
ERROR_MSG("Failed to create label: %s", strerror(errno));
label_repository_destroy(repository);
free(repository);
repository = NULL;
}
}
return repository;
}

/* Delete label repository. */
void label_repository_destroy(label_repository_t* repository) {
// Delete label repository.
void label_repository_destroy(LabelRepository* repository) {
repository->size = 0;
repository->last = 0;

if(repository->labels != NULL) {
for(int i=0; i<repository->last; i++) {
if(repository->labels[i].name) {
free(repository->labels[i].name);
}
if(repository->labels[i].description) {
free(repository->labels[i].description);
}
for(size_t i=0; i<repository->last; i++) {
free(repository->labels[i].name);
free(repository->labels[i].description);
}
free(repository->labels);
repository->labels = NULL;
}
}

/* Add label to repository. */
int label_repository_add(label_repository_t* repository, const char* name, uint16_t logical, uint8_t page, const char *description) {
int ret = 1;
// Add label to repository.
bool label_repository_add(LabelRepository* repository, const char* name, uint16_t logical, uint8_t page, const char *description) {
assert(repository != NULL);
bool ret = true;
int index = label_repository_index(repository, logical, page);
if(index >= 0) {
#if 0
Expand All @@ -125,12 +114,12 @@ int label_repository_add(label_repository_t* repository, const char* name, uint1
} else {
/* Expand arrays if necessary */
if(repository->last >= repository->size) {
label_t *ptr;
Label *ptr;
repository->size += LABEL_ARRAY_INC;
ptr = (label_t*)realloc(repository->labels, repository->size * sizeof(label_t));
ptr = (Label*)realloc(repository->labels, repository->size * sizeof(Label));
if(ptr == NULL) {
label_repository_destroy(repository);
ret = 0;
ret = false;
} else {
repository->labels = ptr;
}
Expand All @@ -150,35 +139,39 @@ int label_repository_add(label_repository_t* repository, const char* name, uint1
return ret;
}

/* Find a label by its address. */
int label_repository_find(label_repository_t* repository, uint16_t logical, uint8_t page, label_t *out) {
// Find a label by its address.
bool label_repository_find(LabelRepository* repository, uint16_t logical, uint8_t page, Label *out) {
int index = label_repository_index(repository, logical, page);
if(index < 0) {
memset(out, 0, sizeof(label_t));
return 0;
bool ret = (index >= 0);
if(ret) {
memcpy(out, &repository->labels[index], sizeof(Label));
} else {
memset(out, 0, sizeof(Label));
}
memcpy(out, &repository->labels[index], sizeof(label_t));
return 1;
return ret;
}

/* Get the number of labels stored in the repository. */
int label_repository_size(label_repository_t* repository) {
return repository ? (int)repository->last : 0;
/// Get the number of labels stored in the repository.
int label_repository_size(LabelRepository* repository) {
assert(repository != NULL);
return (int)repository->last;
}

/* Retrieve the label at the specified index. */
int label_repository_get(label_repository_t* repository, int index, label_t *out) {
if((repository != NULL) && ((index >= 0) && (index < (int)repository->last))) {
memcpy(out, &repository->labels[index], sizeof(label_t));
return 1;
// Retrieve the label at the specified index.
bool label_repository_get(LabelRepository* repository, int index, Label *out) {
bool ret = false;
if((repository != NULL) && ((index >= 0) && (index < (int)repository->last))) {
ret = true;
memcpy(out, &repository->labels[index], sizeof(Label));
} else {
memset(out, 0, sizeof(label_t));
return 0;
memset(out, 0, sizeof(Label));
}
return ret;
}
/* Delete labels */
int label_repository_delete(label_repository_t* repository, uint16_t first, uint16_t end, uint8_t page) {
size_t i;

/// Delete labels.
void label_repository_delete(LabelRepository* repository, uint16_t first, uint16_t end, uint8_t page) {
size_t i;
for(i=0; i<repository->last; i++) {
if( (repository->labels[i].page == page) &&
(repository->labels[i].logical >= first) &&
Expand All @@ -191,10 +184,9 @@ int label_repository_delete(label_repository_t* repository, uint16_t first, uint
if(repository->labels[i].description) {
free(repository->labels[i].description);
}
memcpy(&repository->labels[i], &repository->labels[repository->last], sizeof(label_t));
memcpy(&repository->labels[i], &repository->labels[repository->last], sizeof(Label));
i--;
}
}
}
return 1;
}
155 changes: 70 additions & 85 deletions label.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,91 +38,76 @@

#include "config.h"

/**
* Label.
*/
/// Label.
typedef struct {
char* name; /**< Offset in the repository name buffer */
uint16_t logical; /**< Logical address */
uint8_t page; /**< Memory page */
char* description; /**< Description (optional) */
} label_t;

typedef struct label_repository_impl label_repository_t;

/**
* Create label repository.
* \return A pointer to a label repository or NULL if an error occured.
*/
label_repository_t* label_repository_create();

/**
* Release label repository resources.
* \param [in,out] repository Label repository.
*/
void label_repository_destroy(label_repository_t* repository);

/**
* Add label (or inline description) to repository.
* \param [in,out] repository Label repository.
* \param [in] name Name. If the name is NULL, then this label is an inline description.
* \param [in] logical Logical address.
* \param [in] page Memory page.
* \param [in] description Description (optional if name is set, mandatory otherwise).
*/
int label_repository_add(label_repository_t* repository, const char* name, uint16_t logical, uint8_t page, const char *description);

/**
* Find a label by its address.
* \param [in] repository Label repository.
* \param [in] logical Logical address.
* \param [in] page Memory page.
* \param [out] out Associated label (if any).
* \return 1 if a label was found, 0 otherwise.
*/
int label_repository_find(label_repository_t* repository, uint16_t logical, uint8_t page, label_t *out);

/**
* Get the number of labels stored in the repository.
* \param [in] repository Label repository.
* \return Label count.
*/
int label_repository_size(label_repository_t* repository);

/**
* Retrieve the label at the specified index.
* \param [in] repository Label repository.
* \param [in] index Label index.
* \param [out] out Label (if any).
* \return 1 if a label exists for the specified index, 0 otherwise.
*/
int label_repository_get(label_repository_t* repository, int index, label_t *out);

/**
* Delete labels
* \param [in] repository Label repository.
* \param [in] first Start of the logical address range.
* \param [in] end End of the logical address range.
* \param [in] page Memory page.
*/
int label_repository_delete(label_repository_t* repository, uint16_t first, uint16_t end, uint8_t page);

/**
* Load labels from file.
* \param [in] filename Input filename.
* \param [out] repository Label repository.
* \return 1 if the labels contained in the file was succesfully added to the repository.
* 0 if an error occured.
*/
int label_repository_load(const char* filename, label_repository_t* repository);

/**
* Save labels to file.
* \param [in] filename Configuration file.
* \param [in] reposity Label repository.
* \return 1 if the labels in the repository were succesfully written to the file.
* 0 if an error occured.
*/
int label_repository_save(const char* filename, label_repository_t* repository);
char* name; //< Offset in the repository name buffer
uint16_t logical; //< Logical address
uint8_t page; //< Memory page
char* description; //< Description (optional)
} Label;

typedef struct LabelRepositoryImpl LabelRepository;

/// Create label repository.
/// \return A pointer to a label repository.
/// \return NULL if an error occured.
LabelRepository* label_repository_create();

/// Release label repository resources.
/// \param [in,out] repository Label repository.
void label_repository_destroy(LabelRepository* repository);

/// Add label (or inline description) to repository.
/// \param [in,out] repository Label repository.
/// \param [in] name Name. If the name is NULL, then this label is an inline description.
/// \param [in] logical Logical address.
/// \param [in] page Memory page.
/// \param [in] description Description (optional if name is set, mandatory otherwise).
/// \return true if the entry was successfully added in the repository.
/// \return false if an error occured.
bool label_repository_add(LabelRepository* repository, const char* name, uint16_t logical, uint8_t page, const char *description);

/// Find a label by its address.
/// \param [in] repository Label repository.
/// \param [in] logical Logical address.
/// \param [in] page Memory page.
/// \param [out] out Associated label (if any).
/// \return true if a label was found.
/// \return 0 otherwise.
bool label_repository_find(LabelRepository* repository, uint16_t logical, uint8_t page, Label *out);

/// Get the number of labels stored in the repository.
/// \param [in] repository Label repository.
/// \return Label count.
int label_repository_size(LabelRepository* repository);

/// Retrieve the label at the specified index.
/// \param [in] repository Label repository.
/// \param [in] index Label index.
/// \param [out] out Label (if any).&
/// \return true if a label exists for the specified index.
/// \return false otherwise.
bool label_repository_get(LabelRepository* repository, int index, Label *out);

/// Delete labels
/// \param [in] repository Label repository.
/// \param [in] first Start of the logical address range.
/// \param [in] end End of the logical address range.
/// \param [in] page Memory page.
void label_repository_delete(LabelRepository* repository, uint16_t first, uint16_t end, uint8_t page);

/// Load labels from file.
/// \param [out] repository Label repository.
/// \param [in] filename Input filename.
/// \return true if the labels contained in the file was succesfully added to the repository.
/// \return false if an error occured.
bool label_repository_load(LabelRepository* repository, const char* filename);

/// Save labels to file.
/// \param [in] reposity Label repository.
/// \param [in] filename Configuration file.
/// \return true if the labels in the repository were succesfully written to the file.
/// \return false if an error occured.
bool label_repository_save(LabelRepository* repository, const char* filename);

#endif // ETRIPATOR_LABEL_H
Loading

0 comments on commit 388b5cc

Please sign in to comment.