bser_private.h (81 lines of code) (raw):

#ifndef LIBWATCHMAN_BSER_PRIVATE_H_ #define LIBWATCHMAN_BSER_PRIVATE_H_ #include <stdint.h> #include <stdlib.h> enum { BSER_TAG_ARRAY = 0x00, BSER_TAG_OBJECT = 0x01, BSER_TAG_STRING = 0x02, BSER_TAG_INT8 = 0x03, BSER_TAG_INT16 = 0x04, BSER_TAG_INT32 = 0x05, BSER_TAG_INT64 = 0x06, BSER_TAG_REAL = 0x07, BSER_TAG_TRUE = 0x08, BSER_TAG_FALSE = 0x09, BSER_TAG_NULL = 0x0a, BSER_TAG_COMPACT_ARRAY = 0x0b, BSER_TAG_NO_FIELD = 0x0c, BSER_TAG_UNPARSED = 0x0d, BSER_TAG_ERROR = 0x0e, BSER_NUM_TAGS = 0x0f }; typedef struct bser_buffer { void* data; size_t datalen; size_t cursor; } bser_buffer_t; struct bser_key_value_pair; struct bser_buffer; typedef struct bser { uint8_t type; union { int64_t integer; double real; struct { const char* chars; size_t length; } string; struct { struct bser* elements; size_t length; } array; struct { struct bser_key_value_pair* fields; size_t length; } object; struct bser_buffer* unparsed; const char* error_message; } value; } bser_t; typedef struct bser_key_value_pair { struct bser key; struct bser value; } bser_key_value_pair_t; static inline bser_t* bser_alloc(void) { return (bser_t*)malloc(sizeof(bser_t)); } void bser_parse_generic(bser_t* fill, struct bser_buffer* buffer); static inline void bser_parse_if_necessary(bser_t* bser) { if (bser->type == BSER_TAG_UNPARSED) { bser_parse_generic(bser, bser->value.unparsed); } } static inline int bser_is_unparsed(bser_t* bser) { return bser->type == BSER_TAG_UNPARSED; } static inline int bser_is_no_field(bser_t* bser) { return bser->type == BSER_TAG_NO_FIELD; } void bser_parse_array_elements_to(struct bser* array, size_t limit); void bser_parse_object_fields_to(struct bser* array, size_t limit); static inline bser_key_value_pair_t* bser_object_pair_at( struct bser* bser, size_t index) { return &bser->value.object.fields[index]; } #endif /* ndef LIBWATCHMAN_BSER_PRIVATE_H_ */