summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorQuentin Young <qlyoung@cumulusnetworks.com>2018-05-29 21:38:18 +0000
committerQuentin Young <qlyoung@cumulusnetworks.com>2018-06-06 16:16:12 +0000
commitf428cb8a3a9cef3a1f68be6434f8db6fa9b693ef (patch)
treea9c9d4c739f9f9e8aa427e3e252c5a892513382c /lib
parent5d806ec6e0bce5f1cd32b0d5386c1ad97c31c1f8 (diff)
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 <qlyoung@cumulusnetworks.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/command.c6
-rw-r--r--lib/vector.c10
-rw-r--r--lib/vector.h1
-rw-r--r--lib/vty.c1
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