summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2010-11-09 18:57:18 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2010-11-09 23:22:41 (UTC)
commit958a95b37891098133369e835a2ab687e0dfa9dc (patch) (side-by-side diff)
tree31bcd62973d381b072b91da15528c48c6fc14a41
parent52558a6d39d52e2b2968b622534b0ffa4da285cb (diff)
downloadcgit-958a95b37891098133369e835a2ab687e0dfa9dc.zip
cgit-958a95b37891098133369e835a2ab687e0dfa9dc.tar.gz
cgit-958a95b37891098133369e835a2ab687e0dfa9dc.tar.bz2
Add vector utility functions
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--Makefile1
-rw-r--r--vector.c38
-rw-r--r--vector.h17
3 files changed, 56 insertions, 0 deletions
diff --git a/Makefile b/Makefile
index be1d796..31d88ef 100644
--- a/Makefile
+++ b/Makefile
@@ -58,96 +58,97 @@ endif
ifndef V
QUIET_CC = @echo ' ' CC $@;
QUIET_MM = @echo ' ' MM $@;
QUIET_SUBDIR0 = +@subdir=
QUIET_SUBDIR1 = ;$(NO_SUBDIR) echo ' ' SUBDIR $$subdir; \
$(MAKE) $(PRINT_DIR) -C $$subdir
endif
#
# Define a pattern rule for automatic dependency building
#
%.d: %.c
$(QUIET_MM)$(CC) $(CFLAGS) -MM -MP $< | sed -e 's/\($*\)\.o:/\1.o $@:/g' >$@
#
# Define a pattern rule for silent object building
#
%.o: %.c
$(QUIET_CC)$(CC) -o $*.o -c $(CFLAGS) $<
EXTLIBS = git/libgit.a git/xdiff/lib.a -lz -lpthread
OBJECTS =
OBJECTS += cache.o
OBJECTS += cgit.o
OBJECTS += cmd.o
OBJECTS += configfile.o
OBJECTS += html.o
OBJECTS += parsing.o
OBJECTS += scan-tree.o
OBJECTS += shared.o
OBJECTS += ui-atom.o
OBJECTS += ui-blob.o
OBJECTS += ui-clone.o
OBJECTS += ui-commit.o
OBJECTS += ui-diff.o
OBJECTS += ui-log.o
OBJECTS += ui-patch.o
OBJECTS += ui-plain.o
OBJECTS += ui-refs.o
OBJECTS += ui-repolist.o
OBJECTS += ui-shared.o
OBJECTS += ui-snapshot.o
OBJECTS += ui-ssdiff.o
OBJECTS += ui-stats.o
OBJECTS += ui-summary.o
OBJECTS += ui-tag.o
OBJECTS += ui-tree.o
+OBJECTS += vector.o
ifdef NEEDS_LIBICONV
EXTLIBS += -liconv
endif
.PHONY: all libgit test install uninstall clean force-version get-git \
doc man-doc html-doc clean-doc
all: cgit
VERSION: force-version
@./gen-version.sh "$(CGIT_VERSION)"
-include VERSION
CFLAGS += -g -Wall -Igit
CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER)'
CFLAGS += -DCGIT_VERSION='"$(CGIT_VERSION)"'
CFLAGS += -DCGIT_CONFIG='"$(CGIT_CONFIG)"'
CFLAGS += -DCGIT_SCRIPT_NAME='"$(CGIT_SCRIPT_NAME)"'
CFLAGS += -DCGIT_CACHE_ROOT='"$(CACHE_ROOT)"'
GIT_OPTIONS = prefix=/usr
ifdef NO_ICONV
CFLAGS += -DNO_ICONV
endif
ifdef NO_STRCASESTR
CFLAGS += -DNO_STRCASESTR
endif
ifdef NO_C99_FORMAT
CFLAGS += -DNO_C99_FORMAT
endif
ifdef NO_OPENSSL
CFLAGS += -DNO_OPENSSL
GIT_OPTIONS += NO_OPENSSL=1
else
EXTLIBS += -lcrypto
endif
cgit: $(OBJECTS) libgit
$(QUIET_CC)$(CC) $(CFLAGS) $(LDFLAGS) -o cgit $(OBJECTS) $(EXTLIBS)
cgit.o: VERSION
ifneq "$(MAKECMDGOALS)" "clean"
-include $(OBJECTS:.o=.d)
diff --git a/vector.c b/vector.c
new file mode 100644
index 0000000..0863908
--- a/dev/null
+++ b/vector.c
@@ -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;
+}
diff --git a/vector.h b/vector.h
new file mode 100644
index 0000000..c64eb1f
--- a/dev/null
+++ b/vector.h
@@ -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 */