in Source/PLCrashLogWriterEncoding.c [182:284]
size_t plcrash_writer_pack (plcrash_async_file_t *file, uint32_t field_id, PLProtobufCType field_type, const void *value) {
size_t rv;
uint8_t scratch[MAX_UINT64_ENCODED_SIZE * 2];
rv = tag_pack (field_id, scratch);
switch (field_type)
{
case PLPROTOBUF_C_TYPE_SINT32:
scratch[0] |= PLPROTOBUF_C_WIRE_TYPE_VARINT;
rv += sint32_pack (*(const int32_t *) value, scratch + rv);
if (file != NULL)
plcrash_async_file_write(file, scratch, rv);
break;
case PLPROTOBUF_C_TYPE_INT32:
scratch[0] |= PLPROTOBUF_C_WIRE_TYPE_VARINT;
rv += int32_pack (*(const uint32_t *) value, scratch + rv);
if (file != NULL)
plcrash_async_file_write(file, scratch, rv);
break;
case PLPROTOBUF_C_TYPE_UINT32:
case PLPROTOBUF_C_TYPE_ENUM:
scratch[0] |= PLPROTOBUF_C_WIRE_TYPE_VARINT;
rv += uint32_pack (*(const uint32_t *) value, scratch + rv);
if (file != NULL)
plcrash_async_file_write(file, scratch, rv);
break;
case PLPROTOBUF_C_TYPE_SINT64:
scratch[0] |= PLPROTOBUF_C_WIRE_TYPE_VARINT;
rv += sint64_pack (*(const int64_t *) value, scratch + rv);
if (file != NULL)
plcrash_async_file_write(file, scratch, rv);
break;
case PLPROTOBUF_C_TYPE_INT64:
case PLPROTOBUF_C_TYPE_UINT64:
scratch[0] |= PLPROTOBUF_C_WIRE_TYPE_VARINT;
rv += uint64_pack (*(const uint64_t *) value, scratch + rv);
if (file != NULL)
plcrash_async_file_write(file, scratch, rv);
break;
case PLPROTOBUF_C_TYPE_SFIXED32:
case PLPROTOBUF_C_TYPE_FIXED32:
case PLPROTOBUF_C_TYPE_FLOAT:
scratch[0] |= PLPROTOBUF_C_WIRE_TYPE_32BIT;
rv += fixed32_pack (*(const uint32_t *) value, scratch + rv);
if (file != NULL)
plcrash_async_file_write(file, scratch, rv);
break;
case PLPROTOBUF_C_TYPE_SFIXED64:
case PLPROTOBUF_C_TYPE_FIXED64:
case PLPROTOBUF_C_TYPE_DOUBLE:
scratch[0] |= PLPROTOBUF_C_WIRE_TYPE_64BIT;
rv += fixed64_pack (*(const uint64_t *) value, scratch + rv);
if (file != NULL)
plcrash_async_file_write(file, scratch, rv);
break;
case PLPROTOBUF_C_TYPE_BOOL:
scratch[0] |= PLPROTOBUF_C_WIRE_TYPE_VARINT;
rv += boolean_pack (*(const bool *) value, scratch + rv);
if (file != NULL)
plcrash_async_file_write(file, scratch, rv);
break;
case PLPROTOBUF_C_TYPE_STRING:
{
uint32_t sublen = (uint32_t) strlen (value);
scratch[0] |= PLPROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED;
rv += uint32_pack (sublen, scratch + rv);
if (file != NULL) {
plcrash_async_file_write(file, scratch, rv);
plcrash_async_file_write(file, value, sublen);
}
rv += sublen;
break;
}
case PLPROTOBUF_C_TYPE_BYTES:
{
const PLProtobufCBinaryData * bd = ((const PLProtobufCBinaryData*) value);
uint32_t sublen = (uint32_t) bd->len;
scratch[0] |= PLPROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED;
rv += uint32_pack (sublen, scratch + rv);
if (file != NULL) {
plcrash_async_file_write(file, scratch, rv);
plcrash_async_file_write(file, bd->data, sublen);
}
rv += sublen;
break;
}
//PLPROTOBUF_C_TYPE_GROUP, // NOT SUPPORTED
case PLPROTOBUF_C_TYPE_MESSAGE:
{
scratch[0] |= PLPROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED;
rv += uint32_pack (*(const uint32_t *) value, scratch + rv);
if (file != NULL)
plcrash_async_file_write(file, scratch, rv);
break;
}
default:
PLCF_DEBUG("Unhandled field type %d", field_type);
abort();
}
return rv;
}