Convert cpio to use memiter.
diff --git a/src/cpio.c b/src/cpio.c
index 2a00837..c6db268 100644
--- a/src/cpio.c
+++ b/src/cpio.c
@@ -20,63 +20,47 @@
};
#pragma pack(pop)
-void cpio_init(struct cpio *c, const void *buf, size_t size)
-{
- c->first = buf;
- c->total_size = size;
-}
-
-void cpio_init_iter(struct cpio *c, struct cpio_iter *iter)
-{
- iter->cur = c->first;
- iter->size_left = c->total_size;
-}
-
-bool cpio_next(struct cpio_iter *iter, const char **name, const void **contents,
+/**
+ * Retrieves the next file stored in the cpio archive stored in the cpio, and
+ * advances the iterator such that another call to this function would return
+ * the following file.
+ */
+bool cpio_next(struct memiter *iter, const char **name, const void **contents,
size_t *size)
{
- const struct cpio_header *h = iter->cur;
- size_t size_left;
- size_t filelen;
- size_t namelen;
+ size_t len;
+ struct memiter lit = *iter;
+ const struct cpio_header *h = (const struct cpio_header *)lit.next;
- size_left = iter->size_left;
- if (size_left < sizeof(struct cpio_header)) {
+ if (!memiter_advance(&lit, sizeof(struct cpio_header))) {
return false;
}
+ *name = lit.next;
+
/* TODO: Check magic. */
- size_left -= sizeof(struct cpio_header);
- namelen = (h->namesize + 1) & ~1;
- if (size_left < namelen) {
+ len = (h->namesize + 1) & ~1;
+ if (!memiter_advance(&lit, len)) {
return false;
}
- size_left -= namelen;
- filelen = (size_t)h->filesize[0] << 16 | h->filesize[1];
- if (size_left < filelen) {
+ *contents = lit.next;
+
+ len = (size_t)h->filesize[0] << 16 | h->filesize[1];
+ if (!memiter_advance(&lit, (len + 1) & ~1)) {
return false;
}
/* TODO: Check that string is null-terminated. */
- /* TODO: Check that trailler is not returned. */
/* Stop enumerating files when we hit the end marker. */
- if (!strcmp((const char *)(iter->cur + 1), "TRAILER!!!")) {
+ if (!strcmp(*name, "TRAILER!!!")) {
return false;
}
- size_left -= filelen;
-
- *name = (const char *)(iter->cur + 1);
- *contents = *name + namelen;
- *size = filelen;
-
- iter->cur = (struct cpio_header *)((char *)*contents + filelen);
- iter->cur =
- (struct cpio_header *)(char *)(((size_t)iter->cur + 1) & ~1);
- iter->size_left = size_left;
+ *size = len;
+ *iter = lit;
return true;
}