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; } }
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")) {