Add vector utility functions
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
This commit is contained in:
		
							
								
								
									
										1
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								Makefile
									
									
									
									
									
								
							@@ -103,6 +103,7 @@ OBJECTS += ui-stats.o
 | 
			
		||||
OBJECTS += ui-summary.o
 | 
			
		||||
OBJECTS += ui-tag.o
 | 
			
		||||
OBJECTS += ui-tree.o
 | 
			
		||||
OBJECTS += vector.o
 | 
			
		||||
 | 
			
		||||
ifdef NEEDS_LIBICONV
 | 
			
		||||
	EXTLIBS += -liconv
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										38
									
								
								vector.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								vector.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include "vector.h"
 | 
			
		||||
 | 
			
		||||
static int grow(struct vector *vec, int gently)
 | 
			
		||||
{
 | 
			
		||||
	size_t new_alloc;
 | 
			
		||||
	void *new_data;
 | 
			
		||||
 | 
			
		||||
	new_alloc = vec->alloc * 3 / 2;
 | 
			
		||||
	if (!new_alloc)
 | 
			
		||||
		new_alloc = 8;
 | 
			
		||||
	new_data = realloc(vec->data, new_alloc * vec->size);
 | 
			
		||||
	if (!new_data) {
 | 
			
		||||
		if (gently)
 | 
			
		||||
			return ENOMEM;
 | 
			
		||||
		perror("vector.c:grow()");
 | 
			
		||||
		exit(1);
 | 
			
		||||
	}
 | 
			
		||||
	vec->data = new_data;
 | 
			
		||||
	vec->alloc = new_alloc;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int vector_push(struct vector *vec, const void *data, int gently)
 | 
			
		||||
{
 | 
			
		||||
	int rc;
 | 
			
		||||
 | 
			
		||||
	if (vec->count == vec->alloc && (rc = grow(vec, gently)))
 | 
			
		||||
		return rc;
 | 
			
		||||
	if (data)
 | 
			
		||||
		memmove(vec->data + vec->count * vec->size, data, vec->size);
 | 
			
		||||
	else
 | 
			
		||||
		memset(vec->data + vec->count * vec->size, 0, vec->size);
 | 
			
		||||
	vec->count++;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								vector.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								vector.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
#ifndef CGIT_VECTOR_H
 | 
			
		||||
#define CGIT_VECTOR_H
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
struct vector {
 | 
			
		||||
	size_t size;
 | 
			
		||||
	size_t count;
 | 
			
		||||
	size_t alloc;
 | 
			
		||||
	void *data;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define VECTOR_INIT(type) {sizeof(type), 0, 0, NULL}
 | 
			
		||||
 | 
			
		||||
int vector_push(struct vector *vec, const void *data, int gently);
 | 
			
		||||
 | 
			
		||||
#endif /* CGIT_VECTOR_H */
 | 
			
		||||
		Referens i nytt ärende
	
	Block a user