odyssey/sources/attribute.c

98 lines
1.7 KiB
C
Raw Normal View History

/*
* Odyssey.
*
* Scalable PostgreSQL connection pooler.
*/
#include <stddef.h>
2020-07-09 05:17:58 +00:00
#include <ctype.h>
static int
read_attribute_buf_after_key(char **data,
size_t *data_size,
char **out,
size_t *out_size)
{
char *data_end = *data + *data_size;
char *begin = *data;
char *end;
if (begin >= data_end || *begin != '=')
return -1;
begin++;
end = begin;
while (end < data_end && *end && *end != ',')
end++;
if (end < data_end) {
*data = end + 1;
} else {
*data = end;
}
*data_size = data_end - *data;
if (out)
*out = begin;
if (out_size)
*out_size = end - begin;
return 0;
}
int
read_attribute_buf(char **data,
size_t *data_size,
char attr_key,
char **out,
size_t *out_size)
{
if (!*data_size || **data != attr_key)
return -1;
char *new_data = *data + 1;
size_t new_data_size = *data_size - 1;
if (read_attribute_buf_after_key(
&new_data, &new_data_size, out, out_size) == -1)
return -1;
*data = new_data;
*data_size = new_data_size;
return 0;
}
int
read_any_attribute_buf(char **data,
size_t *data_size,
char *attribute_ptr,
char **out,
size_t *out_size)
{
if (!*data_size)
return -1;
char attribute = **data;
if (!isalpha(attribute))
return -1;
if (attribute_ptr != NULL)
*attribute_ptr = attribute;
char *new_data = *data + 1;
size_t new_data_size = *data_size - 1;
if (read_attribute_buf_after_key(
&new_data, &new_data_size, out, out_size) == -1)
return -1;
*data = new_data;
*data_size = new_data_size;
return 0;
}