Refactor ff2ppm(1) - farbfeld - suckless image format with conversion tools | |
git clone git://git.suckless.org/farbfeld | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 7a11656e9649247179bdae941683b4ac78e22586 | |
parent da99b58226c8dbb0cf764bbc7b42b7e3a36ff292 | |
Author: Laslo Hunhold <[email protected]> | |
Date: Wed, 12 Apr 2017 23:42:19 +0200 | |
Refactor ff2ppm(1) | |
We make use of the utility functions for parsing the color mask and | |
other things and generally align the code with the general coding style. | |
Diffstat: | |
M ff2ppm.c | 66 ++++++++++-------------------… | |
1 file changed, 20 insertions(+), 46 deletions(-) | |
--- | |
diff --git a/ff2ppm.c b/ff2ppm.c | |
@@ -21,65 +21,47 @@ usage(void) | |
int | |
main(int argc, char *argv[]) | |
{ | |
- size_t rowlen; | |
+ size_t rowlen, rowoutlen; | |
uint64_t a; | |
uint32_t width, height, i, j, k, l; | |
uint16_t *row, mask[3] = { 0xffff, 0xffff, 0xffff }; | |
uint8_t *rowout; | |
- char *color, colfmt[] = "%#x%#x%#x"; | |
- unsigned int collen, col[3], colfac; | |
- argv0 = argv[0]; | |
+ /* arguments */ | |
ARGBEGIN { | |
case 'b': | |
- color = EARGF(usage()); | |
- if (color[0] == '#') { | |
- color++; | |
- } | |
- collen = strlen(color); | |
- if (collen != 3 && collen != 6 && collen != 12) { | |
- usage(); | |
- } | |
- colfmt[1] = colfmt[4] = colfmt[7] = ((collen / 3) + '0'); | |
- if (sscanf(color, colfmt, col, col + 1, col + 2) != 3) { | |
+ if (parse_mask(EARGF(usage()), mask)) { | |
usage(); | |
} | |
- /* UINT16_MAX / 255 = 257; UINT16_MAX / 15 = 4369 */ | |
- colfac = (collen == 3) ? 4369 : (collen == 6) ? 257 : 1; | |
- for (i = 0; i < 3; i++) { | |
- mask[i] = col[i] * colfac; | |
- } | |
break; | |
default: | |
usage(); | |
} ARGEND | |
- if (argc) | |
+ if (argc) { | |
usage(); | |
- | |
- read_ff_header(&width, &height); | |
- | |
- if (width > SIZE_MAX / ((sizeof("RGBA") - 1) * sizeof(uint16_t))) { | |
- fprintf(stderr, "%s: row length integer overflow\n", argv0); | |
- return 1; | |
} | |
+ | |
+ /* prepare */ | |
+ ff_read_header(&width, &height); | |
+ row = ereallocarray(NULL, width, (sizeof("RGBA") - 1) * sizeof(uint16_… | |
+ rowout = ereallocarray(NULL, width, (sizeof("RGB") - 1) * sizeof(uint8… | |
rowlen = width * (sizeof("RGBA") - 1); | |
- if (!(row = malloc(rowlen * sizeof(uint16_t)))) { | |
- fprintf(stderr, "%s: malloc: %s\n", argv0, strerror(errno)); | |
- return 1; | |
- } | |
- if (!(rowout = malloc(width * (sizeof("RGB") - 1) * sizeof(uint8_t))))… | |
- fprintf(stderr, "%s: malloc: %s\n", argv0, strerror(errno)); | |
- return 1; | |
- } | |
+ rowoutlen = width * (sizeof("RGB") - 1); | |
- /* PPM binary */ | |
+ /* write data */ | |
printf("P6\n%" PRIu32 " %" PRIu32 "\n255\n", width, height); | |
- /* write rows */ | |
for (i = 0; i < height; ++i) { | |
if (fread(row, sizeof(uint16_t), rowlen, stdin) != rowlen) { | |
- goto readerr; | |
+ if (ferror(stdin)) { | |
+ fprintf(stderr, "%s: fread: %s\n", argv0, | |
+ strerror(errno)); | |
+ } else { | |
+ fprintf(stderr, "%s: unexpected end of file\n", | |
+ argv0); | |
+ } | |
+ return 1; | |
} | |
for (j = 0, k = 0; j < rowlen; j += 4, k += 3) { | |
a = ntohs(row[j + 3]); | |
@@ -89,19 +71,11 @@ main(int argc, char *argv[]) | |
(257 * 65535); | |
} | |
} | |
- if (fwrite(rowout, 3, width, stdout) != width) { | |
+ if (fwrite(rowout, sizeof(uint8_t), rowoutlen, stdout) != rowo… | |
fprintf(stderr, "%s: fwrite: %s\n", argv0, strerror(er… | |
return 1; | |
} | |
} | |
return 0; | |
-readerr: | |
- if (ferror(stdin)) { | |
- fprintf(stderr, "%s: fread: %s\n", argv0, strerror(errno)); | |
- } else { | |
- fprintf(stderr, "%s: unexpected end of file\n", argv0); | |
- } | |
- | |
- return 1; | |
} |