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