/* * Unit test for the vector_prepend function. Runs some example * operations and checks that results are as expected, writing * messages to the terminal so that errors can be detected and * pinpointed. * * \return zero on success. */ int test_prepend (void) { Vector vec; int ii; printf ("\nrunning test_prepend...\n"); vector_init (&vec); printf ("initialized: "); vector_dump (&vec); for (ii = -3; ii < 10; ++ii) { if (0 != vector_prepend (&vec, ii)) { printf ("test_prepend ERROR: could not prepend %d\n", ii); vector_destroy (&vec); return -1; } printf ("prepended %2d: ", ii); vector_dump (&vec); } for (ii = 0; ii < 13; ++ii) if (vec.arr[ii] != 9-ii) { printf ("test_prepend ERROR: arr[%d] should be %d but is %d\n", ii, 9-ii, vec.arr[ii]); vector_destroy (&vec); return -1; } printf ("test_prepend SUCCESS\n"); vector_destroy (&vec); return 0; }
void vector_insert(vector_t* v, size_t index, vector_t* peer) { #ifdef DEBUG if(v->element_size!=peer->element_size)warn("vector_insert(%p,%zd,%p), different element size (%zd!=%zd)",v,index,peer, v->element_size,peer->element_size); #endif if(index<0) vector_prepend(v, peer); else if(index>=v->length) vector_append(v, peer); else { if(v->length+peer->length>=v->size) { _vector_resize(v,v->size+peer->size*VECTOR_RESIZE_FACTOR+1); } memmove(v->data+v->element_size*(index+peer->length),v->data+v->element_size*(index),v->element_size*(v->length-index-1)); v->length+=peer->length; memcpy(v->data+v->element_size*index,peer->data,peer->length*v->element_size); } }
static HANDLE_FUNC (handle_addheader) { char *name = get_string_arg (line, &match[2]); char *value = get_string_arg (line, &match[3]); http_header_t *header; if (!conf->add_headers) { conf->add_headers = vector_create (); } header = (http_header_t *) safemalloc (sizeof (http_header_t)); header->name = name; header->value = value; vector_prepend (conf->add_headers, header, sizeof *header); safefree (header); /* Don't free name or value here, as they are referenced in the * struct inserted into the vector. */ return 0; }