X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Fecoli_node_weakref.c;h=0a097aa99d27d24ba7e5540a08868a530d4d3d9d;hb=1d655de6043b607f39888c1bb88f72d071f2d49a;hp=603f02dbd3f5d60c1655939555c497763de850b7;hpb=90d09f5806b457e758ac7f4fadf485d24162d38f;p=protos%2Flibecoli.git diff --git a/lib/ecoli_node_weakref.c b/lib/ecoli_node_weakref.c index 603f02d..0a097aa 100644 --- a/lib/ecoli_node_weakref.c +++ b/lib/ecoli_node_weakref.c @@ -1,28 +1,5 @@ -/* - * Copyright (c) 2016, Olivier MATZ - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the University of California, Berkeley nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2016, Olivier MATZ */ #include @@ -37,31 +14,40 @@ #include #include #include -#include -#include +#include +#include #include #include #include +#include +#include +#include + +EC_LOG_TYPE_REGISTER(node_weakref); struct ec_node_weakref { struct ec_node gen; struct ec_node *child; }; -static struct ec_parsed *ec_node_weakref_parse(const struct ec_node *gen_node, - const struct ec_strvec *strvec) +static int +ec_node_weakref_parse(const struct ec_node *gen_node, + struct ec_parse *state, + const struct ec_strvec *strvec) { struct ec_node_weakref *node = (struct ec_node_weakref *)gen_node; - return ec_node_parse_strvec(node->child, strvec); + return ec_node_parse_child(node->child, state, strvec); } -static struct ec_completed *ec_node_weakref_complete(const struct ec_node *gen_node, - const struct ec_strvec *strvec) +static int +ec_node_weakref_complete(const struct ec_node *gen_node, + struct ec_comp *comp, + const struct ec_strvec *strvec) { struct ec_node_weakref *node = (struct ec_node_weakref *)gen_node; - return ec_node_complete_strvec(node->child, strvec); + return ec_node_complete_child(node->child, comp, strvec); } static struct ec_node_type ec_node_weakref_type = { @@ -77,21 +63,23 @@ int ec_node_weakref_set(struct ec_node *gen_node, struct ec_node *child) { struct ec_node_weakref *node = (struct ec_node_weakref *)gen_node; - // XXX check node type - assert(node != NULL); - if (child == NULL) - return -EINVAL; + if (child == NULL) { + errno = EINVAL; + goto fail; + } - gen_node->flags &= ~EC_NODE_F_BUILT; + if (ec_node_check_type(gen_node, &ec_node_weakref_type) < 0) + goto fail; node->child = child; - child->parent = gen_node; - TAILQ_INSERT_TAIL(&gen_node->children, child, next); // XXX really needed? - return 0; + +fail: + /* do not free child */ + return -1; } struct ec_node *ec_node_weakref(const char *id, struct ec_node *child) @@ -110,10 +98,54 @@ struct ec_node *ec_node_weakref(const char *id, struct ec_node *child) return gen_node; } +/* LCOV_EXCL_START */ static int ec_node_weakref_testcase(void) { - return 0; + struct ec_node *weak = NULL, *expr = NULL, *val = NULL; + struct ec_node *seq = NULL, *op = NULL; + int testres = 0; + + expr = ec_node("or", EC_NO_ID); + val = ec_node_int(EC_NO_ID, 0, 10, 10); + op = ec_node_str(EC_NO_ID, "!"); + weak = ec_node_weakref(EC_NO_ID, expr); + if (weak == NULL || expr == NULL || val == NULL || op == NULL) + goto fail; + seq = EC_NODE_SEQ(EC_NO_ID, op, weak); + op = NULL; + weak = NULL; + + if (ec_node_or_add(expr, seq) < 0) + goto fail; + seq = NULL; + if (ec_node_or_add(expr, val) < 0) + goto fail; + val = NULL; + + testres |= EC_TEST_CHECK_PARSE(expr, 1, "1"); + testres |= EC_TEST_CHECK_PARSE(expr, 2, "!", "1"); + testres |= EC_TEST_CHECK_PARSE(expr, 3, "!", "!", "1"); + + testres |= EC_TEST_CHECK_COMPLETE(expr, + "", EC_NODE_ENDLIST, + "!", EC_NODE_ENDLIST); + testres |= EC_TEST_CHECK_COMPLETE(expr, + "!", "", EC_NODE_ENDLIST, + "!", EC_NODE_ENDLIST); + + ec_node_free(expr); + + return testres; + +fail: + ec_node_free(weak); + ec_node_free(expr); + ec_node_free(val); + ec_node_free(seq); + ec_node_free(op); + return -1; } +/* LCOV_EXCL_STOP */ static struct ec_test ec_node_weakref_test = { .name = "node_weakref",