aboutsummaryrefslogtreecommitdiff
path: root/file_loader.c
diff options
context:
space:
mode:
Diffstat (limited to 'file_loader.c')
-rw-r--r--file_loader.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/file_loader.c b/file_loader.c
index 27f871f..6e4aa3f 100644
--- a/file_loader.c
+++ b/file_loader.c
@@ -42,7 +42,7 @@ static void populate_lines(file_t *f)
//
// Read an entire file into memory.
//
-file_t *load_file(const char *filename)
+file_t *load_file(file_t **files, const char *filename)
{
if (filename == NULL) filename = "-";
int fd = streq(filename, "-") ? STDIN_FILENO : open(filename, O_RDONLY);
@@ -79,20 +79,28 @@ file_t *load_file(const char *filename)
finished_loading:
f->end = &f->contents[length];
populate_lines(f);
+ if (files != NULL) {
+ f->next = *files;
+ *files = f;
+ }
return f;
}
//
// Create a virtual file from a string.
//
-file_t *spoof_file(const char *filename, char *text)
+file_t *spoof_file(file_t **files, const char *filename, char *text)
{
if (filename == NULL) filename = "";
file_t *f = new(file_t);
f->filename = strdup(filename);
- f->contents = text;
+ f->contents = strdup(text);
f->end = &f->contents[strlen(text)];
populate_lines(f);
+ if (files != NULL) {
+ f->next = *files;
+ *files = f;
+ }
return f;
}
@@ -122,24 +130,23 @@ void destroy_file(file_t **f)
{
if ((*f)->filename) {
xfree(&((*f)->filename));
- (*f)->filename = NULL;
}
if ((*f)->lines) {
xfree(&((*f)->lines));
- (*f)->lines = NULL;
}
if ((*f)->contents) {
if ((*f)->mmapped) {
munmap((*f)->contents, (size_t)((*f)->end - (*f)->contents));
+ (*f)->contents = NULL;
} else {
xfree(&((*f)->contents));
}
- (*f)->contents = NULL;
}
while ((*f)->ops) {
+ destroy_op(&(*f)->ops->op);
allocated_op_t *tofree = (*f)->ops;
(*f)->ops = tofree->next;
memset(tofree, 'A', sizeof(allocated_op_t)); // Sentinel