Exemplo n.º 1
0
SOL_API void
sol_oic_resource_unref(struct sol_oic_resource *r)
{
    SOL_NULL_CHECK(r);
    OIC_RESOURCE_CHECK_API(r);

    r->refcnt--;
    if (!r->refcnt) {
        struct sol_str_slice *slice;
        uint16_t idx;

        free((char *)r->href.data);
        free((char *)r->device_id.data);

        SOL_VECTOR_FOREACH_IDX (&r->types, slice, idx)
            free((char *)slice->data);
        sol_vector_clear(&r->types);

        SOL_VECTOR_FOREACH_IDX (&r->interfaces, slice, idx)
            free((char *)slice->data);
        sol_vector_clear(&r->interfaces);

        free(r);
    }
}
Exemplo n.º 2
0
static inline const void *
sol_mavlink_parse_addr_protocol(const char *str, struct sol_str_slice *addr, int *port)
{
    struct sol_vector tokens;
    struct sol_str_slice slice = sol_str_slice_from_str(str);
    const void *init;

    tokens = sol_str_slice_split(slice, ":", 0);
    if (tokens.len <= 1) {
        SOL_ERR("Invalid addr string, it must specify at least <prot>:<addr>");
        return NULL;
    }

    init = sol_str_table_ptr_lookup_fallback
            (protocol_table, STR_SLICE_VAL(sol_vector_get(&tokens, 0)),
            sol_mavlink_init_tcp);
    if (!init) {
        SOL_ERR("Invalid protocol");
        goto err;
    }

    *addr = STR_SLICE_VAL(sol_vector_get(&tokens, 1));

    if (tokens.len >= 3)
        sol_str_slice_to_int(STR_SLICE_VAL(sol_vector_get(&tokens, 2)), port);

    sol_vector_clear(&tokens);

    return init;

err:
    sol_vector_clear(&tokens);
    return NULL;
}
void
sml_fuzzy_destroy(struct sml_fuzzy *fuzzy)
{
    delete (fl::Engine*) fuzzy->engine;
    sol_vector_clear(&fuzzy->input_terms_width);
    sol_vector_clear(&fuzzy->output_terms_width);
    free(fuzzy);
}
bool
sml_fuzzy_load_file(struct sml_fuzzy *fuzzy, const char *filename)
{
    fl::Engine *engine;
    uint16_t i, len;
    void *width;

    try {
        fl::FllImporter importer;
        engine = importer.fromFile(filename);

    } catch (fl::Exception e) {
        sml_critical("%s", e.getWhat().c_str());
        return false;
    }

    if (engine->numberOfInputVariables() == 0 ||
        engine->numberOfOutputVariables() == 0) {
        sml_critical("Input and output variables must be provided!");
        goto error;
    }

    if (engine->numberOfRuleBlocks() == 0) {
      sml_critical("Rule blocks must be provided!");
      goto error;
    }

    if (fuzzy->engine)
        delete (fl::Engine*) fuzzy->engine;

    fuzzy->engine = engine;
    fuzzy->input_list = (struct sml_variables_list*)&(engine->inputVariables());
    fuzzy->output_list = (struct sml_variables_list*)&(engine->outputVariables());
    fuzzy->input_terms_count = _calc_terms_count(engine->inputVariables());
    fuzzy->output_terms_count = _calc_terms_count(engine->outputVariables());
    _remove_rule_blocks(engine);

    sol_vector_clear(&fuzzy->input_terms_width);
    sol_vector_clear(&fuzzy->output_terms_width);

    len = engine->inputVariables().size();
    for (i = 0; i < len; i++) {
        width = sol_vector_append(&fuzzy->input_terms_width);
        ON_NULL_RETURN_VAL(width, false);
    }

    len = engine->outputVariables().size();
    for (i = 0; i < len; i++) {
        width = sol_vector_append(&fuzzy->output_terms_width);
        ON_NULL_RETURN_VAL(width, false);
    }
    return true;

error:
    delete engine;
    return false;
}
Exemplo n.º 5
0
void
sml_matrix_clear(struct sml_matrix *m)
{
    uint16_t i;
    struct sol_vector *line;

    SOL_VECTOR_FOREACH_IDX (&m->data, line, i)
        sol_vector_clear(line);

    sol_vector_clear(&m->data);
}
static bool
_sml_ann_bridge_calculate_confidence_interval(struct sml_ann_bridge *iann,
    struct sml_variables_list *inputs,
    unsigned int observations)
{
    unsigned int i, j, inputs_len;
    float mean, sd, value;
    struct sml_variable *var;
    Confidence_Interval *ci;
    char var_name[SML_VARIABLE_NAME_MAX_LEN + 1];

    sml_debug("Calculating confidence interval");
    inputs_len = sml_ann_variables_list_get_length(inputs);
    for (i = 0; i < inputs_len; i++) {
        mean = sd = 0.0;
        var = sml_ann_variables_list_index(inputs, i);
        ci = sol_vector_append(&iann->confidence_intervals);
        if (!ci) {
            sml_critical("Could not alloc the Confidence_Interval");
            goto err_exit;
        }

        for (j = 0; j < observations; j++) {
            value = sml_ann_variable_get_value_by_index(var, j);
            if (isnan(value))
                sml_ann_variable_get_range(var, &value, NULL);
            mean += value;
        }
        mean /= observations;

        //Now the standard deviation
        for (j = 0; j < observations; j++) {
            value = sml_ann_variable_get_value_by_index(var, j);
            if (isnan(value))
                sml_ann_variable_get_range(var, &value, NULL);
            sd += pow(value - mean, 2.0);
        }
        sd /= observations;
        sd = sqrt(sd);

        //Confidence interval of 95%
        ci->lower_limit = mean - (1.96 * (sd / sqrt(observations)));
        ci->upper_limit = mean + (1.96 * (sd / sqrt(observations)));
        iann->ci_length_sum += (ci->upper_limit - ci->lower_limit);

        if (sml_ann_variable_get_name(var, var_name, sizeof(var_name))) {
            sml_warning("Failed to get variable name for %p", var);
            continue;
        }

        sml_debug("Variable:%s mean:%f sd:%f lower:%f upper:%f",
            var_name, mean, sd, ci->lower_limit,
            ci->upper_limit);
    }

    return true;
err_exit:
    sol_vector_clear(&iann->confidence_intervals);
    return false;
}
Exemplo n.º 7
0
static bool
on_write(void *data, int fd, uint32_t active_flags)
{
    struct subprocess_data *mdata = data;
    int err = 0;

    if (active_flags & SOL_FD_FLAGS_ERR)
        err = -EBADF;
    else
        err = out_write(mdata);

    if (err < 0) {
        uint16_t i;
        struct write_data *w;

        SOL_VECTOR_FOREACH_IDX (&mdata->write_data, w, i)
            sol_blob_unref(w->blob);
        sol_vector_clear(&mdata->write_data);
    }

    if (mdata->write_data.len == 0) {
        mdata->watches.out = NULL;
        return false;
    }

    return true;
}
Exemplo n.º 8
0
static void
counter_close(struct sol_flow_node *node, void *data)
{
    struct counter_data *mdata = data;

    sol_vector_clear(&mdata->map);
}
Exemplo n.º 9
0
void
process_subprocess_close(struct sol_flow_node *node, void *data)
{
    struct subprocess_data *mdata = data;

    if (mdata->fork_run)
        sol_platform_linux_fork_run_stop(mdata->fork_run);

    if (mdata->watches.in)
        sol_fd_del(mdata->watches.in);
    if (mdata->watches.err)
        sol_fd_del(mdata->watches.err);
    if (mdata->watches.out) {
        struct write_data *w;
        uint16_t i;

        sol_fd_del(mdata->watches.out);
        SOL_VECTOR_FOREACH_IDX (&mdata->write_data, w, i)
            sol_blob_unref(w->blob);
        sol_vector_clear(&mdata->write_data);
    }

    close(mdata->pipes.in[0]);
    close(mdata->pipes.in[1]);
    close(mdata->pipes.err[0]);
    close(mdata->pipes.err[1]);
    close(mdata->pipes.out[0]);
    close(mdata->pipes.out[1]);

    free(mdata->command);
}
Exemplo n.º 10
0
void
byte_validator_close(struct sol_flow_node *node, void *data)
{
    struct byte_validator_data *mdata = data;

    sol_vector_clear(&mdata->values);
}
Exemplo n.º 11
0
static int
_populate_values(void *data, const char *sequence)
{
    struct int_validator_data *mdata = data;
    char *tail;
    const char *it;
    int32_t *val;

    sol_vector_init(&mdata->values, sizeof(int32_t));
    it = sequence;
    do {
        val = sol_vector_append(&mdata->values);
        SOL_NULL_CHECK_GOTO(val, no_memory);

        errno = 0;
        *val = strtol(it, &tail, 10);

        if (errno) {
            SOL_WRN("Failed do convert option 'sequence' to int %s: %d", it, errno);
            return -errno;
        }
        if (it == tail) {
            SOL_WRN("Failed to convert option 'sequence' to int %s", it);
            return -EINVAL;
        }
        it = tail;
    } while (*tail != '\0');

    return 0;

no_memory:
    sol_vector_clear(&mdata->values);
    return -ENOMEM;
}
Exemplo n.º 12
0
void
int_generator_close(struct sol_flow_node *node, void *data)
{
    struct int_generator_data *mdata = data;

    if (mdata->values.len != mdata->next_index)
        sol_timeout_del(mdata->timer);

    sol_vector_clear(&mdata->values);
}
Exemplo n.º 13
0
int
int_generator_open(
    struct sol_flow_node *node,
    void *data,
    const struct sol_flow_node_options *options)
{
    struct int_generator_data *mdata = data;
    const struct sol_flow_node_type_test_int_generator_options *opts =
        (const struct sol_flow_node_type_test_int_generator_options *)options;
    const char *it;
    char *tail;
    int32_t *val;

    if (opts->sequence == NULL || *opts->sequence == '\0') {
        SOL_ERR("Option 'sequence' is either NULL or empty.");
        return -EINVAL;
    }
    it = opts->sequence;

    if (opts->interval.val < 0)
        SOL_WRN("Option 'interval' < 0, setting it to 0.");

    mdata->interval = opts->interval.val >= 0 ? opts->interval.val : 0;
    mdata->next_index = 0;

    sol_vector_init(&mdata->values, sizeof(int32_t));
    do {
        val = sol_vector_append(&mdata->values);
        SOL_NULL_CHECK_GOTO(val, no_memory);

        errno = 0;
        *val = strtol(it, &tail, 10);
        if (errno) {
            SOL_WRN("Failed do convert option 'sequence' to int %s: %d", it, errno);
            goto error;
        }
        if (it == tail) {
            SOL_WRN("Failed to convert option 'sequence' to int %s", it);
            errno = -EINVAL;
            goto error;
        }
        it = tail;
    } while (*tail != '\0');

    mdata->timer = sol_timeout_add(mdata->interval, timer_tick, node);
    SOL_NULL_CHECK_GOTO(mdata->timer, error);

    return 0;

no_memory:
    errno = -ENOMEM;
error:
    sol_vector_clear(&mdata->values);
    return errno;
}
Exemplo n.º 14
0
SOL_API void
sol_oic_resource_unref(struct sol_oic_resource *r)
{
    SOL_NULL_CHECK(r);
    OIC_RESOURCE_CHECK_API(r);

    r->refcnt--;
    if (!r->refcnt) {
        free((char *)r->href.data);
        free((char *)r->device_id.data);

        sol_vector_clear(&r->types);
        free(r->types_data);

        sol_vector_clear(&r->interfaces);
        free(r->interfaces_data);

        free(r);
    }
}
Exemplo n.º 15
0
void
sml_matrix_remove_line(struct sml_matrix *m, uint16_t line_num)
{
    struct sol_vector *line;

    line = sol_vector_get(&m->data, line_num);
    if (!line)
        return;

    sol_vector_clear(line);
    sol_vector_del(&m->data, line_num);
}
Exemplo n.º 16
0
SOL_API struct sol_vector
sol_str_slice_split(const struct sol_str_slice slice,
    const char *delim,
    size_t maxsplit)
{
    struct sol_vector v = SOL_VECTOR_INIT(struct sol_str_slice);
    const char *str = slice.data;
    ssize_t dlen;
    size_t len;

    if (!slice.len || !delim)
        return v;

    maxsplit = (maxsplit) ? : slice.len - 1;
    if (maxsplit == SIZE_MAX) //once we compare to maxsplit + 1
        maxsplit--;

    dlen = strlen(delim);
    len = slice.len;

#define CREATE_SLICE(_str, _len) \
    do { \
        s = sol_vector_append(&v); \
        if (!s) \
            goto err; \
        s->data = _str; \
        s->len = _len; \
    } while (0)

    while (str && (v.len < maxsplit + 1)) {
        struct sol_str_slice *s;
        char *token = memmem(str, len, delim, dlen);
        if (!token) {
            CREATE_SLICE(str, len);
            break;
        }

        if (v.len == (uint16_t)maxsplit)
            CREATE_SLICE(str, len);
        else
            CREATE_SLICE(str, (size_t)(token - str));

        len -= (token - str) + dlen;
        str = token + dlen;
    }
#undef CREATE_SLICE

    return v;

err:
    sol_vector_clear(&v);
    return v;
}
Exemplo n.º 17
0
int
float_validator_open(
    struct sol_flow_node *node,
    void *data,
    const struct sol_flow_node_options *options)
{
    struct float_validator_data *mdata = data;
    const struct sol_flow_node_type_test_float_validator_options *opts =
        (const struct sol_flow_node_type_test_float_validator_options *)options;
    const char *it;
    char *tail;
    double *val;

    SOL_FLOW_NODE_OPTIONS_SUB_API_CHECK(options,
        SOL_FLOW_NODE_TYPE_TEST_FLOAT_VALIDATOR_OPTIONS_API_VERSION,
        -EINVAL);
    mdata->done = false;

    if (opts->sequence == NULL || *opts->sequence == '\0') {
        SOL_ERR("Option 'sequence' is either NULL or empty.");
        return -EINVAL;
    }

    sol_vector_init(&mdata->values, sizeof(double));
    it = opts->sequence;
    do {
        val = sol_vector_append(&mdata->values);
        SOL_NULL_CHECK_GOTO(val, no_memory);

        *val = sol_util_strtod_n(it, &tail, -1, false);
        if (errno) {
            SOL_WRN("Failed do convert option 'sequence' to double %s: %d", it, errno);
            goto error;
        }
        if (it == tail) {
            SOL_WRN("Failed to convert option 'sequence' to double %s", it);
            errno = EINVAL;
            goto error;
        }
        it = tail;
    } while (*tail != '\0');

    return 0;

no_memory:
    errno = ENOMEM;
error:
    sol_vector_clear(&mdata->values);
    return -errno;
}
Exemplo n.º 18
0
static void
http_composed_client_type_dispose(struct sol_flow_node_type *type)
{
    struct http_composed_client_type *self = (struct http_composed_client_type *)type;
    struct http_composed_client_port_out *port_out;
    struct http_composed_client_port_in *port_in;
    uint16_t i;

#ifdef SOL_FLOW_NODE_TYPE_DESCRIPTION_ENABLED
    struct sol_flow_node_type_description *desc;

    desc = (struct sol_flow_node_type_description *)self->base.description;
    if (desc) {
        if (desc->ports_in) {
            for (i = 0; i < self->ports_in.len; i++)
                free((struct sol_flow_port_description *)desc->ports_in[i]);
            free((struct sol_flow_port_description **)desc->ports_in);
        }
        if (desc->ports_out) {
            for (i = 0; i < self->ports_out.len; i++)
                free((struct sol_flow_port_description *)desc->ports_out[i]);
            free((struct sol_flow_port_description **)desc->ports_out);
        }
        free(desc);
    }
#endif

    SOL_VECTOR_FOREACH_IDX (&self->ports_in, port_in, i)
        free(port_in->name);
    SOL_VECTOR_FOREACH_IDX (&self->ports_out, port_out, i)
        free(port_out->name);

    sol_vector_clear(&self->ports_in);
    sol_vector_clear(&self->ports_out);
    free(self);
}
Exemplo n.º 19
0
static int
calculate_regexp_substrings(struct string_regexp_search_data *mdata,
    struct sol_flow_node *node)
{
    if (!(mdata->string && mdata->regexp))
        return 0;

