delete temp files
authorMatthias Braun <matze@braunis.de>
Fri, 14 Nov 2008 12:55:25 +0000 (12:55 +0000)
committerMatthias Braun <matze@braunis.de>
Fri, 14 Nov 2008 12:55:25 +0000 (12:55 +0000)
[r23653]

TODO
main.c

diff --git a/TODO b/TODO
index ec4e14b..354fb16 100644 (file)
--- a/TODO
+++ b/TODO
@@ -34,4 +34,3 @@ Missing Warnings:
 
 main/driver:
 - delete output file if we had an error
-- delete temp files!
diff --git a/main.c b/main.c
index 9183285..9d60894 100644 (file)
--- a/main.c
+++ b/main.c
@@ -144,11 +144,13 @@ typedef enum filetype_t {
 } filetype_t;
 
 struct file_list_entry_t {
-       const char        *name; /**< filename or NULL for stdin */
-       filetype_t         type;
+       const char  *name; /**< filename or NULL for stdin */
+       filetype_t   type;
        file_list_entry_t *next;
 };
 
+static file_list_entry_t *temp_files;
+
 #if defined(_DEBUG) || defined(FIRM_DEBUG)
 /**
  * Debug printf implementation.
@@ -404,9 +406,34 @@ static FILE *make_temp_file(char *buffer, size_t buflen, const char *prefix)
                exit(1);
        }
 
+       file_list_entry_t *entry = xmalloc(sizeof(*entry));
+       memset(entry, 0, sizeof(*entry));
+
+       size_t  name_len = strlen(buffer) + 1;
+       char   *name     = malloc(name_len);
+       memcpy(name, buffer, name_len);
+       entry->name      = name;
+
+       entry->next = temp_files;
+       temp_files  = entry;
+
        return out;
 }
 
+static void free_temp_files(void)
+{
+       file_list_entry_t *entry = temp_files;
+       file_list_entry_t *next;
+       for ( ; entry != NULL; entry = next) {
+               next = entry->next;
+
+               unlink(entry->name);
+               free((char*) entry->name);
+               free(entry);
+       }
+       temp_files = NULL;
+}
+
 /**
  * Do the necessary lowering for compound parameters.
  */
@@ -575,6 +602,8 @@ int main(int argc, char **argv)
        bool               construct_dep_target = false;
        struct obstack     file_obst;
 
+       atexit(free_temp_files);
+
        /* hack for now... */
        if (strstr(argv[0], "pptest") != NULL) {
                extern int pptest_main(int argc, char **argv);