diff options
| -rw-r--r-- | lib/command.c | 3 | ||||
| -rw-r--r-- | lib/graph.c | 8 | ||||
| -rw-r--r-- | lib/vector.c | 11 | ||||
| -rw-r--r-- | lib/vector.h | 1 | 
4 files changed, 18 insertions, 5 deletions
diff --git a/lib/command.c b/lib/command.c index ad0479dc9d..3bd578cf01 100644 --- a/lib/command.c +++ b/lib/command.c @@ -290,7 +290,8 @@ 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_unset(result, i); +			vector_remove(result, i); +			--i;  		}  	}  	return result; diff --git a/lib/graph.c b/lib/graph.c index a9e35b46ff..4bc3eb82b8 100644 --- a/lib/graph.c +++ b/lib/graph.c @@ -60,7 +60,7 @@ struct graph_node *graph_new_node(struct graph *graph, void *data,  	return node;  } -static void vector_remove(vector v, unsigned int ix) +static void graph_vector_remove(vector v, unsigned int ix)  {  	if (ix >= v->active)  		return; @@ -105,7 +105,7 @@ void graph_delete_node(struct graph *graph, struct graph_node *node)  	// remove node from graph->nodes  	for (unsigned int i = vector_active(graph->nodes); i--; /**/)  		if (vector_slot(graph->nodes, i) == node) { -			vector_remove(graph->nodes, i); +			graph_vector_remove(graph->nodes, i);  			break;  		} @@ -126,13 +126,13 @@ void graph_remove_edge(struct graph_node *from, struct graph_node *to)  	// remove from from to->from  	for (unsigned int i = vector_active(to->from); i--; /**/)  		if (vector_slot(to->from, i) == from) { -			vector_remove(to->from, i); +			graph_vector_remove(to->from, i);  			break;  		}  	// remove to from from->to  	for (unsigned int i = vector_active(from->to); i--; /**/)  		if (vector_slot(from->to, i) == to) { -			vector_remove(from->to, i); +			graph_vector_remove(from->to, i);  			break;  		}  } diff --git a/lib/vector.c b/lib/vector.c index ebac2b46e9..696e260cdf 100644 --- a/lib/vector.c +++ b/lib/vector.c @@ -153,6 +153,17 @@ void vector_unset(vector v, unsigned int i)  	}  } +void vector_remove(vector v, unsigned int ix) +{ +	if (ix >= v->active) +		return; + +	int n = (--v->active) - ix; + +	memmove(&v->index[ix], &v->index[ix + 1], n * sizeof(void *)); +	v->index[v->active] = NULL; +} +  void vector_unset_value(vector v, void *val)  {  	size_t i; diff --git a/lib/vector.h b/lib/vector.h index cc28fda480..21732a300e 100644 --- a/lib/vector.h +++ b/lib/vector.h @@ -52,6 +52,7 @@ extern int vector_set(vector v, void *val);  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 unsigned int vector_count(vector v);  extern void vector_free(vector v);  | 
