in benchmarks/JetStream2/wasm/TSF/tsf_reflect.c [492:654]
static tsf_bool_t write_mainpass(tsf_reflect_t *data,
tsf_type_out_map_t *type_map,
uint8_t **buf) {
switch (data->type->kind_code) {
case TSF_TK_INT8:
case TSF_TK_UINT8:
case TSF_TK_BIT:
copy_htonc_incdst(*buf, &data->u.p_uint8_t);
break;
case TSF_TK_INT16:
case TSF_TK_UINT16:
copy_htons_incdst(*buf, (uint8_t*)&data->u.p_uint16_t);
break;
case TSF_TK_INT32:
case TSF_TK_UINT32:
copy_htonl_incdst(*buf, (uint8_t*)&data->u.p_uint32_t);
break;
case TSF_TK_INT64:
case TSF_TK_UINT64:
copy_htonll_incdst(*buf, (uint8_t*)&data->u.p_uint64_t);
break;
case TSF_TK_INTEGER:
*buf += write_tsf_integer(*buf, data->u.p_integer);
break;
case TSF_TK_LONG:
*buf += write_tsf_long(*buf, data->u.p_long);
break;
case TSF_TK_FLOAT:
copy_htonf_incdst(*buf, (uint8_t*)&data->u.p_float);
break;
case TSF_TK_DOUBLE:
copy_htond_incdst(*buf, (uint8_t*)&data->u.p_double);
break;
case TSF_TK_ARRAY: {
uint8_t tmp;
if (data->u.c.size >= 255) {
tmp = (uint8_t)255;
copy_htonc_incdst(*buf, &tmp);
copy_htonl_incdst(*buf, (uint8_t*)&data->u.c.size);
} else {
tmp = (uint8_t)data->u.c.size;
copy_htonc_incdst(*buf, &tmp);
}
if (tsf_type_get_kind_code(
tsf_array_type_get_element_type(data->type))
== TSF_TK_BIT) {
uint32_t i, j;
uint8_t value;
for (i = 0; i + 7 < data->u.c.size; i += 8) {
value = 0;
for (j = 0; j < 8; ++j) {
if (data->u.c.array[i + j]->u.bit) {
value |= (1 << j);
}
}
copy_htonc_incdst(*buf, &value);
}
if (data->u.c.size > i) {
value = 0;
for (j = 0; j < data->u.c.size - i; ++j) {
if (data->u.c.array[i + j]->u.bit) {
value |= (1 << j);
}
}
copy_htonc_incdst(*buf, &value);
}
} else {
uint32_t i;
for (i = 0; i < data->u.c.size; ++i) {
if (!write_mainpass(data->u.c.array[i],
type_map,
buf)) {
return tsf_false;
}
}
}
break;
}
case TSF_TK_STRUCT: {
uint32_t i;
uint8_t value, bit;
for (i = 0; i < data->u.c.size; ++i) {
if (data->u.c.array[i]->type->kind_code == TSF_TK_BIT) {
continue;
}
if (!write_mainpass(data->u.c.array[i],
type_map,
buf)) {
return tsf_false;
}
}
value = 0;
bit = 0;
for (i = 0; i < data->u.c.size; ++i) {
if (data->u.c.array[i]->type->kind_code != TSF_TK_BIT) {
continue;
}
if (data->u.c.array[i]->u.bit) {
value |= (1 << bit);
}
++bit;
if (bit == 8) {
copy_htonc_incdst(*buf, &value);
value = 0;
bit = 0;
}
}
if (bit) {
copy_htonc_incdst(*buf, &value);
}
break;
}
case TSF_TK_CHOICE:
if (tsf_choice_type_get_num_elements(data->type) >= 256) {
if (data->type->u.h.choice_as_full_word) {
copy_htonl_incdst(*buf, (uint8_t*)&data->u.h.choice);
} else {
*buf += write_tsf_unsigned(*buf, data->u.h.choice + 1);
}
} else {
uint8_t choice_8bit;
if (data->u.h.choice == UINT32_MAX) {
choice_8bit = 255;
} else {
choice_8bit = data->u.h.choice;
}
copy_htonc_incdst(*buf, &choice_8bit);
}
if (data->u.h.data != NULL) {
if (!write_mainpass(data->u.h.data,
type_map,
buf)) {
return tsf_false;
}
}
break;
case TSF_TK_VOID:
break;
case TSF_TK_STRING:
#ifdef HAVE_STPCPY
*buf = (uint8_t*)stpcpy((char*)*buf, data->u.str) + 1;
#else
strcpy((char*)*buf, data->u.str);
*buf += strlen(data->u.str) + 1;
#endif
break;
case TSF_TK_ANY:
if (!tsf_buffer_write_to_buf(data->u.any,
type_map,
buf)) {
return tsf_false;
}
break;
default:
tsf_set_error(TSF_E_BAD_TYPE_KIND,
fui8 " is not a recognized kind code.",
data->type->kind_code);
return tsf_false;
}
return tsf_true;
}