diff options
author | Ramsay Jones <ramsay@ramsay1.demon.co.uk> | 2008-12-18 22:56:14 +0000 |
---|---|---|
committer | Shawn O. Pearce <spearce@spearce.org> | 2008-12-19 07:21:20 -0800 |
commit | 75d584305598407be4c53d42c85eca3cd58c973c (patch) | |
tree | 150bce88353a5b322b1600a5989e126cf8288562 | |
parent | def425bf8568b9c1e20879bf5be6f9c52b7361c4 (diff) | |
download | libgit2-75d584305598407be4c53d42c85eca3cd58c973c.tar.gz |
Add a file reading routine along with an io buffer type
In particular, the gitfo_read_file() routine can be used to slurp
the complete file contents into an gitfo_buf structure. The buffer
content will be allocated by malloc() and may be released by the
gitfo_free_buf() routine. The io buffer type can be initialised
on the stack with the GITFO_BUF_INIT macro.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
-rw-r--r-- | src/common.h | 1 | ||||
-rw-r--r-- | src/fileops.c | 37 | ||||
-rw-r--r-- | src/fileops.h | 11 |
3 files changed, 49 insertions, 0 deletions
diff --git a/src/common.h b/src/common.h index f5be02b49..bdf233425 100644 --- a/src/common.h +++ b/src/common.h @@ -4,6 +4,7 @@ #include "cc-compat.h" #include "util.h" #include "errors.h" +#include <assert.h> #include <errno.h> #include <stdlib.h> #include <unistd.h> diff --git a/src/fileops.c b/src/fileops.c index e5f6ef800..caa7d9e0c 100644 --- a/src/fileops.c +++ b/src/fileops.c @@ -49,6 +49,43 @@ off_t gitfo_size(git_file fd) return sb.st_size; } +int gitfo_read_file(gitfo_buf *obj, const char *path) +{ + git_file fd; + off_t len; + void *buff; + + assert(obj && path && *path); + + if ((fd = gitfo_open(path, O_RDONLY)) < 0) + return GIT_ERROR; /* TODO: error handling */ + + if (((len = gitfo_size(fd)) < 0) || ((buff = malloc(len)) == NULL)) { + gitfo_close(fd); + return GIT_ERROR; /* TODO: error handling */ + } + + if (gitfo_read(fd, buff, len) < 0) { + gitfo_close(fd); + free(buff); + return GIT_ERROR; /* TODO: error handling */ + } + + gitfo_close(fd); + + obj->data = buff; + obj->len = len; + + return GIT_SUCCESS; +} + +void gitfo_free_buf(gitfo_buf *obj) +{ + assert(obj); + free(obj->data); + obj->data = NULL; +} + /* cached diskio */ struct gitfo_cache { git_file fd; diff --git a/src/fileops.h b/src/fileops.h index 2683a6b43..d25d5d3bc 100644 --- a/src/fileops.h +++ b/src/fileops.h @@ -21,10 +21,18 @@ #include "errors.h" #include "git/fileops.h" +#define GITFO_BUF_INIT {NULL, 0} + typedef int git_file; typedef struct stat gitfo_statbuf; typedef struct gitfo_cache gitfo_cache; +typedef struct { /* file io buffer */ + void *data; /* data bytes */ + size_t len; /* data length */ +} gitfo_buf; + + #define gitfo_open(path, flags) open(path, flags) #define gitfo_close(fd) close(fd) @@ -37,6 +45,9 @@ extern off_t gitfo_size(git_file fd); #define gitfo_stat(path, buf) stat(path, buf) #define gitfo_fsync(fd) fsync(fd) +extern int gitfo_read_file(gitfo_buf *obj, const char *path); +extern void gitfo_free_buf(gitfo_buf *obj); + extern gitfo_cache *gitfo_enable_caching(git_file fd, size_t cache_size); extern int gitfo_write_cached(gitfo_cache *ioc, void *buf, size_t len); extern int gitfo_flush_cached(gitfo_cache *ioc); |