all repos — cgit @ 19e371c557bfb7c085ac343b901eb998de417e75

a hyperfast web frontend for git written in c

vector.c (view raw)

 1#include <stdio.h>
 2#include <string.h>
 3#include <errno.h>
 4#include "vector.h"
 5
 6static int grow(struct vector *vec, int gently)
 7{
 8	size_t new_alloc;
 9	void *new_data;
10
11	new_alloc = vec->alloc * 3 / 2;
12	if (!new_alloc)
13		new_alloc = 8;
14	new_data = realloc(vec->data, new_alloc * vec->size);
15	if (!new_data) {
16		if (gently)
17			return ENOMEM;
18		perror("vector.c:grow()");
19		exit(1);
20	}
21	vec->data = new_data;
22	vec->alloc = new_alloc;
23	return 0;
24}
25
26int vector_push(struct vector *vec, const void *data, int gently)
27{
28	int rc;
29
30	if (vec->count == vec->alloc && (rc = grow(vec, gently)))
31		return rc;
32	if (data)
33		memmove(vec->data + vec->count * vec->size, data, vec->size);
34	else
35		memset(vec->data + vec->count * vec->size, 0, vec->size);
36	vec->count++;
37	return 0;
38}