[pacman-dev] [PATCH] Add an archive_fgets() function
Dan McGee
dan at archlinux.org
Wed Mar 26 22:41:41 EDT 2008
This crude function allows reading from an archive on a line-by-line basis
similar to the familiar fgets() call on a FILE stream. This is the first
step in being able to read DB entries straight from an archive.
Signed-off-by: Dan McGee <dan at archlinux.org>
---
lib/libalpm/util.c | 29 +++++++++++++++++++++++++++++
lib/libalpm/util.h | 2 ++
2 files changed, 31 insertions(+), 0 deletions(-)
diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index 806f601..92a0a26 100644
--- a/lib/libalpm/util.c
+++ b/lib/libalpm/util.c
@@ -673,4 +673,33 @@ int _alpm_test_md5sum(const char *filepath, const char *md5sum)
return(ret);
}
+char *_alpm_archive_fgets(char *line, size_t size, struct archive *a)
+{
+ /* for now, just read one char at a time until we get to a
+ * '\n' char. we can optimize this later with an internal
+ * buffer. */
+ /* leave room for zero terminator */
+ int want = size - 1;
+ int loop;
+
+ for(loop = 0; loop < want; loop++) {
+ int ret = archive_read_data(a, line + loop, 1);
+ /* special check for first read- if null, return null,
+ * this indicates EOF */
+ if(loop == 0 && (ret <= 0 || line[loop] == '\0')) {
+ return(NULL);
+ }
+ /* check if read value was null or newline */
+ if(ret <= 0 || line[loop] == '\0' || line[loop] == '\n') {
+ want = loop + 1;
+ break;
+ }
+ }
+
+ /* always null terminate the buffer */
+ line[want] = '\0';
+
+ return(line);
+}
+
/* vim: set ts=2 sw=2 noet: */
diff --git a/lib/libalpm/util.h b/lib/libalpm/util.h
index 6849fa1..0bf122c 100644
--- a/lib/libalpm/util.h
+++ b/lib/libalpm/util.h
@@ -30,6 +30,7 @@
#include <stdarg.h>
#include <time.h>
#include <sys/stat.h> /* struct stat */
+#include <archive.h> /* struct archive */
#ifdef ENABLE_NLS
#include <libintl.h> /* here so it doesn't need to be included elsewhere */
@@ -66,6 +67,7 @@ char *_alpm_filecache_find(const char *filename);
const char *_alpm_filecache_setup(void);
int _alpm_lstat(const char *path, struct stat *buf);
int _alpm_test_md5sum(const char *filepath, const char *md5sum);
+char *_alpm_archive_fgets(char *line, size_t size, struct archive *a);
#ifndef HAVE_STRVERSCMP
int strverscmp(const char *, const char *);
--
1.5.4.4
More information about the pacman-dev
mailing list