X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=libecoli%2Fecoli_string.c;fp=libecoli%2Fecoli_string.c;h=77238181350e33d72297069cd7eab53d91564060;hb=90efcb0b905753a2eac864bc1a869781d7c31919;hp=0000000000000000000000000000000000000000;hpb=dec2d7fa17ae1e8b3d1dec8e396d057757baf4f3;p=protos%2Flibecoli.git diff --git a/libecoli/ecoli_string.c b/libecoli/ecoli_string.c new file mode 100644 index 0000000..7723818 --- /dev/null +++ b/libecoli/ecoli_string.c @@ -0,0 +1,78 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2016, Olivier MATZ + */ + +#include +#include +#include +#include + +#include +#include +#include + +/* count the number of identical chars at the beginning of 2 strings */ +size_t ec_strcmp_count(const char *s1, const char *s2) +{ + size_t i = 0; + + while (s1[i] && s2[i] && s1[i] == s2[i]) + i++; + + return i; +} + +int ec_str_startswith(const char *s, const char *beginning) +{ + size_t len; + + len = ec_strcmp_count(s, beginning); + if (beginning[len] == '\0') + return 1; + + return 0; +} + +int ec_vasprintf(char **buf, const char *fmt, va_list ap) +{ + char dummy; + int buflen, ret; + va_list aq; + + va_copy(aq, ap); + *buf = NULL; + ret = vsnprintf(&dummy, 1, fmt, aq); + va_end(aq); + if (ret < 0) + return ret; + + buflen = ret + 1; + *buf = ec_malloc(buflen); + if (*buf == NULL) + return -1; + + va_copy(aq, ap); + ret = vsnprintf(*buf, buflen, fmt, aq); + va_end(aq); + + ec_assert_print(ret < buflen, "invalid return value for vsnprintf"); + if (ret < 0) { + free(*buf); + *buf = NULL; + return -1; + } + + return ret; +} + +int ec_asprintf(char **buf, const char *fmt, ...) +{ + va_list ap; + int ret; + + va_start(ap, fmt); + ret = ec_vasprintf(buf, fmt, ap); + va_end(ap); + + return ret; +}