Commit 75d58430 by Ramsay Jones Committed by Shawn O. Pearce

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>
parent def425bf
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "cc-compat.h" #include "cc-compat.h"
#include "util.h" #include "util.h"
#include "errors.h" #include "errors.h"
#include <assert.h>
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
......
...@@ -49,6 +49,43 @@ off_t gitfo_size(git_file fd) ...@@ -49,6 +49,43 @@ off_t gitfo_size(git_file fd)
return sb.st_size; 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 */ /* cached diskio */
struct gitfo_cache { struct gitfo_cache {
git_file fd; git_file fd;
......
...@@ -21,10 +21,18 @@ ...@@ -21,10 +21,18 @@
#include "errors.h" #include "errors.h"
#include "git/fileops.h" #include "git/fileops.h"
#define GITFO_BUF_INIT {NULL, 0}
typedef int git_file; typedef int git_file;
typedef struct stat gitfo_statbuf; typedef struct stat gitfo_statbuf;
typedef struct gitfo_cache gitfo_cache; 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_open(path, flags) open(path, flags)
#define gitfo_close(fd) close(fd) #define gitfo_close(fd) close(fd)
...@@ -37,6 +45,9 @@ extern off_t gitfo_size(git_file fd); ...@@ -37,6 +45,9 @@ extern off_t gitfo_size(git_file fd);
#define gitfo_stat(path, buf) stat(path, buf) #define gitfo_stat(path, buf) stat(path, buf)
#define gitfo_fsync(fd) fsync(fd) #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 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_write_cached(gitfo_cache *ioc, void *buf, size_t len);
extern int gitfo_flush_cached(gitfo_cache *ioc); extern int gitfo_flush_cached(gitfo_cache *ioc);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment