Demo C Compilation
April 2, 2017 ยท View on GitHub
// Code generated by colf(1); DO NOT EDIT. // The compiler used schema file demo.colf for package demo.
#include "Colfer.h" #include <errno.h> #include <stdlib.h>
#if defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN ||
defined(BIG_ENDIAN) ||
defined(ARMEB) ||
defined(AARCH64EB) ||
defined(_MIPSEB) || defined(__MIPSEB) || defined(MIPSEB) ||
defined(SYSC_ZARCH)
#define COLFER_ENDIAN
#endif
size_t colfer_size_max = 16 * 1024 * 1024; size_t colfer_list_max = 64 * 1024;
size_t demo_course_marshal_len(const demo_course* o) { size_t l = 1;
{
uint_fast64_t x = o->ID;
if (x) {
if (x >= (uint_fast64_t) 1 << 49) l += 9;
else for (l += 2; x > 127; x >>= 7, ++l);
}
}
{
size_t n = o->name.len;
if (n > colfer_size_max) {
errno = EFBIG;
return 0;
}
if (n) for (l += 2 + n; n > 127; n >>= 7, ++l);
}
{
size_t n = o->holes.len;
if (n) {
if (n > colfer_list_max) {
errno = EFBIG;
return 0;
}
demo_hole* a = o->holes.list;
for (size_t i = 0; i < n; ++i) l += demo_hole_marshal_len(&a[i]);
for (l += 2; n > 127; n >>= 7, ++l);
if (l > colfer_size_max) {
errno = EFBIG;
return 0;
}
}
}
{
size_t n = o->image.len;
if (n > colfer_size_max) {
errno = EFBIG;
return 0;
}
if (n) for (l += 2 + n; n > 127; n >>= 7, ++l);
}
{
size_t n = o->tags.len;
if (n) {
if (n > colfer_list_max) {
errno = EFBIG;
return 0;
}
colfer_text* a = o->tags.list;
for (size_t i = 0; i < n; ++i) {
size_t len = a[i].len;
if (len > colfer_size_max) {
errno = EFBIG;
return 0;
}
for (l += len + 1; len > 127; len >>= 7, ++l);
}
for (l += 2; n > 127; n >>= 7, ++l);
if (l > colfer_size_max) {
errno = EFBIG;
return 0;
}
}
}
if (l > colfer_size_max) {
errno = EFBIG;
return 0;
}
return l;
}
size_t demo_course_marshal(const demo_course* o, void* buf) { // octet pointer navigation uint8_t* p = buf;
{
uint_fast64_t x = o->ID;
if (x) {
if (x < (uint_fast64_t) 1 << 49) {
*p++ = 0;
for (; x >= 128; x >>= 7) *p++ = x | 128;
*p++ = x;
} else {
*p++ = 0 | 128;
#ifdef COLFER_ENDIAN memcpy(p, &o->ID, 8); p += 8; #else *p++ = x >> 56; *p++ = x >> 48; *p++ = x >> 40; *p++ = x >> 32; *p++ = x >> 24; *p++ = x >> 16; *p++ = x >> 8; *p++ = x; #endif } } }
{
size_t n = o->name.len;
if (n) {
*p++ = 1;
uint_fast32_t x = n;
for (; x >= 128; x >>= 7) *p++ = x | 128;
*p++ = x;
memcpy(p, o->name.utf8, n);
p += n;
}
}
{
size_t n = o->holes.len;
if (n) {
*p++ = 2;
uint_fast32_t x = n;
for (; x >= 128; x >>= 7) *p++ = x | 128;
*p++ = x;
demo_hole* a = o->holes.list;
for (size_t i = 0; i < n; ++i) p += demo_hole_marshal(&a[i], p);
}
}
{
size_t n = o->image.len;
if (n) {
*p++ = 3;
uint_fast32_t x = n;
for (; x >= 128; x >>= 7) *p++ = x | 128;
*p++ = x;
memcpy(p, o->image.octets, n);
p += n;
}
}
{
size_t count = o->tags.len;
if (count) {
*p++ = 4;
uint_fast32_t x = count;
for (; x >= 128; x >>= 7) *p++ = x | 128;
*p++ = x;
colfer_text* text = o->tags.list;
do {
size_t n = text->len;
for (x = n; x >= 128; x >>= 7) *p++ = x | 128;
*p++ = x;
memcpy(p, text->utf8, n);
p += n;
++text;
} while (--count != 0);
}
}
*p++ = 127;
return p - (uint8_t*) buf;
}
size_t demo_course_unmarshal(demo_course* o, const void* data, size_t datalen) { // octet pointer navigation const uint8_t* p = data; const uint8_t* end; int enderr; if (datalen < colfer_size_max) { end = p + datalen; enderr = EWOULDBLOCK; } else { end = p + colfer_size_max; enderr = EFBIG; }
if (p >= end) {
errno = enderr;
return 0;
}
uint_fast8_t header = *p++;
if (header == 0) {
if (p+1 >= end) {
errno = enderr;
return 0;
}
uint_fast64_t x = *p++;
if (x > 127) {
x &= 127;
for (int shift = 7; ; shift += 7) {
uint_fast64_t b = *p++;
if (p >= end) {
errno = enderr;
return 0;
}
if (b <= 127) {
x |= b << shift;
break;
}
x |= (b & 127) << shift;
}
}
o->ID = x;
header = *p++;
} else if (header == (0 | 128)) {
if (p+8 >= end) {
errno = enderr;
return 0;
}
uint_fast64_t x = *p++;
x <<= 56;
x |= (uint_fast64_t) *p++ << 48;
x |= (uint_fast64_t) *p++ << 40;
x |= (uint_fast64_t) *p++ << 32;
x |= (uint_fast64_t) *p++ << 24;
x |= (uint_fast64_t) *p++ << 16;
x |= (uint_fast64_t) *p++ << 8;
x |= (uint_fast64_t) *p++;
o->ID = x;
header = *p++;
}
if (header == 1) {
if (p >= end) {
errno = enderr;
return 0;
}
size_t n = *p++;
if (n > 127) {
n &= 127;
for (int shift = 7; shift < sizeof(size_t) * CHAR_BIT; shift += 7) {
if (p >= end) {
errno = enderr;
return 0;
}
size_t c = *p++;
if (c <= 127) {
n |= c << shift;
break;
}
n |= (c & 127) << shift;
}
}
if (p+n >= end) {
errno = enderr;
return 0;
}
void* a = malloc(n);
memcpy(a, p, n);
p += n;
o->name.len = n;
o->name.utf8 = (char*) a;
header = *p++;
}
if (header == 2) {
if (p >= end) {
errno = enderr;
return 0;
}
size_t n = *p++;
if (n > 127) {
n &= 127;
for (int shift = 7; ; shift += 7) {
if (p >= end) {
errno = enderr;
return 0;
}
size_t c = *p++;
if (c <= 127) {
n |= c << shift;
break;
}
n |= (c & 127) << shift;
}
}
if (n > colfer_list_max) {
errno = EFBIG;
return 0;
}
demo_hole* a = calloc(n, sizeof(demo_hole));
for (size_t i = 0; i < n; ++i) {
size_t read = demo_hole_unmarshal(&a[i], p, (size_t) (end - p));
if (!read) {
if (errno == EWOULDBLOCK) errno = enderr;
return read;
}
p += read;
}
o->holes.len = n;
o->holes.list = a;
if (p >= end) {
errno = enderr;
return 0;
}
header = *p++;
}
if (header == 3) {
if (p >= end) {
errno = enderr;
return 0;
}
size_t n = *p++;
if (n > 127) {
n &= 127;
for (int shift = 7; ; shift += 7) {
if (p >= end) {
errno = enderr;
return 0;
}
size_t c = *p++;
if (c <= 127) {
n |= c << shift;
break;
}
n |= (c & 127) << shift;
}
}
if (p+n >= end) {
errno = enderr;
return 0;
}
void* a = malloc(n);
memcpy(a, p, n);
p += n;
o->image.len = n;
o->image.octets = (uint8_t*) a;
header = *p++;
}
if (header == 4) {
if (p >= end) {
errno = enderr;
return 0;
}
size_t n = *p++;
if (n > 127) {
n &= 127;
for (int shift = 7; ; shift += 7) {
if (p >= end) {
errno = enderr;
return 0;
}
size_t c = *p++;
if (c <= 127) {
n |= c << shift;
break;
}
n |= (c & 127) << shift;
}
}
if (n > colfer_list_max) {
errno = EFBIG;
return 0;
}
colfer_text* text = malloc(n * sizeof(colfer_text));
o->tags.len = n;
o->tags.list = text;
for (; n != 0; --n, ++text) {
if (p >= end) {
errno = enderr;
return 0;
}
size_t len = *p++;
if (len > 127) {
len &= 127;
for (int shift = 7; ; shift += 7) {
if (p >= end) {
errno = enderr;
return 0;
}
size_t c = *p++;
if (c <= 127) {
len |= c << shift;
break;
}
len |= (c & 127) << shift;
}
}
if (p+len >= end) {
errno = enderr;
return 0;
}
char* a = malloc(len);
memcpy(a, p, len);
p += len;
text->len = len;
text->utf8 = a;
}
if (p >= end) {
errno = enderr;
return 0;
}
header = *p++;
}
if (header != 127) {
errno = EILSEQ;
return 0;
}
return (size_t) (p - (const uint8_t*) data);
}
size_t demo_hole_marshal_len(const demo_hole* o) { size_t l = 1;
if (o->lat != 0.0) l += 9;
if (o->lon != 0.0) l += 9;
if (o->par) l += 2;
if (o->water) l++;
if (o->sand) l++;
if (l > colfer_size_max) {
errno = EFBIG;
return 0;
}
return l;
}
size_t demo_hole_marshal(const demo_hole* o, void* buf) { // octet pointer navigation uint8_t* p = buf;
if (o->lat != 0.0) {
*p++ = 0;
#ifdef COLFER_ENDIAN memcpy(p, &o->lat, 8); p += 8; #else uint_fast64_t x; memcpy(&x, &o->lat, 8); *p++ = x >> 56; *p++ = x >> 48; *p++ = x >> 40; *p++ = x >> 32; *p++ = x >> 24; *p++ = x >> 16; *p++ = x >> 8; *p++ = x; #endif }
if (o->lon != 0.0) {
*p++ = 1;
#ifdef COLFER_ENDIAN memcpy(p, &o->lon, 8); p += 8; #else uint_fast64_t x; memcpy(&x, &o->lon, 8); *p++ = x >> 56; *p++ = x >> 48; *p++ = x >> 40; *p++ = x >> 32; *p++ = x >> 24; *p++ = x >> 16; *p++ = x >> 8; *p++ = x; #endif }
if (o->par) {
*p++ = 2;
*p++ = o->par;
}
if (o->water) *p++ = 3;
if (o->sand) *p++ = 4;
*p++ = 127;
return p - (uint8_t*) buf;
}
size_t demo_hole_unmarshal(demo_hole* o, const void* data, size_t datalen) { // octet pointer navigation const uint8_t* p = data; const uint8_t* end; int enderr; if (datalen < colfer_size_max) { end = p + datalen; enderr = EWOULDBLOCK; } else { end = p + colfer_size_max; enderr = EFBIG; }
if (p >= end) {
errno = enderr;
return 0;
}
uint_fast8_t header = *p++;
if (header == 0) {
if (p+8 >= end) {
errno = enderr;
return 0;
}
#ifdef COLFER_ENDIAN memcpy(&o->lat, p, 8); p += 8; #else uint_fast64_t x = *p++; x <<= 56; x |= (uint_fast64_t) *p++ << 48; x |= (uint_fast64_t) *p++ << 40; x |= (uint_fast64_t) *p++ << 32; x |= (uint_fast64_t) *p++ << 24; x |= (uint_fast64_t) *p++ << 16; x |= (uint_fast64_t) *p++ << 8; x |= (uint_fast64_t) *p++; memcpy(&o->lat, &x, 8); #endif header = *p++; }
if (header == 1) {
if (p+8 >= end) {
errno = enderr;
return 0;
}
#ifdef COLFER_ENDIAN memcpy(&o->lon, p, 8); p += 8; #else uint_fast64_t x = *p++; x <<= 56; x |= (uint_fast64_t) *p++ << 48; x |= (uint_fast64_t) *p++ << 40; x |= (uint_fast64_t) *p++ << 32; x |= (uint_fast64_t) *p++ << 24; x |= (uint_fast64_t) *p++ << 16; x |= (uint_fast64_t) *p++ << 8; x |= (uint_fast64_t) *p++; memcpy(&o->lon, &x, 8); #endif header = *p++; }
if (header == 2) {
if (p+1 >= end) {
errno = enderr;
return 0;
}
o->par = *p++;
header = *p++;
}
if (header == 3) {
o->water = 1;
if (p >= end) {
errno = enderr;
return 0;
}
header = *p++;
}
if (header == 4) {
o->sand = 1;
if (p >= end) {
errno = enderr;
return 0;
}
header = *p++;
}
if (header != 127) {
errno = EILSEQ;
return 0;
}
return (size_t) (p - (const uint8_t*) data);
}