A tiny bit more compact and straightforward?

This commit is contained in:
XANTRONIX Development 2017-11-25 17:21:26 -06:00
parent 9e92c2b05b
commit af4299f155
4 changed files with 62 additions and 92 deletions

View file

@ -16,8 +16,6 @@ static int answer_phone_version_message(skipstone_message_service *service,
1, 0xff, 0xff, 0xff, 0xff, 0x80, 0, 0, 0, 0, 0, 0, 0x32
};
printf("Got message on endpoint %hu\n", id);
skipstone_message_service_queue(service, &response, sizeof(response), id);
return 0;

View file

@ -16,8 +16,6 @@ static int answer_phone_version_message(skipstone_message_service *service,
1, 0xff, 0xff, 0xff, 0xff, 0x80, 0, 0, 0, 0, 0, 0, 0x32
};
printf("Got message on endpoint %hu\n", id);
skipstone_message_service_queue(service, &response, sizeof(response), id);
return 0;

View file

@ -6,15 +6,7 @@
#include <skipstone/queue.h>
#include <skipstone/message.h>
enum part_type {
SKIPSTONE_MESSAGE_PART_STRING,
SKIPSTONE_MESSAGE_PART_UINT8,
SKIPSTONE_MESSAGE_PART_UINT16
};
struct part {
enum part_type type;
enum skipstone_message_endianness endianness;
uint8_t size;
};
@ -56,16 +48,13 @@ error_malloc_message:
return NULL;
}
static int append_part(skipstone_message *message,
void *buf, uint8_t size, enum part_type type) {
static int append_part(skipstone_message *message, void *buf, uint8_t size) {
struct part *part;
if ((part = malloc(sizeof(*part) + size)) == NULL) {
goto error_malloc_part;
}
part->type = type;
part->endianness = SKIPSTONE_MESSAGE_ENDIAN_LITTLE;
part->size = size;
memcpy(part + 1, buf, size);
@ -85,17 +74,35 @@ error_malloc_part:
int skipstone_message_append_string(skipstone_message *message,
char *string, uint8_t size) {
if (append_part(message, string, size, SKIPSTONE_MESSAGE_PART_STRING) < 0) {
struct part *part;
uint8_t bodysz = sizeof(size) + size;
if ((part = malloc(sizeof(*part) + bodysz)) == NULL) {
goto error_malloc_part;
}
part->size = bodysz;
memcpy(part + 1, &size, sizeof(size));
memcpy(((uint8_t *)(part + 1)) + sizeof(size), string, size);
if (skipstone_queue_add(message->parts, part) < 0) {
goto error_queue_add_part;
}
message->size += bodysz;
return 0;
error_queue_add_part:
free(part);
error_malloc_part:
return -1;
}
message->size += sizeof(size) + size;
return 0;
}
int skipstone_message_append_uint8(skipstone_message *message, uint8_t value) {
if (append_part(message, &value, sizeof(value), SKIPSTONE_MESSAGE_PART_UINT8) < 0) {
if (append_part(message, &value, sizeof(value)) < 0) {
return -1;
}
@ -105,7 +112,7 @@ int skipstone_message_append_uint8(skipstone_message *message, uint8_t value) {
}
int skipstone_message_append_uint16(skipstone_message *message, uint16_t value) {
if (append_part(message, &value, sizeof(value), SKIPSTONE_MESSAGE_PART_UINT16) < 0) {
if (append_part(message, &value, sizeof(value)) < 0) {
return -1;
}
@ -120,34 +127,14 @@ int skipstone_message_pack(skipstone_message *message,
struct part *part;
if (message->size > SKIPSTONE_MESSAGE_MAX_PAYLOAD) {
return -1;
}
while (skipstone_queue_remove(message->parts, (void **)&part)) {
switch (part->type) {
case SKIPSTONE_MESSAGE_PART_STRING: {
((uint8_t *)buf)[offset] = part->size;
memcpy(((uint8_t *)buf) + offset, part + 1, part->size);
memcpy((uint8_t *)buf + offset + sizeof(uint8_t), part + 1, part->size);
offset += sizeof(uint8_t) + part->size;
break;
}
case SKIPSTONE_MESSAGE_PART_UINT8: {
((uint8_t *)buf)[offset] = ((uint8_t *)(part + 1))[0];
offset += sizeof(uint8_t);
break;
}
case SKIPSTONE_MESSAGE_PART_UINT16: {
((uint16_t *)((uint8_t *)buf + offset))[0] = ((uint16_t *)(part + 1))[0];
offset += sizeof(uint16_t);
break;
}
}
offset += part->size;
}
*size = offset;

View file

@ -6,15 +6,7 @@
#include <skipstone/queue.h>
#include <skipstone/message.h>
enum part_type {
SKIPSTONE_MESSAGE_PART_STRING,
SKIPSTONE_MESSAGE_PART_UINT8,
SKIPSTONE_MESSAGE_PART_UINT16
};
struct part {
enum part_type type;
enum skipstone_message_endianness endianness;
uint8_t size;
};
@ -56,16 +48,13 @@ error_malloc_message:
return NULL;
}
static int append_part(skipstone_message *message,
void *buf, uint8_t size, enum part_type type) {
static int append_part(skipstone_message *message, void *buf, uint8_t size) {
struct part *part;
if ((part = malloc(sizeof(*part) + size)) == NULL) {
goto error_malloc_part;
}
part->type = type;
part->endianness = SKIPSTONE_MESSAGE_ENDIAN_LITTLE;
part->size = size;
memcpy(part + 1, buf, size);
@ -85,17 +74,35 @@ error_malloc_part:
int skipstone_message_append_string(skipstone_message *message,
char *string, uint8_t size) {
if (append_part(message, string, size, SKIPSTONE_MESSAGE_PART_STRING) < 0) {
struct part *part;
uint8_t bodysz = sizeof(size) + size;
if ((part = malloc(sizeof(*part) + bodysz)) == NULL) {
goto error_malloc_part;
}
part->size = bodysz;
memcpy(part + 1, &size, sizeof(size));
memcpy(((uint8_t *)(part + 1)) + sizeof(size), string, size);
if (skipstone_queue_add(message->parts, part) < 0) {
goto error_queue_add_part;
}
message->size += bodysz;
return 0;
error_queue_add_part:
free(part);
error_malloc_part:
return -1;
}
message->size += sizeof(size) + size;
return 0;
}
int skipstone_message_append_uint8(skipstone_message *message, uint8_t value) {
if (append_part(message, &value, sizeof(value), SKIPSTONE_MESSAGE_PART_UINT8) < 0) {
if (append_part(message, &value, sizeof(value)) < 0) {
return -1;
}
@ -105,7 +112,7 @@ int skipstone_message_append_uint8(skipstone_message *message, uint8_t value) {
}
int skipstone_message_append_uint16(skipstone_message *message, uint16_t value) {
if (append_part(message, &value, sizeof(value), SKIPSTONE_MESSAGE_PART_UINT16) < 0) {
if (append_part(message, &value, sizeof(value)) < 0) {
return -1;
}
@ -120,34 +127,14 @@ int skipstone_message_pack(skipstone_message *message,
struct part *part;
if (message->size > SKIPSTONE_MESSAGE_MAX_PAYLOAD) {
return -1;
}
while (skipstone_queue_remove(message->parts, (void **)&part)) {
switch (part->type) {
case SKIPSTONE_MESSAGE_PART_STRING: {
((uint8_t *)buf)[offset] = part->size;
memcpy(((uint8_t *)buf) + offset, part + 1, part->size);
memcpy((uint8_t *)buf + offset + sizeof(uint8_t), part + 1, part->size);
offset += sizeof(uint8_t) + part->size;
break;
}
case SKIPSTONE_MESSAGE_PART_UINT8: {
((uint8_t *)buf)[offset] = ((uint8_t *)(part + 1))[0];
offset += sizeof(uint8_t);
break;
}
case SKIPSTONE_MESSAGE_PART_UINT16: {
((uint16_t *)((uint8_t *)buf + offset))[0] = ((uint16_t *)(part + 1))[0];
offset += sizeof(uint16_t);
break;
}
}
offset += part->size;
}
*size = offset;