size_t plcrash_writer_pack()

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;
}