Added more complete API for dealing with ADC messages.
- Added a construct method which would take a fourcc and a source. - Added an unescape function that would write into pre-allocated memory.
This commit is contained in:
parent
fc52f0e030
commit
a599b29b9d
@ -532,6 +532,16 @@ struct adc_message* adc_msg_create(const char* line)
|
|||||||
return adc_msg_parse(line, strlen(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)
|
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)
|
if (!msg)
|
||||||
return NULL; /* OOM */
|
return NULL; /* OOM */
|
||||||
|
|
||||||
if (size < sizeof(fourcc)) size = sizeof(fourcc);
|
if (!adc_msg_grow(msg, sizeof(fourcc) + size + 1))
|
||||||
|
|
||||||
if (!adc_msg_grow(msg, size+1))
|
|
||||||
{
|
{
|
||||||
msg_free(msg);
|
msg_free(msg);
|
||||||
return NULL; /* OOM */
|
return NULL; /* OOM */
|
||||||
@ -911,6 +919,42 @@ char* adc_msg_unescape(const char* string)
|
|||||||
return new_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* adc_msg_escape(const char* string)
|
||||||
{
|
{
|
||||||
char* str = hub_malloc(adc_msg_escape_length(string)+1);
|
char* str = hub_malloc(adc_msg_escape_length(string)+1);
|
||||||
|
@ -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);
|
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.
|
* 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);
|
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.
|
* Convert a string to a ADC command escaped string.
|
||||||
* @return adc command escaped string or NULL if out of memory.
|
* @return adc command escaped string or NULL if out of memory.
|
||||||
|
Loading…
Reference in New Issue
Block a user