aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Phillips <dbphillipsnz@gmail.com>2016-05-16 21:31:23 +1200
committerDavid Phillips <dbphillipsnz@gmail.com>2016-05-16 21:31:23 +1200
commit1637ea7c6439ac88c88bb5d84c764d493aea3093 (patch)
treecbb929354cf105f4e076ef86876e9998b2976c29
parent863f94701805a81711231037a28e52322e704245 (diff)
downloadpgm-interlace-1637ea7c6439ac88c88bb5d84c764d493aea3093.tar.xz
Refactor closing members of f, fix return code bug on truncated input
-rw-r--r--pgm-interlace.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/pgm-interlace.c b/pgm-interlace.c
index eeaade4..db7ea2b 100644
--- a/pgm-interlace.c
+++ b/pgm-interlace.c
@@ -208,6 +208,14 @@ int parse_header(FILE *fd, char *magic, size_t magic_len, long *width, long *hei
return 0;
}
+void close_all(FILE **f, size_t f_len)
+{
+ size_t i = 0;
+
+ for (i = 0; i < f_len; i++)
+ fclose(f[i]);
+}
+
/**/
int write_pgm(FILE *fout, unsigned long size, unsigned int white, FILE **fin, size_t fin_len)
{
@@ -306,18 +314,21 @@ int main(int argc, char **argv)
|| white != new_white)
{
fprintf(stderr, "Error: '%s' doesn't have identical header to '%s', stop\n", argv[i+1], argv[1]);
+ close_all(f, clust_total);
return 1;
}
}
fprintf(stderr, "Full image size will be %ldx%ld, using %d images\n", size, size, clust_total);
- write_pgm(stdout, size, white, f, clust_total);
-
- /* close all input files */
- for (i = 1; i < argc; i++)
- fclose(f[i-1]);
+ if (write_pgm(stdout, size, white, f, clust_total))
+ {
+ close_all(f, clust_total);
+ return 1;
+ }
+ close_all(f, clust_total);
free(f);
+
return 0;
}