X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Fecoli_vec.c;h=fe8c5722fd51dd7ca47fcb48806ea14d656ae15e;hb=038508b2212449e82ff8ace9eae8742d99ed0186;hp=8038b31977ca84ca1ae300cff89c97720ccc66da;hpb=d6d6ef90d5fe1050feb0de33b318fd346096672e;p=protos%2Flibecoli.git diff --git a/lib/ecoli_vec.c b/lib/ecoli_vec.c index 8038b31..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,11 +9,14 @@ #include #include +#include #include #include #include #include +EC_LOG_TYPE_REGISTER(vec); + struct ec_vec { size_t len; size_t size; @@ -59,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; } @@ -90,14 +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; @@ -105,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); } @@ -178,6 +151,9 @@ fail: size_t ec_vec_len(const struct ec_vec *vec) { + if (vec == NULL) + return 0; + return vec->len; } @@ -204,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; } @@ -223,7 +198,7 @@ static void str_free(void *elt) } #define GOTO_FAIL do { \ - ec_log(EC_LOG_ERR, "%s:%d: test failed\n", \ + EC_LOG(EC_LOG_ERR, "%s:%d: test failed\n", \ __FILE__, __LINE__); \ goto fail; \ } while(0) @@ -457,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);