X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Fecoli_vec.c;h=fe8c5722fd51dd7ca47fcb48806ea14d656ae15e;hb=15718f19cbf3868bf6fba79f4e26b5254c57873e;hp=871911da8ac4b06b02f89f8dc1cb0a587f5fb6d7;hpb=a936ea741c1135e46e04b4dd75b95adc2ac201cb;p=protos%2Flibecoli.git diff --git a/lib/ecoli_vec.c b/lib/ecoli_vec.c index 871911d..fe8c572 100644 --- a/lib/ecoli_vec.c +++ b/lib/ecoli_vec.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 @@ -32,6 +9,7 @@ #include #include +#include #include #include #include @@ -61,7 +39,7 @@ ec_vec(size_t elt_size, size_t size, ec_vec_elt_copy_t copy, struct ec_vec *vec; if (elt_size == 0) { - errno = -EINVAL; + errno = EINVAL; return NULL; } @@ -92,15 +70,12 @@ int ec_vec_add_by_ref(struct ec_vec *vec, void *ptr) if (vec->len + 1 > vec->size) { new_vec = ec_realloc(vec->vec, vec->elt_size * (vec->len + 1)); if (new_vec == NULL) - return -ENOMEM; + return -1; vec->size = vec->len + 1; + vec->vec = new_vec; } - vec->vec = new_vec; - if (vec->copy) - vec->copy(get_obj(vec, vec->len), ptr); - else - memcpy(get_obj(vec, vec->len), ptr, vec->elt_size); + memcpy(get_obj(vec, vec->len), ptr, vec->elt_size); vec->len++; return 0; @@ -108,40 +83,35 @@ int ec_vec_add_by_ref(struct ec_vec *vec, void *ptr) int ec_vec_add_ptr(struct ec_vec *vec, void *elt) { - if (vec->elt_size != sizeof(elt)) - return -EINVAL; + EC_CHECK_ARG(vec->elt_size == sizeof(elt), -1, EINVAL); return ec_vec_add_by_ref(vec, &elt); } int ec_vec_add_u8(struct ec_vec *vec, uint8_t elt) { - if (vec->elt_size != sizeof(elt)) - return -EINVAL; + EC_CHECK_ARG(vec->elt_size == sizeof(elt), -1, EINVAL); return ec_vec_add_by_ref(vec, &elt); } int ec_vec_add_u16(struct ec_vec *vec, uint16_t elt) { - if (vec->elt_size != sizeof(elt)) - return -EINVAL; + EC_CHECK_ARG(vec->elt_size == sizeof(elt), -1, EINVAL); return ec_vec_add_by_ref(vec, &elt); } int ec_vec_add_u32(struct ec_vec *vec, uint32_t elt) { - if (vec->elt_size != sizeof(elt)) - return -EINVAL; + EC_CHECK_ARG(vec->elt_size == sizeof(elt), -1, EINVAL); return ec_vec_add_by_ref(vec, &elt); } int ec_vec_add_u64(struct ec_vec *vec, uint64_t elt) { - if (vec->elt_size != sizeof(elt)) - return -EINVAL; + EC_CHECK_ARG(vec->elt_size == sizeof(elt), -1, EINVAL); return ec_vec_add_by_ref(vec, &elt); } @@ -181,6 +151,9 @@ fail: size_t ec_vec_len(const struct ec_vec *vec) { + if (vec == NULL) + return 0; + return vec->len; } @@ -207,13 +180,12 @@ void ec_vec_free(struct ec_vec *vec) int ec_vec_get(void *ptr, const struct ec_vec *vec, size_t idx) { - if (vec == NULL || idx >= vec->len) - return -EINVAL; + if (vec == NULL || idx >= vec->len) { + errno = EINVAL; + return -1; + } - if (vec->copy) - vec->copy(ptr, get_obj(vec, idx)); - else - memcpy(ptr, get_obj(vec, idx), vec->elt_size); + memcpy(ptr, get_obj(vec, idx), vec->elt_size); return 0; } @@ -460,15 +432,15 @@ static int ec_vec_testcase(void) if (ec_vec_get(&vals, vec, 0) < 0) GOTO_FAIL; - if (strcmp(vals, "0")) + if (vals == NULL || strcmp(vals, "0")) GOTO_FAIL; if (ec_vec_get(&vals, vec, 1) < 0) GOTO_FAIL; - if (strcmp(vals, "1")) + if (vals == NULL || strcmp(vals, "1")) GOTO_FAIL; if (ec_vec_get(&vals, vec, 2) < 0) GOTO_FAIL; - if (strcmp(vals, "2")) + if (vals == NULL || strcmp(vals, "2")) GOTO_FAIL; ec_vec_free(vec);