Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}