48 size_t cap =
w->cap ?
w->cap : 64;
72 while (value >= 0x80) {
73 w->data[
w->len++] = (
uint8_t)(value | 0x80);
141 w->data[
w->len++] = (
uint8_t)(value >> 8);
142 w->data[
w->len++] = (
uint8_t)(value >> 16);
143 w->data[
w->len++] = (
uint8_t)(value >> 24);
156 for (
unsigned i = 0;
i < 8;
i++)
w->data[
w->len++] = (
uint8_t)(value >> (
i * 8));
217 if (!
w || (len > 0 && !data))
return -1;
221 if (len > 0)
memcpy(
w->data +
w->len, data, len);
234 if (!value)
return -1;
259 if (!r || !out)
return -1;
265 if ((
byte & 0x80) == 0) {
285 if (!r || !field || r->
pos >= r->
len)
return 0;
286 memset(field, 0,
sizeof(*field));
310 if (r->
len - r->
pos < 4)
return -1;
316 if (r->
len - r->
pos < 8)
return -1;
335 return field ? 0 : -1;
Memory allocation wrappers backed by libttak.
void cwist_free(void *ptr)
Free memory obtained via cwist_alloc/cwist_strdup/etc.
void * cwist_realloc(void *ptr, size_t new_size)
Resize an existing allocation (libttak tracked).
int cwist_pb_write_fixed64_field(cwist_pb_writer *w, uint32_t field_number, uint64_t value)
Write a fixed64 field (key plus 8 little-endian bytes).
uint64_t cwist_pb_zigzag_encode(int64_t value)
ZigZag-encode a signed 64-bit value for sint fields.
int cwist_pb_write_double_field(cwist_pb_writer *w, uint32_t field_number, double value)
Write a double field by reinterpreting it as fixed64 bits.
void cwist_pb_reader_init(cwist_pb_reader *r, const void *data, size_t len)
Initialize a reader over a caller-owned buffer.
int cwist_pb_write_raw64(cwist_pb_writer *w, uint64_t value)
Append a 64-bit value in little-endian order (no key written).
int cwist_pb_write_uint64_field(cwist_pb_writer *w, uint32_t field_number, uint64_t value)
Write a uint64 field as a varint.
int cwist_pb_write_float_field(cwist_pb_writer *w, uint32_t field_number, float value)
Write a float field by reinterpreting it as fixed32 bits.
int cwist_pb_writer_reserve(cwist_pb_writer *w, size_t extra)
Ensure the writer buffer has room for extra more bytes.
void cwist_pb_writer_free(cwist_pb_writer *w)
Release the buffer owned by a Protobuf writer.
int cwist_pb_read_varint(cwist_pb_reader *r, uint64_t *out)
Read a base-128 varint, advancing the reader position.
void cwist_pb_writer_init(cwist_pb_writer *w)
Initialize a Protobuf writer to an empty buffer.
int cwist_pb_write_int64_field(cwist_pb_writer *w, uint32_t field_number, int64_t value)
Write an int64 field; negative values are encoded as ten-byte varints.
int cwist_pb_write_fixed32_field(cwist_pb_writer *w, uint32_t field_number, uint32_t value)
Write a fixed32 field (key plus 4 little-endian bytes).
int cwist_pb_read_field(cwist_pb_reader *r, cwist_pb_field *field)
Read the next field key and payload from the reader.
int cwist_pb_write_raw32(cwist_pb_writer *w, uint32_t value)
Append a 32-bit value in little-endian order (no key written).
int cwist_pb_skip_field(cwist_pb_reader *r, const cwist_pb_field *field)
Validate a parsed field descriptor.
int cwist_pb_write_bytes_field(cwist_pb_writer *w, uint32_t field_number, const void *data, size_t len)
Write a length-delimited bytes field (key, length varint, raw bytes).
int cwist_pb_write_bool_field(cwist_pb_writer *w, uint32_t field_number, int value)
Write a bool field as a 0/1 varint.
int cwist_pb_write_varint(cwist_pb_writer *w, uint64_t value)
Append a base-128 varint to the writer buffer.
int cwist_pb_write_string_field(cwist_pb_writer *w, uint32_t field_number, const char *value)
Write a string field (length-delimited, excluding the NUL terminator).
int cwist_pb_write_key(cwist_pb_writer *w, uint32_t field_number, cwist_pb_wire_type_t wire_type)
Write a field key (field number and wire type) as a varint.
int64_t cwist_pb_zigzag_decode(uint64_t value)
ZigZag-decode an unsigned 64-bit value back to a signed value.
Small Protobuf wire-format reader/writer helpers.
enum cwist_pb_wire_type cwist_pb_wire_type_t
#define CWIST_PB_MAX_FIELD_NUMBER
cwist_pb_wire_type_t wire_type