Beispiel #1
0
static void
test_no_nul_byte(void)
{
    struct sol_buffer buf;
    int32_t backend;
    int32_t value = 0xdeadbeef;
    int err;

    sol_buffer_init_flags(&buf, &backend, sizeof(backend),
        SOL_BUFFER_FLAGS_MEMORY_NOT_OWNED | SOL_BUFFER_FLAGS_NO_NUL_BYTE);

    err = sol_buffer_ensure(&buf, sizeof(int32_t));
    ASSERT_INT_EQ(err, 0);

    err = sol_buffer_append_slice(&buf, SOL_STR_SLICE_STR((const char *)&value, sizeof(value)));
    ASSERT_INT_EQ(err, 0);

    err = sol_buffer_append_slice(&buf, SOL_STR_SLICE_STR((const char *)&value, sizeof(value)));
    ASSERT_INT_NE(err, 0);

    sol_buffer_fini(&buf);

    sol_buffer_init_flags(&buf, NULL, 0, SOL_BUFFER_FLAGS_NO_NUL_BYTE);
    err = sol_buffer_append_printf(&buf, "123");
    ASSERT_INT_EQ(err, 0);
    err = sol_buffer_append_printf(&buf, "4");
    ASSERT_INT_EQ(err, 0);

    ASSERT(sol_str_slice_eq(sol_buffer_get_slice(&buf),
        SOL_STR_SLICE_STR("1234", 4)));
    sol_buffer_fini(&buf);
}
Beispiel #2
0
SOL_API int
sol_bt_uuid_to_str(const struct sol_bt_uuid *uuid, struct sol_buffer *buffer)
{
    uint32_t tmp0, tmp4;
    uint16_t tmp1, tmp2, tmp3, tmp5;
    struct sol_bt_uuid u = BASE_UUID;
    int r;

    SOL_NULL_CHECK(uuid, -EINVAL);
    SOL_NULL_CHECK(buffer, -EINVAL);

    uuid_to_uuid128(uuid, &u);

    memcpy(&tmp0, &u.val128[0], sizeof(tmp0));
    memcpy(&tmp1, &u.val128[4], sizeof(tmp1));
    memcpy(&tmp2, &u.val128[6], sizeof(tmp2));
    memcpy(&tmp3, &u.val128[8], sizeof(tmp3));
    memcpy(&tmp4, &u.val128[10], sizeof(tmp4));
    memcpy(&tmp5, &u.val128[14], sizeof(tmp5));

    r = sol_buffer_append_printf(buffer, "%.8" PRIx32 "-%.4" PRIx16 "-%.4" PRIx16 "-%.4" PRIx16 "-%.8" PRIx32 "%.4" PRIx16,
        sol_util_cpu_to_be32(tmp0), sol_util_cpu_to_be16(tmp1),
        sol_util_cpu_to_be16(tmp2), sol_util_cpu_to_be16(tmp3),
        sol_util_cpu_to_be32(tmp4), sol_util_cpu_to_be16(tmp5));

    return r ? -errno : 0;
}
Beispiel #3
0
SOL_API int
sol_json_double_to_str(const double value, struct sol_buffer *buf)
{
    int ret;
    char *decimal_point, *end;
    size_t used;

#ifdef HAVE_LOCALE
    struct lconv *lc = localeconv();
#endif

    SOL_NULL_CHECK(buf, -EINVAL);

    used = buf->used;

    ret = sol_buffer_append_printf(buf, "%g", value);
    SOL_INT_CHECK(ret, < 0, ret);

#ifdef HAVE_LOCALE
    if (lc->decimal_point && streq(lc->decimal_point, "."))
        return 0;

    end = (char *)buf->data + used;

    if ((decimal_point = strstr(end, lc->decimal_point))) {
        size_t decimal_len = strlen(lc->decimal_point);
        size_t offset = decimal_point - (char *)buf->data + 1;
        *decimal_point = '.';

        ret = sol_buffer_remove_data(buf, offset, decimal_len - 1);
        SOL_INT_CHECK(ret, < 0, ret);
    }
Beispiel #4
0
static void
test_append_printf(void)
{
    struct sol_buffer buf;
    int err;

    sol_buffer_init(&buf);
    err = sol_buffer_append_printf(&buf, "[%03d]", 1);
    ASSERT_INT_EQ(err, 0);
    ASSERT_STR_EQ(buf.data, "[001]");

    err = sol_buffer_append_printf(&buf, "'%s'", "This is a longer string, bla bla bla, bla bla bla");
    ASSERT_INT_EQ(err, 0);
    ASSERT_STR_EQ(buf.data, "[001]'This is a longer string, bla bla bla, bla bla bla'");

    err = sol_buffer_append_printf(&buf, ".");
    ASSERT_INT_EQ(err, 0);
    ASSERT_STR_EQ(buf.data, "[001]'This is a longer string, bla bla bla, bla bla bla'.");

    sol_buffer_fini(&buf);
}
SOL_API const char *
sol_network_link_addr_to_str(const struct sol_network_link_addr *addr,
    struct sol_buffer *buf)
{
    char *p;
    int i;
    bool sep = false, skipping = false, treated_zeroes = false;

    SOL_NULL_CHECK(addr, NULL);
    SOL_NULL_CHECK(buf, NULL);

    if (sol_bluetooth_is_family(addr->family))
        return sol_bluetooth_addr_to_str(addr, buf);

    if (addr->family != SOL_NETWORK_FAMILY_INET6)
        return NULL;

    if (buf->capacity - buf->used < SOL_NETWORK_INET_ADDR_STR_LEN)
        return NULL;

    p = sol_buffer_at_end(buf);

    for (i = 0; i < 16; i += 2) {
        uint16_t part;

        part = ((uint16_t)addr->addr.in6[i] << 8) | addr->addr.in6[i + 1];
        if (part && skipping) {
            skipping = false;
            treated_zeroes = true;
            sep = true;
        }
        if (!part && !treated_zeroes) {
            if (!skipping) {
                skipping = true;
                sep = true;
            }
        }
        if (sep) {
            sol_buffer_append_char(buf, ':');
            if (skipping)
                sep = false;
        }
        if (skipping)
            continue;
        sol_buffer_append_printf(buf, "%" PRIx16, part);
        sep = true;
    }
    if (skipping)
        sol_buffer_append_char(buf, ':');

    return p;
}
Beispiel #6
0
// 37 = 2 * 16 (chars) + 4 (hyphens) + 1 (\0)
SOL_API int
sol_util_uuid_gen(bool upcase,
    bool with_hyphens,
    char id[SOL_STATIC_ARRAY_SIZE(37)])
{
    static struct sol_str_slice hyphen = SOL_STR_SLICE_LITERAL("-");
    /* hyphens on positions 8, 13, 18, 23 (from 0) */
    static const int hyphens_pos[] = { 8, 13, 18, 23 };
    struct sol_uuid uuid = { { 0 } };
    unsigned i;
    int r;

    struct sol_buffer buf = { 0 };

    sol_buffer_init_flags(&buf, id, 37,
        SOL_BUFFER_FLAGS_MEMORY_NOT_OWNED);

    r = uuid_gen(&uuid);
    SOL_INT_CHECK(r, < 0, r);

    for (i = 0; i < SOL_UTIL_ARRAY_SIZE(uuid.bytes); i++) {
        r = sol_buffer_append_printf(&buf, upcase ? "%02hhX" : "%02hhx",
            uuid.bytes[i]);
        SOL_INT_CHECK_GOTO(r, < 0, err);
    }

    if (with_hyphens) {
        for (i = 0; i < SOL_UTIL_ARRAY_SIZE(hyphens_pos); i++) {
            r = sol_buffer_insert_slice(&buf, hyphens_pos[i], hyphen);
            SOL_INT_CHECK_GOTO(r, < 0, err);
        }
    }

err:
    sol_buffer_fini(&buf);
    return r;
}
Beispiel #7
0
static int
light_resource_to_rep(const struct sol_coap_resource *resource,
    bool state, struct sol_buffer *buf)
{
    SOL_BUFFER_DECLARE_STATIC(buffer, 64);
    int r;

    r = sol_coap_uri_path_to_buf(resource->path, &buffer, 0, NULL);
    SOL_INT_CHECK(r, < 0, r);

    r = sol_buffer_append_printf(buf,
        OC_CORE_ELEM_JSON_START, (char *)sol_buffer_steal(&buffer, NULL));
    SOL_INT_CHECK(r, < 0, r);

    r = sol_buffer_append_printf(buf,
        OC_CORE_PROP_JSON_NUMBER, "power", 100);
    SOL_INT_CHECK(r, < 0, r);

    r = sol_buffer_append_printf(buf, OC_CORE_JSON_SEPARATOR);
    SOL_INT_CHECK(r, < 0, r);

    r = sol_buffer_append_printf(buf,
        OC_CORE_PROP_JSON_STRING, "name", "Soletta LAMP!");
    SOL_INT_CHECK(r, < 0, r);

    r = sol_buffer_append_printf(buf, OC_CORE_JSON_SEPARATOR);
    SOL_INT_CHECK(r, < 0, r);

    r = sol_buffer_append_printf(buf,
        OC_CORE_PROP_JSON_BOOLEAN, "state", state ? "true" : "false" );
    SOL_INT_CHECK(r, < 0, r);

    r = sol_buffer_append_printf(buf, OC_CORE_ELEM_JSON_END);
    SOL_INT_CHECK(r, < 0, r);

    return 0;
}