Skip to content

Instantly share code, notes, and snippets.

@matthewbauer
Created February 25, 2020 16:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matthewbauer/e137cdffbb0de0cc1d48ab5765a0d470 to your computer and use it in GitHub Desktop.
Save matthewbauer/e137cdffbb0de0cc1d48ab5765a0d470 to your computer and use it in GitHub Desktop.
// Generated by Molecule 0.5.0
#define MOLECULEC_VERSION 5000
#define MOLECULE_API_VERSION_MIN 5000
#include "molecule_reader.h"
#include "molecule_builder.h"
#ifndef CC_H
#define CC_H
#ifdef __cplusplus
#define _CPP_BEGIN extern "C" {
#define _CPP_END }
_CPP_BEGIN
#endif /* __cplusplus */
#ifndef MOLECULE_API_DECORATOR
#define __DEFINE_MOLECULE_API_DECORATOR_CC
#define MOLECULE_API_DECORATOR
#endif /* MOLECULE_API_DECORATOR */
#include "../../a/a.h"
#include "../../b/b.h"
#include "../../b/bb/bb.h"
#include "../../b/bc/bc.h"
#include "../c.h"
/*
* Reader APIs
*/
MOLECULE_API_DECORATOR mol_errno MolReader_CC_verify (const mol_seg_t*, bool);
#define MolReader_CC_actual_field_count(s) mol_table_actual_field_count(s)
#define MolReader_CC_has_extra_fields(s) mol_table_has_extra_fields(s, 5)
#define MolReader_CC_get_a(s) mol_table_slice_by_index(s, 0)
#define MolReader_CC_get_b(s) mol_table_slice_by_index(s, 1)
#define MolReader_CC_get_c(s) mol_table_slice_by_index(s, 2)
#define MolReader_CC_get_bb(s) mol_table_slice_by_index(s, 3)
#define MolReader_CC_get_bc(s) mol_table_slice_by_index(s, 4)
/*
* Builder APIs
*/
#define MolBuilder_CC_init(b) mol_table_builder_initialize(b, 1024, 5)
#define MolBuilder_CC_set_a(b, p, l) mol_table_builder_add(b, 0, p, l)
#define MolBuilder_CC_set_b(b, p, l) mol_table_builder_add(b, 1, p, l)
#define MolBuilder_CC_set_c(b, p, l) mol_table_builder_add(b, 2, p, l)
#define MolBuilder_CC_set_bb(b, p, l) mol_table_builder_add(b, 3, p, l)
#define MolBuilder_CC_set_bc(b, p, l) mol_table_builder_add(b, 4, p, l)
MOLECULE_API_DECORATOR mol_seg_res_t MolBuilder_CC_build (mol_builder_t);
#define MolBuilder_CC_clear(b) mol_builder_discard(b)
/*
* Default Value
*/
#define ____ 0x00
MOLECULE_API_DECORATOR const uint8_t MolDefault_CC[188] = {
0xbc, ____, ____, ____, 0x18, ____, ____, ____, 0x1c, ____, ____, ____,
0x28, ____, ____, ____, 0x44, ____, ____, ____, 0x60, ____, ____, ____,
0x04, ____, ____, ____, 0x0c, ____, ____, ____, 0x08, ____, ____, ____,
0x04, ____, ____, ____, 0x1c, ____, ____, ____, 0x0c, ____, ____, ____,
0x10, ____, ____, ____, 0x04, ____, ____, ____, 0x0c, ____, ____, ____,
0x08, ____, ____, ____, 0x04, ____, ____, ____, 0x1c, ____, ____, ____,
0x0c, ____, ____, ____, 0x10, ____, ____, ____, 0x04, ____, ____, ____,
0x0c, ____, ____, ____, 0x08, ____, ____, ____, 0x04, ____, ____, ____,
0x5c, ____, ____, ____, 0x14, ____, ____, ____, 0x18, ____, ____, ____,
0x24, ____, ____, ____, 0x40, ____, ____, ____, 0x04, ____, ____, ____,
0x0c, ____, ____, ____, 0x08, ____, ____, ____, 0x04, ____, ____, ____,
0x1c, ____, ____, ____, 0x0c, ____, ____, ____, 0x10, ____, ____, ____,
0x04, ____, ____, ____, 0x0c, ____, ____, ____, 0x08, ____, ____, ____,
0x04, ____, ____, ____, 0x1c, ____, ____, ____, 0x0c, ____, ____, ____,
0x10, ____, ____, ____, 0x04, ____, ____, ____, 0x0c, ____, ____, ____,
0x08, ____, ____, ____, 0x04, ____, ____, ____,
};
#undef ____
/*
* Reader Functions
*/
MOLECULE_API_DECORATOR mol_errno MolReader_CC_verify (const mol_seg_t *input, bool compatible) {
if (input->size < MOL_NUM_T_SIZE) {
return MOL_ERR_HEADER;
}
uint8_t *ptr = input->ptr;
mol_num_t total_size = mol_unpack_number(ptr);
if (input->size != total_size) {
return MOL_ERR_TOTAL_SIZE;
}
if (input->size < MOL_NUM_T_SIZE * 2) {
return MOL_ERR_HEADER;
}
ptr += MOL_NUM_T_SIZE;
mol_num_t offset = mol_unpack_number(ptr);
if (offset % 4 > 0 || offset < MOL_NUM_T_SIZE*2) {
return MOL_ERR_OFFSET;
}
mol_num_t field_count = offset / 4 - 1;
if (field_count < 5) {
return MOL_ERR_FIELD_COUNT;
} else if (!compatible && field_count > 5) {
return MOL_ERR_FIELD_COUNT;
}
if (input->size < MOL_NUM_T_SIZE*(field_count+1)){
return MOL_ERR_HEADER;
}
mol_num_t offsets[field_count+1];
offsets[0] = offset;
for (mol_num_t i=1; i<field_count; i++) {
ptr += MOL_NUM_T_SIZE;
offsets[i] = mol_unpack_number(ptr);
if (offsets[i-1] > offsets[i]) {
return MOL_ERR_OFFSET;
}
}
if (offsets[field_count-1] > total_size) {
return MOL_ERR_OFFSET;
}
offsets[field_count] = total_size;
mol_seg_t inner;
mol_errno errno;
inner.ptr = input->ptr + offsets[0];
inner.size = offsets[1] - offsets[0];
errno = MolReader_A_verify(&inner, compatible);
if (errno != MOL_OK) {
return MOL_ERR_DATA;
}
inner.ptr = input->ptr + offsets[1];
inner.size = offsets[2] - offsets[1];
errno = MolReader_B_verify(&inner, compatible);
if (errno != MOL_OK) {
return MOL_ERR_DATA;
}
inner.ptr = input->ptr + offsets[2];
inner.size = offsets[3] - offsets[2];
errno = MolReader_C_verify(&inner, compatible);
if (errno != MOL_OK) {
return MOL_ERR_DATA;
}
inner.ptr = input->ptr + offsets[3];
inner.size = offsets[4] - offsets[3];
errno = MolReader_BB_verify(&inner, compatible);
if (errno != MOL_OK) {
return MOL_ERR_DATA;
}
inner.ptr = input->ptr + offsets[4];
inner.size = offsets[5] - offsets[4];
errno = MolReader_BC_verify(&inner, compatible);
if (errno != MOL_OK) {
return MOL_ERR_DATA;
}
return MOL_OK;
}
/*
* Builder Functions
*/
MOLECULE_API_DECORATOR mol_seg_res_t MolBuilder_CC_build (mol_builder_t builder) {
mol_seg_res_t res;
res.errno = MOL_OK;
mol_num_t offset = 24;
mol_num_t len;
res.seg.size = offset;
len = builder.number_ptr[1];
res.seg.size += len == 0 ? 4 : len;
len = builder.number_ptr[3];
res.seg.size += len == 0 ? 12 : len;
len = builder.number_ptr[5];
res.seg.size += len == 0 ? 28 : len;
len = builder.number_ptr[7];
res.seg.size += len == 0 ? 28 : len;
len = builder.number_ptr[9];
res.seg.size += len == 0 ? 92 : len;
res.seg.ptr = (uint8_t*)malloc(res.seg.size);
uint8_t *dst = res.seg.ptr;
mol_pack_number(dst, &res.seg.size);
dst += MOL_NUM_T_SIZE;
mol_pack_number(dst, &offset);
dst += MOL_NUM_T_SIZE;
len = builder.number_ptr[1];
offset += len == 0 ? 4 : len;
mol_pack_number(dst, &offset);
dst += MOL_NUM_T_SIZE;
len = builder.number_ptr[3];
offset += len == 0 ? 12 : len;
mol_pack_number(dst, &offset);
dst += MOL_NUM_T_SIZE;
len = builder.number_ptr[5];
offset += len == 0 ? 28 : len;
mol_pack_number(dst, &offset);
dst += MOL_NUM_T_SIZE;
len = builder.number_ptr[7];
offset += len == 0 ? 28 : len;
mol_pack_number(dst, &offset);
dst += MOL_NUM_T_SIZE;
len = builder.number_ptr[9];
offset += len == 0 ? 92 : len;
uint8_t *src = builder.data_ptr;
len = builder.number_ptr[1];
if (len == 0) {
len = 4;
memcpy(dst, &MolDefault_A, len);
} else {
mol_num_t of = builder.number_ptr[0];
memcpy(dst, src+of, len);
}
dst += len;
len = builder.number_ptr[3];
if (len == 0) {
len = 12;
memcpy(dst, &MolDefault_B, len);
} else {
mol_num_t of = builder.number_ptr[2];
memcpy(dst, src+of, len);
}
dst += len;
len = builder.number_ptr[5];
if (len == 0) {
len = 28;
memcpy(dst, &MolDefault_C, len);
} else {
mol_num_t of = builder.number_ptr[4];
memcpy(dst, src+of, len);
}
dst += len;
len = builder.number_ptr[7];
if (len == 0) {
len = 28;
memcpy(dst, &MolDefault_BB, len);
} else {
mol_num_t of = builder.number_ptr[6];
memcpy(dst, src+of, len);
}
dst += len;
len = builder.number_ptr[9];
if (len == 0) {
len = 92;
memcpy(dst, &MolDefault_BC, len);
} else {
mol_num_t of = builder.number_ptr[8];
memcpy(dst, src+of, len);
}
dst += len;
mol_builder_discard(builder);
return res;
}
#ifdef __DEFINE_MOLECULE_API_DECORATOR_CC
#undef MOLECULE_API_DECORATOR
#undef __DEFINE_MOLECULE_API_DECORATOR_CC
#endif /* __DEFINE_MOLECULE_API_DECORATOR_CC */
#ifdef __cplusplus
_CPP_END
#undef _CPP_BEGIN
#undef _CPP_END
#endif /* __cplusplus */
#endif /* CC_H */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment