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>
This commit is contained in:
Quentin Young 2018-05-29 21:38:18 +00:00
parent 5d806ec6e0
commit f428cb8a3a
4 changed files with 16 additions and 2 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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);

View File

@ -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