From af4299f15529c7bbb90c7c6e094ceb4c01cee25a Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Sat, 25 Nov 2017 17:21:26 -0600 Subject: [PATCH] A tiny bit more compact and straightforward? --- examples/test.c | 2 -- examples/test.c-e | 2 -- src/message.c | 75 ++++++++++++++++++++--------------------------- src/message.c-e | 75 ++++++++++++++++++++--------------------------- 4 files changed, 62 insertions(+), 92 deletions(-) diff --git a/examples/test.c b/examples/test.c index 7be8e4b..f5c9747 100644 --- a/examples/test.c +++ b/examples/test.c @@ -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; diff --git a/examples/test.c-e b/examples/test.c-e index 7be8e4b..f5c9747 100644 --- a/examples/test.c-e +++ b/examples/test.c-e @@ -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; diff --git a/src/message.c b/src/message.c index 2652578..79519f0 100644 --- a/src/message.c +++ b/src/message.c @@ -6,15 +6,7 @@ #include #include -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,17 +48,14 @@ 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; + 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) { - return -1; + struct part *part; + uint8_t bodysz = sizeof(size) + size; + + if ((part = malloc(sizeof(*part) + bodysz)) == NULL) { + goto error_malloc_part; } - message->size += sizeof(size) + size; + 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; } 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; diff --git a/src/message.c-e b/src/message.c-e index 2652578..79519f0 100644 --- a/src/message.c-e +++ b/src/message.c-e @@ -6,15 +6,7 @@ #include #include -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,17 +48,14 @@ 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; + 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) { - return -1; + struct part *part; + uint8_t bodysz = sizeof(size) + size; + + if ((part = malloc(sizeof(*part) + bodysz)) == NULL) { + goto error_malloc_part; } - message->size += sizeof(size) + size; + 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; } 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;