Final assignment for the course "Real Time and Embedded Systems" of THMMY in AUTH university.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
2.4 KiB

#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include "message.h"
// Defines the node structure
struct message_t {
char *message;
5 years ago
node_id_t received_from, *sent_to;
uint16_t message_length, num_sent_to;
};
/* API */
5 years ago
message_handle_t message_init(const char *message, uint16_t length, node_id_t received_from) {
assert(message && length <= MAX_MESSAGE_LENGTH);
message_handle_t message_handle = malloc(sizeof(message_t));
assert(message_handle);
5 years ago
message_handle->message = malloc((length + 1) * sizeof(char));
strcpy(message_handle->message, message);
5 years ago
message_handle->message_length = length;
message_handle->received_from = received_from;
message_handle->sent_to = NULL;
message_handle->num_sent_to = 0;
return message_handle;
}
void message_free(message_handle_t message_handle) {
assert(message_handle);
free(message_handle->sent_to);
free(message_handle->message);
free(message_handle);
}
5 years ago
void message_add_sent_to(message_handle_t message_handle, node_id_t sent_to) {
assert(message_handle);
5 years ago
// Expands array by re-allocation space
node_id_t *r_sent_to = realloc(message_handle->sent_to, ++(message_handle->num_sent_to) * sizeof(node_id_t));
if (!r_sent_to) {
free(r_sent_to);
perror("Unable to reallocate memory for message receivers.");
exit(EXIT_FAILURE);
}
5 years ago
message_handle->sent_to = r_sent_to;
// ++(message_handle->num_sent_to);
message_handle->sent_to[message_handle->num_sent_to - 1] = sent_to;
}
5 years ago
char *message_get(message_handle_t message_handle, int *length) {
assert(message_handle && length);
5 years ago
static char *message_buffer = NULL;
static int message_buffer_len = 0;
if (message_buffer_len != message_handle->message_length + 1) {
char *r_message_buffer = (char *) realloc(message_buffer, (message_handle->message_length + 1) * sizeof(char));
if (!r_message_buffer) {
free(r_message_buffer);
perror("Unable to reallocate memory for message receivers.");
exit(EXIT_FAILURE);
}
message_buffer = r_message_buffer;
message_buffer_len = message_handle->message_length + 1;
}
5 years ago
strcpy(message_buffer, message_handle->message);
(*length) = message_handle->message_length;
5 years ago
return message_buffer;
}
5 years ago
bool message_sent_to(message_handle_t message_handle, node_id_t id) {
assert(message_handle);
for (uint16_t i = 0; i < message_handle->num_sent_to; ++i) {
5 years ago
if (message_handle->sent_to[i] == id) {
return true;
}
}
return false;
}