cwist
Modern C web framework with libttak runtime
Loading...
Searching...
No Matches
protobuf.h
Go to the documentation of this file.
1
6#ifndef __CWIST_PROTOBUF_H__
7#define __CWIST_PROTOBUF_H__
8
9#include <stddef.h>
10#include <stdint.h>
11#include <string.h>
12
13#ifdef __cplusplus
14extern "C" {
15#endif
16
23
25#define CWIST_PB_MAX_FIELD_NUMBER 536870911u
26
27typedef struct cwist_pb_writer {
28 uint8_t *data;
29 size_t len;
30 size_t cap;
32
33typedef struct cwist_pb_reader {
34 const uint8_t *data;
35 size_t len;
36 size_t pos;
38
39typedef struct cwist_pb_field {
40 uint32_t number;
42 uint64_t varint;
43 const uint8_t *bytes;
44 size_t len;
46
49int cwist_pb_writer_reserve(cwist_pb_writer *w, size_t extra);
50int cwist_pb_write_varint(cwist_pb_writer *w, uint64_t value);
51int cwist_pb_write_key(cwist_pb_writer *w, uint32_t field_number, cwist_pb_wire_type_t wire_type);
52int cwist_pb_write_uint64_field(cwist_pb_writer *w, uint32_t field_number, uint64_t value);
53int cwist_pb_write_int64_field(cwist_pb_writer *w, uint32_t field_number, int64_t value);
54int cwist_pb_write_bool_field(cwist_pb_writer *w, uint32_t field_number, int value);
55int cwist_pb_write_raw32(cwist_pb_writer *w, uint32_t value);
56int cwist_pb_write_raw64(cwist_pb_writer *w, uint64_t value);
57int cwist_pb_write_fixed32_field(cwist_pb_writer *w, uint32_t field_number, uint32_t value);
58int cwist_pb_write_fixed64_field(cwist_pb_writer *w, uint32_t field_number, uint64_t value);
59int cwist_pb_write_float_field(cwist_pb_writer *w, uint32_t field_number, float value);
60int cwist_pb_write_double_field(cwist_pb_writer *w, uint32_t field_number, double value);
61int cwist_pb_write_bytes_field(cwist_pb_writer *w, uint32_t field_number, const void *data,
62 size_t len);
63int cwist_pb_write_string_field(cwist_pb_writer *w, uint32_t field_number, const char *value);
64
65static inline uint32_t cwist_pb_load32_le(const uint8_t *p) {
66 return (uint32_t)p[0] | ((uint32_t)p[1] << 8) | ((uint32_t)p[2] << 16) | ((uint32_t)p[3] << 24);
67}
68
69static inline uint64_t cwist_pb_load64_le(const uint8_t *p) {
70 return (uint64_t)cwist_pb_load32_le(p) | ((uint64_t)cwist_pb_load32_le(p + 4) << 32);
71}
72
73static inline uint32_t cwist_pb_float_bits(float value) {
74 uint32_t bits;
75 memcpy(&bits, &value, sizeof(bits));
76 return bits;
77}
78
79static inline uint64_t cwist_pb_double_bits(double value) {
80 uint64_t bits;
81 memcpy(&bits, &value, sizeof(bits));
82 return bits;
83}
84
85static inline float cwist_pb_load_float(const uint8_t *p) {
86 uint32_t bits = cwist_pb_load32_le(p);
87 float value;
88 memcpy(&value, &bits, sizeof(value));
89 return value;
90}
91
92static inline double cwist_pb_load_double(const uint8_t *p) {
93 uint64_t bits = cwist_pb_load64_le(p);
94 double value;
95 memcpy(&value, &bits, sizeof(value));
96 return value;
97}
98
99void cwist_pb_reader_init(cwist_pb_reader *r, const void *data, size_t len);
100int cwist_pb_read_varint(cwist_pb_reader *r, uint64_t *out);
103
104uint64_t cwist_pb_zigzag_encode(int64_t value);
105int64_t cwist_pb_zigzag_decode(uint64_t value);
106
107#ifdef __cplusplus
108}
109#endif
110
111#endif
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).
Definition protobuf.c:179
uint64_t cwist_pb_zigzag_encode(int64_t value)
ZigZag-encode a signed 64-bit value for sint fields.
Definition protobuf.c:344
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.
Definition protobuf.c:202
void cwist_pb_reader_init(cwist_pb_reader *r, const void *data, size_t len)
Initialize a reader over a caller-owned buffer.
Definition protobuf.c:244
int cwist_pb_write_raw64(cwist_pb_writer *w, uint64_t value)
Append a 64-bit value in little-endian order (no key written).
Definition protobuf.c:153
int cwist_pb_write_uint64_field(cwist_pb_writer *w, uint32_t field_number, uint64_t value)
Write a uint64 field as a varint.
Definition protobuf.c:104
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.
Definition protobuf.c:191
int cwist_pb_writer_reserve(cwist_pb_writer *w, size_t extra)
Ensure the writer buffer has room for extra more bytes.
Definition protobuf.c:42
enum cwist_pb_wire_type cwist_pb_wire_type_t
cwist_pb_wire_type
Definition protobuf.h:17
@ CWIST_PB_VARINT
Definition protobuf.h:18
@ CWIST_PB_LEN
Definition protobuf.h:20
@ CWIST_PB_64BIT
Definition protobuf.h:19
@ CWIST_PB_32BIT
Definition protobuf.h:21
void cwist_pb_writer_free(cwist_pb_writer *w)
Release the buffer owned by a Protobuf writer.
Definition protobuf.c:28
int cwist_pb_read_varint(cwist_pb_reader *r, uint64_t *out)
Read a base-128 varint, advancing the reader position.
Definition protobuf.c:258
void cwist_pb_writer_init(cwist_pb_writer *w)
Initialize a Protobuf writer to an empty buffer.
Definition protobuf.c:17
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.
Definition protobuf.c:116
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).
Definition protobuf.c:167
int cwist_pb_read_field(cwist_pb_reader *r, cwist_pb_field *field)
Read the next field key and payload from the reader.
Definition protobuf.c:284
int cwist_pb_write_raw32(cwist_pb_writer *w, uint32_t value)
Append a 32-bit value in little-endian order (no key written).
Definition protobuf.c:137
int cwist_pb_skip_field(cwist_pb_reader *r, const cwist_pb_field *field)
Validate a parsed field descriptor.
Definition protobuf.c:333
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).
Definition protobuf.c:215
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.
Definition protobuf.c:127
int cwist_pb_write_varint(cwist_pb_writer *w, uint64_t value)
Append a base-128 varint to the writer buffer.
Definition protobuf.c:69
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).
Definition protobuf.c:233
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.
Definition protobuf.c:87
int64_t cwist_pb_zigzag_decode(uint64_t value)
ZigZag-decode an unsigned 64-bit value back to a signed value.
Definition protobuf.c:355
uint32_t number
Definition protobuf.h:40
const uint8_t * bytes
Definition protobuf.h:43
uint64_t varint
Definition protobuf.h:42
cwist_pb_wire_type_t wire_type
Definition protobuf.h:41
const uint8_t * data
Definition protobuf.h:34
uint8_t * data
Definition protobuf.h:28