Exemplo n.º 1
0
static void
set_member(
    const struct sol_flow_node_options_member_description *mdesc,
    enum sol_flow_node_options_member_type mdesc_type,
    const struct sol_flow_node_named_options_member *m,
    struct sol_flow_node_options *opts)
{
    char **s;
    void *mem = get_member_memory(mdesc, opts);

    switch (mdesc_type) {
    case SOL_FLOW_NODE_OPTIONS_MEMBER_BOOLEAN:
        *(bool *)mem = m->boolean;
        break;
    case SOL_FLOW_NODE_OPTIONS_MEMBER_BYTE:
        *(unsigned char *)mem = m->byte;
        break;
    case SOL_FLOW_NODE_OPTIONS_MEMBER_DRANGE_SPEC:
        *(struct sol_drange_spec *)mem = m->drange_spec;
        break;
    case SOL_FLOW_NODE_OPTIONS_MEMBER_FLOAT:
        *(double *)mem = m->f;
        break;
    case SOL_FLOW_NODE_OPTIONS_MEMBER_INT:
        *(int32_t *)mem = m->i;
        break;
    case SOL_FLOW_NODE_OPTIONS_MEMBER_IRANGE_SPEC:
        *(struct sol_irange_spec *)mem = m->irange_spec;
        break;
    case SOL_FLOW_NODE_OPTIONS_MEMBER_RGB:
        *(struct sol_rgb *)mem = m->rgb;
        break;
    case SOL_FLOW_NODE_OPTIONS_MEMBER_DIRECTION_VECTOR:
        *(struct sol_direction_vector *)mem = m->direction_vector;
        break;
    case SOL_FLOW_NODE_OPTIONS_MEMBER_STRING:
        s = mem;
        free(*s);
        *s = strdup(m->string);
    default:
        /* Not reached. */
        /* TODO: Create ASSERT_NOT_REACHED() macro.*/
        break;
    }
}
Exemplo n.º 2
0
static int
member_parse(const struct sol_flow_node_options_description *desc, const struct sol_flow_node_options_member_description *member, struct sol_flow_node_options *opts, const char *str, uint16_t value_start)
{
    const char *t = member->data_type;
    const char *value = str + value_start;
    void *mem = get_member_memory(member, opts);

    if (streq(t, "string")) {
        char **s = mem;
        free(*s);
        *s = strdup(value);
    } else if (streq(t, "boolean")) {
        bool *b = mem;
        if (streq(value, "1") || streq(value, "true") || streq(value, "on") || streq(value, "yes"))
            *b = true;
        else if (streq(value, "0") || streq(value, "false") || streq(value, "off") || streq(value, "no"))
            *b = false;
        else {
            SOL_DBG("Invalid boolean value for option name=\"%s\": \"%s\"",
                member->name, value);
            return -EINVAL;
        }
    } else if (streq(t, "byte")) {
        unsigned char *byte = mem;
        int i;
        errno = 0;
        i = strtol(value, NULL, 0);
        if ((errno != 0) || (i < 0) || (i > 255)) {
            SOL_DBG("Invalid byte value for option name=\"%s\": \"%s\"",
                member->name, value);
            return -errno;
        }
        *byte = i;
    } else if (streq(t, "int")) {
        struct sol_irange *i = mem;
        int r = irange_parse(member, value, i);
        SOL_INT_CHECK(r, < 0, r);
    } else if (streq(t, "float")) {