int test_is_bool() { uint8_t data[] = {0xC2, 0xC3, 0x00}; mu_assert(minipack_is_bool(data+0) == true); mu_assert(minipack_is_bool(data+1) == true); mu_assert(minipack_is_bool(data+2) == false); mu_assert(minipack_is_true(data+0) == false); mu_assert(minipack_is_true(data+1) == true); mu_assert(minipack_is_true(data+2) == false); mu_assert(minipack_is_false(data+0) == true); mu_assert(minipack_is_false(data+1) == false); mu_assert(minipack_is_false(data+2) == false); return 0; }
// Deserializes event data from memory at the current pointer. // // data - The event data to unpack into. // ptr - The pointer to the current location. // sz - The number of bytes read. // // Returns 0 if successful, otherwise returns -1. int sky_event_data_unpack(sky_event_data *data, void *ptr, size_t *sz) { size_t _sz; void *start = ptr; // Validate. check(data != NULL, "Event data required"); check(ptr != NULL, "Pointer required"); // Read key. data->key = *((sky_property_id_t*)ptr); ptr += sizeof(data->key); // If there is no data type set then determine it from the data. if(data->data_type == SKY_DATA_TYPE_NONE) { if(minipack_is_raw(ptr)) { data->data_type = SKY_DATA_TYPE_STRING; } else if(minipack_is_bool(ptr)) { data->data_type = SKY_DATA_TYPE_BOOLEAN; } else if(minipack_is_double(ptr)) { data->data_type = SKY_DATA_TYPE_DOUBLE; } else { data->data_type = SKY_DATA_TYPE_INT; } } // Read value. if(data->data_type == SKY_DATA_TYPE_INT) { data->int_value = minipack_unpack_int(ptr, &_sz); check(_sz != 0, "Unable to unpack event int value"); ptr += _sz; } else if(data->data_type == SKY_DATA_TYPE_DOUBLE) { data->double_value = minipack_unpack_double(ptr, &_sz); check(_sz != 0, "Unable to unpack event float value"); ptr += _sz; } else if(data->data_type == SKY_DATA_TYPE_BOOLEAN) { data->boolean_value = minipack_unpack_bool(ptr, &_sz); check(_sz != 0, "Unable to unpack event boolean value"); ptr += _sz; } else if(data->data_type == SKY_DATA_TYPE_STRING) { // Read raw header. uint32_t value_length = minipack_unpack_raw(ptr, &_sz); check(_sz != 0, "Unable to unpack event value header at %p", ptr); ptr += _sz; // Read raw data. data->string_value = blk2bstr(ptr, value_length); check_mem(data->string_value); ptr += value_length; } else { sentinel("Invalid data type (%d) for event data", data->data_type); } // Store number of bytes read. if(sz != NULL) *sz = (ptr-start); return 0; error: *sz = 0; return -1; }