    sol_vector_clear(&mdata->substrings);

    mdata->substrings = string_regexp_search_and_split(mdata);

    return sol_flow_send_irange_value_packet(node,
        SOL_FLOW_NODE_TYPE_STRING_REGEXP_SEARCH__OUT__LENGTH,
        mdata->substrings.len);
}
Exemplo n.º 20
0
static bool
_sml_load_fll_file(struct sml_engine *engine, const char *filename)
{
    struct sml_fuzzy_engine *fuzzy_engine = (struct sml_fuzzy_engine *)engine;

    if (!sml_fuzzy_load_file(fuzzy_engine->fuzzy, filename))
        return false;

    sml_observation_controller_clear(fuzzy_engine->observation_controller);
    sml_terms_manager_clear(&fuzzy_engine->terms_manager);
    sol_ptr_vector_clear(&fuzzy_engine->inputs_to_be_removed);
    sol_vector_clear(&fuzzy_engine->terms_to_be_removed);
    sol_ptr_vector_clear(&fuzzy_engine->outputs_to_be_removed);

    return true;
}
Exemplo n.º 21
0
struct sol_vector
sol_util_str_split(const struct sol_str_slice slice, const char *delim, size_t maxsplit)
{
    struct sol_vector v = SOL_VECTOR_INIT(struct sol_str_slice);
    ssize_t dlen, len;
    const char *str = slice.data;

    if (!slice.len || !delim)
        return v;

    maxsplit = (maxsplit) ? : slice.len;
    dlen = strlen(delim);
    len = slice.len;

#define CREATE_SLICE(_str, _len) \
    do { \
        s = sol_vector_append(&v); \
        if (!s) \
            goto err; \
        s->data = _str; \
        s->len = _len; \
    } while (0)

    while (str && (v.len < maxsplit)) {
        struct sol_str_slice *s;
        char *token = memmem(str, len, delim, dlen);
        if (!token) {
            CREATE_SLICE(str, len);
            break;
        }

        len -= (token - str) + dlen;
        CREATE_SLICE(str, token - str);
        str = token + dlen;
    }
#undef CREATE_SLICE

    return v;

err:
    sol_vector_clear(&v);
    return v;
}
Exemplo n.º 22
0
int
string_generator_open(
    struct sol_flow_node *node,
    void *data,
    const struct sol_flow_node_options *options)
{
    struct string_generator_data *mdata = data;
    const struct sol_flow_node_type_test_string_generator_options *opts =
        (const struct sol_flow_node_type_test_string_generator_options *)options;

    SOL_FLOW_NODE_OPTIONS_SUB_API_CHECK(options,
        SOL_FLOW_NODE_TYPE_TEST_STRING_GENERATOR_OPTIONS_API_VERSION,
        -EINVAL);
    sol_vector_init(&mdata->values, sizeof(struct sol_str_slice));
    if (opts->sequence == NULL || *opts->sequence == '\0') {
        SOL_ERR("Option 'sequence' is either NULL or empty.");
        return -EINVAL;
    }
    mdata->sequence = strdup(opts->sequence);
    SOL_NULL_CHECK_GOTO(mdata->sequence, no_memory);

    if (opts->interval < 0)
        SOL_WRN("Option 'interval' < 0, setting it to 0.");

    mdata->interval = opts->interval >= 0 ? opts->interval : 0;
    mdata->next_index = 0;

    mdata->values = sol_str_slice_split(sol_str_slice_from_str
            (mdata->sequence), opts->separator, SIZE_MAX);

    mdata->timer = sol_timeout_add(mdata->interval, timer_tick, node);
    SOL_NULL_CHECK_GOTO(mdata->timer, error);

    return 0;

no_memory:
    errno = -ENOMEM;
error:
    sol_vector_clear(&mdata->values);
    return errno;
}
Exemplo n.º 23
0
static void
on_fork_exit(void *data, uint64_t pid, int status)
{
    struct subprocess_data *mdata = data;

    mdata->fork_run = NULL;
    if (mdata->watches.in)
        sol_fd_del(mdata->watches.in);
    if (mdata->watches.err)
        sol_fd_del(mdata->watches.err);
    if (mdata->watches.out) {
        struct write_data *w;
        uint16_t i;
        sol_fd_del(mdata->watches.out);
        SOL_VECTOR_FOREACH_IDX (&mdata->write_data, w, i)
            sol_blob_unref(w->blob);
        sol_vector_clear(&mdata->write_data);
    }

    mdata->watches.in = NULL;
    mdata->watches.err = NULL;
    mdata->watches.out = NULL;
    sol_flow_send_irange_value_packet(mdata->node, SOL_FLOW_NODE_TYPE_PROCESS_SUBPROCESS__OUT__STATUS, status);
}