diff --git a/src/adc/message.c b/src/adc/message.c index 52b2d33..1133352 100644 --- a/src/adc/message.c +++ b/src/adc/message.c @@ -532,6 +532,16 @@ struct adc_message* adc_msg_create(const char* line) return adc_msg_parse(line, strlen(line)); } +extern struct adc_message* adc_msg_construct_source(fourcc_t fourcc, sid_t source, size_t size) +{ + struct adc_message* msg = adc_msg_construct(fourcc, size + 4); + if (!msg) + return NULL; + + adc_msg_add_argument(msg, sid_to_string(source)); + msg->source = source; + return msg; +} struct adc_message* adc_msg_construct(fourcc_t fourcc, size_t size) { @@ -539,9 +549,7 @@ struct adc_message* adc_msg_construct(fourcc_t fourcc, size_t size) if (!msg) return NULL; /* OOM */ - if (size < sizeof(fourcc)) size = sizeof(fourcc); - - if (!adc_msg_grow(msg, size+1)) + if (!adc_msg_grow(msg, sizeof(fourcc) + size + 1)) { msg_free(msg); return NULL; /* OOM */ @@ -911,6 +919,42 @@ char* adc_msg_unescape(const char* string) return new_string; } +int adc_msg_unescape_to_target(const char* string, char* target, size_t target_size) +{ + size_t w = 0; + char* ptr = (char*) target; + char* str = (char*) string; + int escaped = 0; + + while (*str && w < (target_size-1)) + { + if (escaped) { + if (*str == 's') + *ptr++ = ' '; + else if (*str == '\\') + *ptr++ = '\\'; + else if (*str == 'n') + *ptr++ = '\n'; + else + *ptr++ = *str; + w++; + escaped = 0; + } else { + if (*str == '\\') + escaped = 1; + else + { + *ptr++ = *str; + w++; + } + } + str++; + } + *ptr = 0; + w++; + return w; +} + char* adc_msg_escape(const char* string) { char* str = hub_malloc(adc_msg_escape_length(string)+1); diff --git a/src/adc/message.h b/src/adc/message.h index cd4adc5..aaffde4 100644 --- a/src/adc/message.h +++ b/src/adc/message.h @@ -91,6 +91,12 @@ extern struct adc_message* adc_msg_create(const char* string); */ extern struct adc_message* adc_msg_construct(fourcc_t fourcc, size_t size); +/** + * Construct a message for the given 'fourcc' and add a source SID to it, + * in addition pre-allocate 'size' bytes at the end of the message. + */ +extern struct adc_message* adc_msg_construct_source(fourcc_t fourcc, sid_t source, size_t size); + /** * Remove a named argument from the command. * @@ -195,6 +201,14 @@ extern int adc_msg_add_named_argument_uint64(struct adc_message* cmd, const char */ extern char* adc_msg_unescape(const char* string); +/** + * Convert a ADC command escaped string to a regular string. + * @return The number of bytes written to target. If the target is not large enough then + * the -1 is returned, but the string is guaranteed to always be \0 terminated. + */ +extern int adc_msg_unescape_to_target(const char* string, char* target, size_t target_size); + + /** * Convert a string to a ADC command escaped string. * @return adc command escaped string or NULL if out of memory.