From f428cb8a3a9cef3a1f68be6434f8db6fa9b693ef Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Tue, 29 May 2018 21:38:18 +0000 Subject: [PATCH] lib: add vector_compact(), use after str splits * Add function to move all data to the start of a vector by shifting over contiguous empty slots * Use this function to remove empty slots leftover after frrstr_filter_vec Signed-off-by: Quentin Young --- lib/command.c | 6 ++++-- lib/vector.c | 10 ++++++++++ lib/vector.h | 1 + lib/vty.c | 1 + 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/command.c b/lib/command.c index edf7348ba7..b7690eac4c 100644 --- a/lib/command.c +++ b/lib/command.c @@ -290,10 +290,12 @@ vector cmd_make_strvec(const char *string) for (unsigned int i = 0; i < vector_active(result); i++) { if (strlen(vector_slot(result, i)) == 0) { XFREE(MTYPE_TMP, vector_slot(result, i)); - vector_remove(result, i); - --i; + vector_unset(result, i); } } + + vector_compact(result); + return result; } diff --git a/lib/vector.c b/lib/vector.c index 696e260cdf..0631e836f6 100644 --- a/lib/vector.c +++ b/lib/vector.c @@ -164,6 +164,16 @@ void vector_remove(vector v, unsigned int ix) v->index[v->active] = NULL; } +void vector_compact(vector v) +{ + for (unsigned int i = 0; i < vector_active(v); ++i) { + if (vector_slot(v, i) == NULL) { + vector_remove(v, i); + --i; + } + } +} + void vector_unset_value(vector v, void *val) { size_t i; diff --git a/lib/vector.h b/lib/vector.h index 21732a300e..97e15da040 100644 --- a/lib/vector.h +++ b/lib/vector.h @@ -53,6 +53,7 @@ extern int vector_set_index(vector v, unsigned int i, void *val); extern void vector_unset(vector v, unsigned int i); extern void vector_unset_value(vector v, void *val); extern void vector_remove(vector v, unsigned int ix); +extern void vector_compact(vector v); extern unsigned int vector_count(vector v); extern void vector_free(vector v); diff --git a/lib/vty.c b/lib/vty.c index 803b1c408d..9e9e90ef31 100644 --- a/lib/vty.c +++ b/lib/vty.c @@ -188,6 +188,7 @@ int vty_out(struct vty *vty, const char *format, ...) vector lines = frrstr_split_vec(buf, "\n"); frrstr_filter_vec(lines, &vty->include); + vector_compact(lines); /* * Consider the string "foo\n". If the regex is an empty string -- 2.39.5