From 370740deec2b521df48065f890a794f7eaf2f1b6 Mon Sep 17 00:00:00 2001 From: Olivier Matz Date: Thu, 27 Oct 2016 21:53:58 +0200 Subject: [PATCH] malloc --- lib/Makefile | 1 + lib/build/test | Bin 56432 -> 62432 bytes lib/ecoli_malloc.c | 111 ++++++++++++++++++++++++++++++++++++++++++ lib/ecoli_malloc.h | 112 +++++++++++++++++++++++++++++++++++++++++++ lib/ecoli_test.c | 4 +- lib/ecoli_tk.c | 44 ++++++++--------- lib/ecoli_tk.h | 9 ++-- lib/ecoli_tk_empty.c | 3 +- lib/ecoli_tk_int.c | 13 ++--- lib/ecoli_tk_or.c | 17 +++---- lib/ecoli_tk_seq.c | 13 +++-- lib/ecoli_tk_space.c | 9 ++-- lib/ecoli_tk_str.c | 21 ++++---- lib/main.c | 4 +- 14 files changed, 295 insertions(+), 66 deletions(-) create mode 100644 lib/ecoli_malloc.c create mode 100644 lib/ecoli_malloc.h diff --git a/lib/Makefile b/lib/Makefile index 0ce853f..9aeeae2 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -36,6 +36,7 @@ CFLAGS += -I. srcs := ecoli_tk.c ecoli_tk_str.c ecoli_tk_seq.c srcs += ecoli_tk_space.c ecoli_tk_or.c ecoli_test.c srcs += ecoli_tk_empty.c ecoli_tk_int.c +srcs += ecoli_malloc.c shlib-y-$(O)libecoli.so := $(srcs) exe-y-$(O)test = $(srcs) main.c diff --git a/lib/build/test b/lib/build/test index ef618296857eef608dd9deb058415a75f1ebc47c..68efeb74356fe2fa3fc293875b7809a911c8cf2f 100755 GIT binary patch literal 62432 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 literal 56432 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 + * + * 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. + */ + + +#include + +#include +#include +#include + +struct ec_malloc_handler ec_malloc_handler; + +int ec_malloc_register(ec_malloc_t usr_malloc, ec_free_t usr_free, + ec_realloc_t usr_realloc) +{ + if (usr_malloc == NULL || usr_free == NULL || usr_realloc == NULL) + return -1; + + ec_malloc_handler.malloc = usr_malloc; + ec_malloc_handler.free = usr_free; + ec_malloc_handler.realloc = usr_realloc; + + return 0; +} + +void *__ec_malloc(size_t size) +{ + return ec_malloc_handler.malloc(size); +} + +void __ec_free(void *ptr) +{ + ec_malloc_handler.free(ptr); +} + +void *__ec_calloc(size_t nmemb, size_t size) +{ + void *ptr; + size_t total; + + total = size * nmemb; + if (nmemb != 0 && size != (total / nmemb)) { + errno = ENOMEM; + return NULL; + } + + ptr = __ec_malloc(total); + if (ptr == NULL) + return NULL; + + memset(ptr, 0, size); + return ptr; +} + +void *__ec_realloc(void *ptr, size_t size) +{ + return ec_malloc_handler.realloc(ptr, size); +} + +char *__ec_strdup(const char *s) +{ + size_t sz = strlen(s) + 1; + char *s2; + + s2 = __ec_malloc(sz); + if (s2 == NULL) + return NULL; + + memcpy(s2, s, sz); + + return s2; +} + +char *__ec_strndup(const char *s, size_t n) +{ + size_t sz = strnlen(s, n); + char *s2; + + s2 = __ec_malloc(sz + 1); + if (s2 == NULL) + return NULL; + + memcpy(s2, s, sz); + s2[sz] = '\0'; + + return s2; +} diff --git a/lib/ecoli_malloc.h b/lib/ecoli_malloc.h new file mode 100644 index 0000000..ddf1828 --- /dev/null +++ b/lib/ecoli_malloc.h @@ -0,0 +1,112 @@ +/* + * 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. + */ + +#ifndef ECOLI_MALLOC_ +#define ECOLI_MALLOC_ + +#include + +typedef void *(*ec_malloc_t)(size_t size); +typedef void (*ec_free_t)(void *ptr); +typedef void *(*ec_realloc_t)(void *ptr, size_t size); + +struct ec_malloc_handler { + ec_malloc_t malloc; + ec_free_t free; + ec_realloc_t realloc; +}; + +extern struct ec_malloc_handler ec_malloc_handler; + +int ec_malloc_register(ec_malloc_t usr_malloc, ec_free_t usr_free, + ec_realloc_t usr_realloc); + +/* internal */ +void *__ec_malloc(size_t size); +void __ec_free(void *ptr); +void *__ec_calloc(size_t nmemb, size_t size); +void *__ec_realloc(void *ptr, size_t size); +char *__ec_strdup(const char *s); +char *__ec_strndup(const char *s, size_t n); + +/* we use macros here to ensure the file/line stay correct when + * debugging the standard malloc with valgrind */ + +#define ec_malloc(sz) ({ \ + void *ret_; \ + if (ec_malloc_handler.malloc == NULL) \ + ret_ = malloc(sz); \ + else \ + ret_ = __ec_malloc(sz); \ + ret_; \ + }) + +#define ec_free(ptr) ({ \ + if (ec_malloc_handler.free == NULL) \ + free(ptr); \ + else \ + __ec_free(ptr); \ + }) + +#define ec_realloc(ptr, sz) ({ \ + void *ret_; \ + if (ec_malloc_handler.realloc == NULL) \ + ret_ = realloc(ptr, sz); \ + else \ + ret_ = __ec_realloc(ptr, sz); \ + ret_; \ + }) + +#define ec_calloc(n, sz) ({ \ + void *ret_; \ + if (ec_malloc_handler.malloc == NULL) \ + ret_ = calloc(n, sz); \ + else \ + ret_ = __ec_calloc(n, sz); \ + ret_; \ + }) + +#define ec_strdup(s) ({ \ + void *ret_; \ + if (ec_malloc_handler.malloc == NULL) \ + ret_ = strdup(s); \ + else \ + ret_ = __ec_strdup(s); \ + ret_; \ + }) + +#define ec_strndup(s, n) ({ \ + void *ret_; \ + if (ec_malloc_handler.malloc == NULL) \ + ret_ = strndup(s, n); \ + else \ + ret_ = __ec_strndup(s, n); \ + ret_; \ + }) + + +#endif diff --git a/lib/ecoli_test.c b/lib/ecoli_test.c index 6b4a43f..161c52c 100644 --- a/lib/ecoli_test.c +++ b/lib/ecoli_test.c @@ -47,7 +47,7 @@ int ec_test_check_tk_parse(const struct ec_tk *tk, const char *input, const char *s; int ret = -1; - p = ec_tk_parse(tk, input, 0); + p = ec_tk_parse(tk, input); s = ec_parsed_tk_to_string(p); if (s == NULL && expected == NULL) ret = 0; @@ -73,7 +73,7 @@ int ec_test_check_tk_complete(const struct ec_tk *tk, const char *input, const char *s; int ret = -1; - p = ec_tk_complete(tk, input, 0); + p = ec_tk_complete(tk, input); s = ec_completed_tk_smallest_start(p); if (s == NULL && expected == NULL) ret = 0; diff --git a/lib/ecoli_tk.c b/lib/ecoli_tk.c index 7c5ac21..6683af7 100644 --- a/lib/ecoli_tk.c +++ b/lib/ecoli_tk.c @@ -30,6 +30,7 @@ #include #include +#include #include struct ec_tk *ec_tk_new(const char *id, const struct ec_tk_ops *ops, @@ -39,12 +40,12 @@ struct ec_tk *ec_tk_new(const char *id, const struct ec_tk_ops *ops, assert(size >= sizeof(*tk)); - tk = calloc(1, size); + tk = ec_calloc(1, size); if (tk == NULL) goto fail; if (id != NULL) { - tk->id = strdup(id); + tk->id = ec_strdup(id); if (tk->id == NULL) goto fail; } @@ -65,16 +66,15 @@ void ec_tk_free(struct ec_tk *tk) if (tk->ops != NULL && tk->ops->free_priv != NULL) tk->ops->free_priv(tk); - free(tk->id); - free(tk); + ec_free(tk->id); + ec_free(tk); } -struct ec_parsed_tk *ec_tk_parse(const struct ec_tk *token, const char *str, - size_t off) +struct ec_parsed_tk *ec_tk_parse(const struct ec_tk *token, const char *str) { struct ec_parsed_tk *parsed_tk; - parsed_tk = token->ops->parse(token, str, off); + parsed_tk = token->ops->parse(token, str); return parsed_tk; } @@ -84,7 +84,7 @@ struct ec_parsed_tk *ec_parsed_tk_new(const struct ec_tk *tk) { struct ec_parsed_tk *parsed_tk; - parsed_tk = calloc(1, sizeof(*parsed_tk)); + parsed_tk = ec_calloc(1, sizeof(*parsed_tk)); if (parsed_tk == NULL) goto fail; @@ -109,8 +109,8 @@ void ec_parsed_tk_free(struct ec_parsed_tk *parsed_tk) TAILQ_REMOVE(&parsed_tk->children, child, next); ec_parsed_tk_free(child); } - free(parsed_tk->str); - free(parsed_tk); + ec_free(parsed_tk->str); + ec_free(parsed_tk); } static void __ec_parsed_tk_dump(const struct ec_parsed_tk *parsed_tk, @@ -175,11 +175,11 @@ const char *ec_parsed_tk_to_string(const struct ec_parsed_tk *parsed_tk) } struct ec_completed_tk *ec_tk_complete(const struct ec_tk *token, - const char *str, size_t off) + const char *str) { struct ec_completed_tk *completed_tk; - completed_tk = token->ops->complete(token, str, off); + completed_tk = token->ops->complete(token, str); return completed_tk; } @@ -188,7 +188,7 @@ struct ec_completed_tk *ec_completed_tk_new(void) { struct ec_completed_tk *completed_tk = NULL; - completed_tk = calloc(1, sizeof(*completed_tk)); + completed_tk = ec_calloc(1, sizeof(*completed_tk)); if (completed_tk == NULL) return NULL; @@ -203,13 +203,13 @@ struct ec_completed_tk_elt *ec_completed_tk_elt_new(const struct ec_tk *tk, { struct ec_completed_tk_elt *elt = NULL; - elt = calloc(1, sizeof(*elt)); + elt = ec_calloc(1, sizeof(*elt)); if (elt == NULL) return NULL; elt->tk = tk; - elt->add = strdup(add); - elt->full = strdup(full); + elt->add = ec_strdup(add); + elt->full = ec_strdup(full); if (elt->add == NULL || elt->full == NULL) { ec_completed_tk_elt_free(elt); return NULL; @@ -238,7 +238,7 @@ void ec_completed_tk_add_elt( completed_tk->count++; if (elt->add != NULL) { if (completed_tk->smallest_start == NULL) { - completed_tk->smallest_start = strdup(elt->add); + completed_tk->smallest_start = ec_strdup(elt->add); } else { n = strcmp_count(elt->add, completed_tk->smallest_start); @@ -249,9 +249,9 @@ void ec_completed_tk_add_elt( void ec_completed_tk_elt_free(struct ec_completed_tk_elt *elt) { - free(elt->add); - free(elt->full); - free(elt); + ec_free(elt->add); + ec_free(elt->full); + ec_free(elt); } struct ec_completed_tk *ec_completed_tk_merge( @@ -289,8 +289,8 @@ void ec_completed_tk_free(struct ec_completed_tk *completed_tk) TAILQ_REMOVE(&completed_tk->elts, elt, next); ec_completed_tk_elt_free(elt); } - free(completed_tk->smallest_start); - free(completed_tk); + ec_free(completed_tk->smallest_start); + ec_free(completed_tk); } void ec_completed_tk_dump(const struct ec_completed_tk *completed_tk) diff --git a/lib/ecoli_tk.h b/lib/ecoli_tk.h index 15be2be..167a528 100644 --- a/lib/ecoli_tk.h +++ b/lib/ecoli_tk.h @@ -37,9 +37,9 @@ struct ec_tk; struct ec_parsed_tk; typedef struct ec_parsed_tk *(*ec_tk_parse_t)(const struct ec_tk *tk, - const char *str, size_t off); + const char *str); typedef struct ec_completed_tk *(*ec_tk_complete_t)(const struct ec_tk *tk, - const char *str, size_t off); + const char *str); typedef void (*ec_tk_free_priv_t)(struct ec_tk *); struct ec_tk_ops { @@ -68,8 +68,7 @@ struct ec_parsed_tk { }; struct ec_parsed_tk *ec_parsed_tk_new(const struct ec_tk *tk); -struct ec_parsed_tk *ec_tk_parse(const struct ec_tk *token, const char *str, - size_t off); +struct ec_parsed_tk *ec_tk_parse(const struct ec_tk *token, const char *str); void ec_parsed_tk_add_child(struct ec_parsed_tk *parsed_tk, struct ec_parsed_tk *child); void ec_parsed_tk_dump(const struct ec_parsed_tk *parsed_tk); @@ -102,7 +101,7 @@ struct ec_completed_tk { * return "xyz" if it knows how to complete */ struct ec_completed_tk *ec_tk_complete(const struct ec_tk *token, - const char *str, size_t off); + const char *str); struct ec_completed_tk *ec_completed_tk_new(void); struct ec_completed_tk_elt *ec_completed_tk_elt_new(const struct ec_tk *tk, const char *add, const char *full); diff --git a/lib/ecoli_tk_empty.c b/lib/ecoli_tk_empty.c index e8e98e1..61d29b5 100644 --- a/lib/ecoli_tk_empty.c +++ b/lib/ecoli_tk_empty.c @@ -33,7 +33,7 @@ #include static struct ec_parsed_tk *parse(const struct ec_tk *gen_tk, - const char *str, size_t off) + const char *str) { struct ec_parsed_tk *parsed_tk; @@ -42,7 +42,6 @@ static struct ec_parsed_tk *parse(const struct ec_tk *gen_tk, return NULL; (void)str; - (void)off; parsed_tk->str = strdup(""); return parsed_tk; diff --git a/lib/ecoli_tk_int.c b/lib/ecoli_tk_int.c index 6bd4bfd..bc6ee87 100644 --- a/lib/ecoli_tk_int.c +++ b/lib/ecoli_tk_int.c @@ -32,6 +32,7 @@ #include #include +#include #include #include #include @@ -60,14 +61,14 @@ static size_t parse_llint(struct ec_tk_int *tk, const char *str, } static struct ec_parsed_tk *parse(const struct ec_tk *gen_tk, - const char *str, size_t off) + const char *str) { struct ec_tk_int *tk = (struct ec_tk_int *)gen_tk; struct ec_parsed_tk *parsed_tk; long long val; size_t len; - len = parse_llint(tk, str + off, &val); + len = parse_llint(tk, str, &val); if (len == 0) return NULL; @@ -75,7 +76,7 @@ static struct ec_parsed_tk *parse(const struct ec_tk *gen_tk, if (parsed_tk == NULL) return NULL; - parsed_tk->str = strndup(str + off, len); + parsed_tk->str = ec_strndup(str, len); return parsed_tk; } @@ -132,7 +133,7 @@ static int testcase(void) ret |= EC_TEST_CHECK_TK_PARSE(tk, "0x101", NULL); ret |= EC_TEST_CHECK_TK_PARSE(tk, " 1", NULL); - p = ec_tk_parse(tk, "0", 0); + p = ec_tk_parse(tk, "0"); s = ec_parsed_tk_to_string(p); if (s == NULL) { TEST_ERR(); @@ -141,7 +142,7 @@ static int testcase(void) TEST_ERR(); } - p = ec_tk_parse(tk, "10", 0); + p = ec_tk_parse(tk, "10"); s = ec_parsed_tk_to_string(p); if (s == NULL) { TEST_ERR(); @@ -165,7 +166,7 @@ static int testcase(void) "0x7fffffffffffffff"); ret |= EC_TEST_CHECK_TK_PARSE(tk, "-2", NULL); - p = ec_tk_parse(tk, "10", 0); + p = ec_tk_parse(tk, "10"); s = ec_parsed_tk_to_string(p); if (s == NULL) { TEST_ERR(); diff --git a/lib/ecoli_tk_or.c b/lib/ecoli_tk_or.c index dda2230..a81d669 100644 --- a/lib/ecoli_tk_or.c +++ b/lib/ecoli_tk_or.c @@ -31,13 +31,14 @@ #include #include +#include #include #include #include #include static struct ec_parsed_tk *parse(const struct ec_tk *gen_tk, - const char *str, size_t off) + const char *str) { struct ec_tk_or *tk = (struct ec_tk_or *)gen_tk; struct ec_parsed_tk *parsed_tk, *child_parsed_tk; @@ -48,7 +49,7 @@ static struct ec_parsed_tk *parse(const struct ec_tk *gen_tk, return NULL; for (i = 0; i < tk->len; i++) { - child_parsed_tk = ec_tk_parse(tk->table[i], str, off); + child_parsed_tk = ec_tk_parse(tk->table[i], str); if (child_parsed_tk != NULL) break; } @@ -58,7 +59,7 @@ static struct ec_parsed_tk *parse(const struct ec_tk *gen_tk, ec_parsed_tk_add_child(parsed_tk, child_parsed_tk); - parsed_tk->str = strndup(child_parsed_tk->str, + parsed_tk->str = ec_strndup(child_parsed_tk->str, strlen(child_parsed_tk->str)); return parsed_tk; @@ -69,14 +70,14 @@ static struct ec_parsed_tk *parse(const struct ec_tk *gen_tk, } static struct ec_completed_tk *complete(const struct ec_tk *gen_tk, - const char *str, size_t off) + const char *str) { struct ec_tk_or *tk = (struct ec_tk_or *)gen_tk; struct ec_completed_tk *completed_tk = NULL, *child_completed_tk; size_t n; for (n = 0; n < tk->len; n++) { - child_completed_tk = ec_tk_complete(tk->table[n], str, off); + child_completed_tk = ec_tk_complete(tk->table[n], str); if (child_completed_tk == NULL) continue; @@ -92,7 +93,7 @@ static void free_priv(struct ec_tk *gen_tk) { struct ec_tk_or *tk = (struct ec_tk_or *)gen_tk; - free(tk->table); + ec_free(tk->table); } static struct ec_tk_ops or_ops = { @@ -115,7 +116,7 @@ struct ec_tk *ec_tk_or_new(const char *id) return &tk->gen; fail: - free(tk); + ec_free(tk); return NULL; } @@ -144,7 +145,7 @@ struct ec_tk *ec_tk_or_new_list(const char *id, ...) return &tk->gen; fail: - free(tk); // XXX use tk_free? we need to delete all child on error + ec_free(tk); // XXX use tk_free? we need to delete all child on error va_end(ap); return NULL; } diff --git a/lib/ecoli_tk_seq.c b/lib/ecoli_tk_seq.c index 38c633a..a1d3e68 100644 --- a/lib/ecoli_tk_seq.c +++ b/lib/ecoli_tk_seq.c @@ -31,11 +31,14 @@ #include #include +#include #include #include +// XXX to handle the quote, it will be done in tk_shseq +// it will unquote the string and parse each token separately static struct ec_parsed_tk *parse(const struct ec_tk *tk, - const char *str, size_t off) + const char *str) { struct ec_tk_seq *seq = (struct ec_tk_seq *)tk; struct ec_parsed_tk *parsed_tk, *child_parsed_tk; @@ -47,7 +50,7 @@ static struct ec_parsed_tk *parse(const struct ec_tk *tk, return NULL; for (i = 0; i < seq->len; i++) { - child_parsed_tk = ec_tk_parse(seq->table[i], str, off + len); + child_parsed_tk = ec_tk_parse(seq->table[i], str + len); if (child_parsed_tk == NULL) goto fail; @@ -55,7 +58,7 @@ static struct ec_parsed_tk *parse(const struct ec_tk *tk, ec_parsed_tk_add_child(parsed_tk, child_parsed_tk); } - parsed_tk->str = strndup(str + off, len); + parsed_tk->str = ec_strndup(str, len); return parsed_tk; @@ -82,7 +85,7 @@ struct ec_tk *ec_tk_seq_new(const char *id) return &tk->gen; fail: - free(tk); + ec_free(tk); return NULL; } @@ -111,7 +114,7 @@ struct ec_tk *ec_tk_seq_new_list(const char *id, ...) return &tk->gen; fail: - free(tk); // XXX use tk_free? we need to delete all child on error + ec_free(tk); // XXX use tk_free? we need to delete all child on error va_end(ap); return NULL; } diff --git a/lib/ecoli_tk_space.c b/lib/ecoli_tk_space.c index ed2ee31..adc57c4 100644 --- a/lib/ecoli_tk_space.c +++ b/lib/ecoli_tk_space.c @@ -30,26 +30,27 @@ #include #include +#include #include #include static struct ec_parsed_tk *parse(const struct ec_tk *gen_tk, - const char *str, size_t off) + const char *str) { struct ec_parsed_tk *parsed_tk; size_t len = 0; - if (!isspace(str[off])) + if (!isspace(str[0])) return NULL; parsed_tk = ec_parsed_tk_new(gen_tk); if (parsed_tk == NULL) return NULL; - while (isspace(str[off + len])) + while (isspace(str[len])) len++; - parsed_tk->str = strndup(str + off, len); + parsed_tk->str = ec_strndup(str, len); return parsed_tk; } diff --git a/lib/ecoli_tk_str.c b/lib/ecoli_tk_str.c index 8152704..41f99db 100644 --- a/lib/ecoli_tk_str.c +++ b/lib/ecoli_tk_str.c @@ -29,30 +29,31 @@ #include #include +#include #include #include #include static struct ec_parsed_tk *parse(const struct ec_tk *gen_tk, - const char *str, size_t off) + const char *str) { struct ec_tk_str *tk = (struct ec_tk_str *)gen_tk; struct ec_parsed_tk *parsed_tk; - if (strncmp(str + off, tk->string, tk->len) != 0) + if (strncmp(str, tk->string, tk->len) != 0) return NULL; parsed_tk = ec_parsed_tk_new(gen_tk); if (parsed_tk == NULL) return NULL; - parsed_tk->str = strndup(str + off, tk->len); + parsed_tk->str = ec_strndup(str, tk->len); return parsed_tk; } static struct ec_completed_tk *complete(const struct ec_tk *gen_tk, - const char *str, size_t off) + const char *str) { struct ec_tk_str *tk = (struct ec_tk_str *)gen_tk; struct ec_completed_tk *completed_tk; @@ -60,11 +61,11 @@ static struct ec_completed_tk *complete(const struct ec_tk *gen_tk, size_t n; for (n = 0; n < tk->len; n++) { - if (str[off + n] != tk->string[n]) + if (str[n] != tk->string[n]) break; } - if (str[off + n] != '\0') + if (str[n] != '\0') return NULL; completed_tk = ec_completed_tk_new(); @@ -87,7 +88,7 @@ static void free_priv(struct ec_tk *gen_tk) { struct ec_tk_str *tk = (struct ec_tk_str *)gen_tk; - free(tk->string); + ec_free(tk->string); } static struct ec_tk_ops str_ops = { @@ -105,7 +106,7 @@ struct ec_tk *ec_tk_str_new(const char *id, const char *str) if (tk == NULL) goto fail; - s = strdup(str); + s = ec_strdup(str); if (s == NULL) goto fail; @@ -115,8 +116,8 @@ struct ec_tk *ec_tk_str_new(const char *id, const char *str) return &tk->gen; fail: - free(s); - free(tk); + ec_free(s); + ec_free(tk); return NULL; } diff --git a/lib/main.c b/lib/main.c index 54057b7..059515b 100644 --- a/lib/main.c +++ b/lib/main.c @@ -55,14 +55,14 @@ static void test(void) } /* ok */ - p = ec_tk_parse(seq, "hello mike", 0); + p = ec_tk_parse(seq, "hello mike"); ec_parsed_tk_dump(p); name = ec_parsed_tk_to_string(ec_parsed_tk_find_first(p, "name")); printf("parsed with name=%s\n", name); ec_parsed_tk_free(p); /* ko */ - p = ec_tk_parse(seq, "hello robert", 0); + p = ec_tk_parse(seq, "hello robert"); ec_parsed_tk_dump(p); name = ec_parsed_tk_to_string(ec_parsed_tk_find_first(p, "name")); printf("parsed with name=%s\n", name); -- 2.20.1