From dbfba3a1bed2a7ff465ba08a363618265bcd2be5 Mon Sep 17 00:00:00 2001 From: Olivier Matz Date: Tue, 15 Nov 2016 18:52:55 +0100 Subject: [PATCH] save --- lib/build/test | Bin 106472 -> 106896 bytes lib/ecoli_test.c | 175 ----------------------------- lib/ecoli_tk_shlex.c | 34 ++++++ lib/main.c | 258 ++++++++++++++++++++++++++++++++++++------- 4 files changed, 255 insertions(+), 212 deletions(-) diff --git a/lib/build/test b/lib/build/test index 6484b701ea0da19ca4b39b87c1ef215f5455280e..3e62c758853c8078587bfebad7fa696ddb4b5ac2 100755 GIT binary patch delta 30697 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 = file; - hdr->line = line; - hdr->size = size; - hdr->cookie = 0x12345678; - TAILQ_INSERT_TAIL(&debug_alloc_hdr_list, hdr, next); - ret = hdr + 1; - ftr = (struct debug_alloc_ftr *)( - (char *)hdr + size + sizeof(*hdr)); - ftr->cookie = 0x12345678; - } - - ec_log(EC_LOG_INFO, "%s:%d: info: malloc(%zd) -> %p\n", - file, line, size, ret); - - return ret; -} - -static void debug_free(void *ptr, const char *file, unsigned int line) -{ - struct debug_alloc_hdr *hdr, *h; - struct debug_alloc_ftr *ftr; - - (void)file; - (void)line; - - ec_log(EC_LOG_INFO, "%s:%d: info: free(%p)\n", file, line, ptr); - - if (ptr == NULL) - return; - - hdr = (ptr - sizeof(*hdr)); - if (hdr->cookie != 0x12345678) { - ec_log(EC_LOG_ERR, "%s:%d: error: free(%p): bad start cookie\n", - file, line, ptr); - abort(); - } - - ftr = (ptr + hdr->size); - if (ftr->cookie != 0x12345678) { - ec_log(EC_LOG_ERR, "%s:%d: error: free(%p): bad end cookie\n", - file, line, ptr); - abort(); - } - - TAILQ_FOREACH(h, &debug_alloc_hdr_list, next) { - if (h == hdr) - break; - } - - if (h == NULL) { - ec_log(EC_LOG_ERR, "%s:%d: error: free(%p): bad ptr\n", - file, line, ptr); - abort(); - } - - TAILQ_REMOVE(&debug_alloc_hdr_list, hdr, next); - free(hdr); -} - -void *debug_realloc(void *ptr, size_t size, const char *file, unsigned int line) -{ - struct debug_alloc_hdr *hdr, *h; - struct debug_alloc_ftr *ftr; - size_t new_size = size + sizeof(*hdr) + sizeof(unsigned int); - void *ret; - - if (ptr != NULL) { - hdr = (ptr - sizeof(*hdr)); - if (hdr->cookie != 0x12345678) { - ec_log(EC_LOG_ERR, - "%s:%d: error: realloc(%p): bad start cookie\n", - file, line, ptr); - abort(); - } - - ftr = (ptr + hdr->size); - if (ftr->cookie != 0x12345678) { - ec_log(EC_LOG_ERR, - "%s:%d: error: realloc(%p): bad end cookie\n", - file, line, ptr); - abort(); - } - - TAILQ_FOREACH(h, &debug_alloc_hdr_list, next) { - if (h == hdr) - break; - } - - if (h == NULL) { - ec_log(EC_LOG_ERR, "%s:%d: error: realloc(%p): bad ptr\n", - file, line, ptr); - abort(); - } - - TAILQ_REMOVE(&debug_alloc_hdr_list, h, next); - hdr = realloc(hdr, new_size); - if (hdr == NULL) { - TAILQ_INSERT_TAIL(&debug_alloc_hdr_list, h, next); - ret = NULL; - } else { - ret = hdr + 1; - } - } else { - hdr = realloc(NULL, new_size); - if (hdr == NULL) - ret = NULL; - else - ret = hdr + 1; - } - - if (hdr != NULL) { - hdr->file = file; - hdr->line = line; - hdr->size = size; - hdr->cookie = 0x12345678; - TAILQ_INSERT_TAIL(&debug_alloc_hdr_list, hdr, next); - ftr = (struct debug_alloc_ftr *)( - (char *)hdr + size + sizeof(*hdr)); - ftr->cookie = 0x12345678; - } - - ec_log(EC_LOG_INFO, "%s:%d: info: realloc(%p, %zd) -> %p\n", - file, line, ptr, size, ret); - - return ret; -} - -void debug_alloc_dump(void) -{ - struct debug_alloc_hdr *hdr; - - TAILQ_FOREACH(hdr, &debug_alloc_hdr_list, next) { - ec_log(EC_LOG_ERR, "%s:%d: error: memory leak size=%zd ptr=%p\n", - hdr->file, hdr->line, hdr->size, hdr + 1); - } -} - int ec_test_all(void) { struct ec_test *test; int ret = 0; - TAILQ_INIT(&debug_alloc_hdr_list); - - /* register a new malloc to trac memleaks */ - if (ec_malloc_register(debug_malloc, debug_free, debug_realloc) < 0) { - ec_log(EC_LOG_ERR, "cannot register new malloc\n"); - return -1; - } - TAILQ_FOREACH(test, &test_list, next) { if (test->test() == 0) { ec_log(EC_LOG_INFO, "== test %-20s success\n", @@ -332,8 +160,5 @@ int ec_test_all(void) } } - ec_malloc_unregister(); - debug_alloc_dump(); - return ret; } diff --git a/lib/ecoli_tk_shlex.c b/lib/ecoli_tk_shlex.c index 7b62c0c..3384557 100644 --- a/lib/ecoli_tk_shlex.c +++ b/lib/ecoli_tk_shlex.c @@ -176,6 +176,40 @@ static char **tokenize(const char *str, int add_empty) return NULL; } +/* XXX broken: how to support that: + shlex( + str("toto"), + many(str("titi")), + ) + + that would match: + toto + toto titi + toto titi titi ... + + --> maybe we should not try to create/match the spaces automatically + + it would become: + + shlex( + option(space()), auto? + str("toto"), + many( + space(), + str("titi coin"), + ), + option(space()), auto? + ) + + -> the goal of shlex would only be to unquote + -> the creation of auto-spaces would be in another token shcmd + + cmd = shcmd_new() + shcmd_add_tk("ip", tk_ip_new()) + shcmd_set_syntax("show ") + + + */ static struct ec_parsed_tk *ec_tk_shlex_parse(const struct ec_tk *gen_tk, const char *str) { diff --git a/lib/main.c b/lib/main.c index 601508a..a2d101b 100644 --- a/lib/main.c +++ b/lib/main.c @@ -28,54 +28,238 @@ #include #include #include +#include #include -#include -#include -#include -#include +#include -static void test(void) +static const char ec_short_options[] = + "h" /* help */ + ; + +enum { + /* long options */ + EC_OPT_LONG_MIN_NUM = 256, +#define EC_OPT_HELP "help" + EC_OPT_HELP_NUM, +}; + +static const struct option ec_long_options[] = { + {EC_OPT_HELP, 1, NULL, EC_OPT_HELP_NUM}, + {NULL, 0, NULL, 0} +}; + +static void usage(const char *prgname) +{ + printf("%s [options]\n" + " --"EC_OPT_HELP": show this help\n" + , prgname); +} + +static void parse_args(int argc, char **argv) +{ + int opt; + + while ((opt = getopt_long(argc, argv, ec_short_options, + ec_long_options, NULL)) != EOF) { + + switch (opt) { + case 'h': /* help */ + case EC_OPT_HELP_NUM: + usage(argv[0]); + exit(0); + + default: + usage(argv[0]); + exit(1); + } + } +} + +TAILQ_HEAD(debug_alloc_hdr_list, debug_alloc_hdr); +static struct debug_alloc_hdr_list debug_alloc_hdr_list = + TAILQ_HEAD_INITIALIZER(debug_alloc_hdr_list); + +struct debug_alloc_hdr { + TAILQ_ENTRY(debug_alloc_hdr) next; + const char *file; + unsigned int line; + size_t size; + unsigned int cookie; +}; + +struct debug_alloc_ftr { + unsigned int cookie; +} __attribute__((packed)); + +static void *debug_malloc(size_t size, const char *file, unsigned int line) +{ + struct debug_alloc_hdr *hdr; + struct debug_alloc_ftr *ftr; + size_t new_size = size + sizeof(*hdr) + sizeof(*ftr); + void *ret; + + hdr = malloc(new_size); + if (hdr == NULL) { + ret = NULL; + } else { + hdr->file = file; + hdr->line = line; + hdr->size = size; + hdr->cookie = 0x12345678; + TAILQ_INSERT_TAIL(&debug_alloc_hdr_list, hdr, next); + ret = hdr + 1; + ftr = (struct debug_alloc_ftr *)( + (char *)hdr + size + sizeof(*hdr)); + ftr->cookie = 0x12345678; + } + + ec_log(EC_LOG_INFO, "%s:%d: info: malloc(%zd) -> %p\n", + file, line, size, ret); + + return ret; +} + +static void debug_free(void *ptr, const char *file, unsigned int line) { - struct ec_tk *seq; - struct ec_parsed_tk *p; - const char *name; - - seq = ec_tk_seq_new_list(NULL, - ec_tk_str_new(NULL, "hello"), - ec_tk_space_new(NULL), - ec_tk_or_new_list("name", - ec_tk_str_new(NULL, "john"), - ec_tk_str_new(NULL, "mike"), - EC_TK_ENDLIST), - EC_TK_ENDLIST); - if (seq == NULL) { - printf("cannot create token\n"); + struct debug_alloc_hdr *hdr, *h; + struct debug_alloc_ftr *ftr; + + (void)file; + (void)line; + + ec_log(EC_LOG_INFO, "%s:%d: info: free(%p)\n", file, line, ptr); + + if (ptr == NULL) return; + + hdr = (ptr - sizeof(*hdr)); + if (hdr->cookie != 0x12345678) { + ec_log(EC_LOG_ERR, "%s:%d: error: free(%p): bad start cookie\n", + file, line, ptr); + abort(); + } + + ftr = (ptr + hdr->size); + if (ftr->cookie != 0x12345678) { + ec_log(EC_LOG_ERR, "%s:%d: error: free(%p): bad end cookie\n", + file, line, ptr); + abort(); + } + + TAILQ_FOREACH(h, &debug_alloc_hdr_list, next) { + if (h == hdr) + break; + } + + if (h == NULL) { + ec_log(EC_LOG_ERR, "%s:%d: error: free(%p): bad ptr\n", + file, line, ptr); + abort(); + } + + TAILQ_REMOVE(&debug_alloc_hdr_list, hdr, next); + free(hdr); +} + +void *debug_realloc(void *ptr, size_t size, const char *file, unsigned int line) +{ + struct debug_alloc_hdr *hdr, *h; + struct debug_alloc_ftr *ftr; + size_t new_size = size + sizeof(*hdr) + sizeof(unsigned int); + void *ret; + + if (ptr != NULL) { + hdr = (ptr - sizeof(*hdr)); + if (hdr->cookie != 0x12345678) { + ec_log(EC_LOG_ERR, + "%s:%d: error: realloc(%p): bad start cookie\n", + file, line, ptr); + abort(); + } + + ftr = (ptr + hdr->size); + if (ftr->cookie != 0x12345678) { + ec_log(EC_LOG_ERR, + "%s:%d: error: realloc(%p): bad end cookie\n", + file, line, ptr); + abort(); + } + + TAILQ_FOREACH(h, &debug_alloc_hdr_list, next) { + if (h == hdr) + break; + } + + if (h == NULL) { + ec_log(EC_LOG_ERR, "%s:%d: error: realloc(%p): bad ptr\n", + file, line, ptr); + abort(); + } + + TAILQ_REMOVE(&debug_alloc_hdr_list, h, next); + hdr = realloc(hdr, new_size); + if (hdr == NULL) { + TAILQ_INSERT_TAIL(&debug_alloc_hdr_list, h, next); + ret = NULL; + } else { + ret = hdr + 1; + } + } else { + hdr = realloc(NULL, new_size); + if (hdr == NULL) + ret = NULL; + else + ret = hdr + 1; + } + + if (hdr != NULL) { + hdr->file = file; + hdr->line = line; + hdr->size = size; + hdr->cookie = 0x12345678; + TAILQ_INSERT_TAIL(&debug_alloc_hdr_list, hdr, next); + ftr = (struct debug_alloc_ftr *)( + (char *)hdr + size + sizeof(*hdr)); + ftr->cookie = 0x12345678; } - /* ok */ - p = ec_tk_parse(seq, "hello mike"); - ec_parsed_tk_dump(stdout, 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"); - ec_parsed_tk_dump(stdout, 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); - - ec_tk_free(seq); + ec_log(EC_LOG_INFO, "%s:%d: info: realloc(%p, %zd) -> %p\n", + file, line, ptr, size, ret); + + return ret; +} + +void debug_alloc_dump(void) +{ + struct debug_alloc_hdr *hdr; + + TAILQ_FOREACH(hdr, &debug_alloc_hdr_list, next) { + ec_log(EC_LOG_ERR, "%s:%d: error: memory leak size=%zd ptr=%p\n", + hdr->file, hdr->line, hdr->size, hdr + 1); + } } -int main(void) +int main(int argc, char **argv) { - ec_test_all(); + int ret; + + parse_args(argc, argv); + + TAILQ_INIT(&debug_alloc_hdr_list); + /* register a new malloc to track memleaks */ + if (ec_malloc_register(debug_malloc, debug_free, debug_realloc) < 0) { + ec_log(EC_LOG_ERR, "cannot register new malloc\n"); + return -1; + } + + ret = ec_test_all(); + + ec_malloc_unregister(); + debug_alloc_dump(); - test(); + if (ret != 0) + printf("tests failed\n"); return 0; } -- 2.39.5