how could I optimize my code, or make it cleaner? See things to avoid. I receive data in my protocol and then analyze it in a message structure.
My protocol: {2 octet: Message ID}{? octets: CONTENT}\n
#include "pegasus.h"
# define ENDL '\n'
t_message
*create_message(int id, char *content) {
t_message *message;
if (!(message = (t_message*)malloc(sizeof(t_message))))
return (NULL);
message->id = id;
message->content = content;
return (message);
}
static t_message
*parse_message(char *buffer) {
int id;
char *content;
t_message *message;
id = *(short*)(buffer);
content = (buffer + 2);
if (!(message = create_message(id, content))) free(buffer);
return (message);
}
static int
update(char **buffer, char *data, int count) {
int bytes;
size_t size;
if (*buffer) {
bytes = strlen(*buffer);
size = (count + bytes) + 1;
if (!(*buffer = realloc(*buffer, size)))
return (ERROR);
strcpy((*buffer + bytes), data);
}
else if (!(*buffer = strdup(data)))
return (ERROR);
return (SUCCESS);
}
static t_message
*get_message(char **buffer) {
char *message;
size_t size;
int bytes = strlen(*buffer);
char *delimiter = strchr(*buffer, ENDL);
char *rest;
if (!delimiter) return (NULL);
size = ((long unsigned int)delimiter - (long unsigned int)*buffer);
if (!(message = (char*)memalloc(sizeof(char) * (size + 1))))
return (NULL);
strncpy(message, *buffer, size);
while (*delimiter == ENDL) delimiter++;
rest = strdup(delimiter);
free(*buffer);
*buffer = rest;
return (parse_message(message));
}
t_message
*read_message(t_client *client) {
char data[BUFF_SIZE + 1] = { 0 };
size_t count;
t_message *message = NULL;
//client->is is a file descriptor
while ((count = recv(client->s, data, BUFF_SIZE, 0))) {
data[count] = '\0';
if (update(&client->buffer, data, count) != SUCCESS) return (NULL);
if ((message = get_message(&client->buffer))) return (message);
}
return (NULL);
}
typedefactually is. \$\endgroup\$