Refactor ff2ppm(1) - farbfeld - suckless image format with conversion tools
 (HTM) git clone git://git.suckless.org/farbfeld
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 7a11656e9649247179bdae941683b4ac78e22586
 (DIR) parent da99b58226c8dbb0cf764bbc7b42b7e3a36ff292
 (HTM) Author: Laslo Hunhold <dev@frign.de>
       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(-)
       ---
 (DIR) 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_t));
       +        rowout = ereallocarray(NULL, width, (sizeof("RGB") - 1) * sizeof(uint8_t));
                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) != rowoutlen) {
                                fprintf(stderr, "%s: fwrite: %s\n", argv0, strerror(errno));
                                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;
        }