t* My version of sent
       
   URI git clone git://git.codevoid.de/sent-sdk.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 30192292793f02ca7504a05773d1456fe43db0d9
   DIR parent 77809fae79eb8b8acbb7198615717a96b08002b2
   URI Author: Markus Teich <markus.teich@stusta.mhn.de>
       Date:   Sat,  6 Feb 2016 14:08:43 +0100
       
       improve error handling
       
       - errors are now fatal
       - no need to clean up when dying
       - no need for status return codes => ffread and ffprepare now return void
       
       Diffstat:
         M sent.c                              |     114 +++++++++++--------------------
       
       1 file changed, 41 insertions(+), 73 deletions(-)
       ---
   DIR diff --git a/sent.c b/sent.c
       t@@ -89,14 +89,13 @@ typedef struct {
        
        static Image *ffopen(char *filename);
        static void fffree(Image *img);
       -static int ffread(Image *img);
       -static int ffprepare(Image *img);
       +static void ffread(Image *img);
       +static void ffprepare(Image *img);
        static void ffscale(Image *img);
        static void ffdraw(Image *img);
        
        static void getfontsize(Slide *s, unsigned int *width, unsigned int *height);
        static void cleanup();
       -static void eprintf(const char *, ...);
        static void die(const char *, ...);
        static void load(FILE *fp);
        static void advance(const Arg *arg);
       t@@ -142,11 +141,11 @@ filter(int fd, const char *cmd)
                int fds[2];
        
                if (pipe(fds) < 0)
       -                eprintf("pipe:");
       +                die("Unable to create pipe:");
        
                switch (fork()) {
                case -1:
       -                eprintf("fork:");
       +                die("Unable to fork:");
                case 0:
                        dup2(fd, 0);
                        dup2(fds[1], 1);
       t@@ -183,14 +182,13 @@ ffopen(char *filename)
                        return NULL;
        
                if ((fd = open(filename, O_RDONLY)) < 0) {
       -                eprintf("Unable to open file %s:", filename);
       -                return NULL;
       +                die("Unable to open file %s:", filename);
                }
        
                tmpfd = fd;
                fd = filter(fd, bin);
                if (fd < 0)
       -                eprintf("Unable to filter %s:", filename);
       +                die("Unable to filter %s:", filename);
                close(tmpfd);
        
                if (read(fd, hdr, 16) != 16)
       t@@ -216,7 +214,7 @@ fffree(Image *img)
                free(img);
        }
        
       -int
       +void
        ffread(Image *img)
        {
                uint32_t y, x;
       t@@ -226,25 +224,20 @@ ffread(Image *img)
                size_t rowlen, off, nbytes;
                ssize_t count;
        
       -        if (!img)
       -                return 0;
       -
                if (img->state & LOADED)
       -                return 2;
       +                return;
        
                if (img->buf)
                        free(img->buf);
                /* internally the image is stored in 888 format */
                if (!(img->buf = malloc(3 * img->bufwidth * img->bufheight)))
       -                return 0;
       +                die("Unable to malloc buffer for image.");
        
                /* scratch buffer to read row by row */
                rowlen = img->bufwidth * 2 * strlen("RGBA");
                row = malloc(rowlen);
                if (!row) {
       -                free(img->buf);
       -                img->buf = NULL;
       -                return 0;
       +                die("Unable to malloc buffer for image row.");
                }
        
                /* extract window background color channels for transparency */
       t@@ -257,7 +250,7 @@ ffread(Image *img)
                        while (nbytes < rowlen) {
                                count = read(img->fd, (char *)row + nbytes, rowlen - nbytes);
                                if (count < 0)
       -                                eprintf("Unable to read from pipe:");
       +                                die("Unable to read from pipe:");
                                nbytes += count;
                        }
                        for (x = 0; x < rowlen / 2; x += 4) {
       t@@ -276,11 +269,9 @@ ffread(Image *img)
                free(row);
                close(img->fd);
                img->state |= LOADED;
       -
       -        return 1;
        }
        
       -int
       +void
        ffprepare(Image *img)
        {
                int depth = DefaultDepth(xw.dpy, xw.scr);
       t@@ -292,35 +283,21 @@ ffprepare(Image *img)
                else
                        height = img->bufheight * xw.uw / img->bufwidth;
        
       -        if (depth < 24) {
       -                eprintf("Display depths <24 not supported.");
       -                return 0;
       -        }
       +        if (depth < 24)
       +                die("Display depths <24 not supported.");
        
                if (!(img->ximg = XCreateImage(xw.dpy, CopyFromParent, depth, ZPixmap, 0,
       -                                NULL, width, height, 32, 0))) {
       -                eprintf("Unable to create XImage.");
       -                return 0;
       -        }
       +                                       NULL, width, height, 32, 0)))
       +                die("Unable to create XImage.");
        
       -        if (!(img->ximg->data = malloc(img->ximg->bytes_per_line * height))) {
       -                eprintf("Unable to alloc data section for XImage.");
       -                XDestroyImage(img->ximg);
       -                img->ximg = NULL;
       -                return 0;
       -        }
       +        if (!(img->ximg->data = malloc(img->ximg->bytes_per_line * height)))
       +                die("Unable to alloc data section for XImage.");
        
       -        if (!XInitImage(img->ximg)) {
       -                eprintf("Unable to init XImage.");
       -                free(img->ximg->data);
       -                XDestroyImage(img->ximg);
       -                img->ximg = NULL;
       -                return 0;
       -        }
       +        if (!XInitImage(img->ximg))
       +                die("Unable to init XImage.");
        
                ffscale(img);
                img->state |= SCALED;
       -        return 1;
        }
        
        void
       t@@ -421,18 +398,6 @@ die(const char *fmt, ...)
        {
                va_list ap;
        
       -        va_start(ap, fmt);
       -        eprintf(fmt, ap);
       -        va_end(ap);
       -
       -        exit(1);
       -}
       -
       -void
       -eprintf(const char *fmt, ...)
       -{
       -        va_list ap;
       -
                fputs("sent: ", stderr);
        
                va_start(ap, fmt);
       t@@ -445,6 +410,8 @@ eprintf(const char *fmt, ...)
                } else {
                        fputc('\n', stderr);
                }
       +
       +        exit(1);
        }
        
        void
       t@@ -514,10 +481,10 @@ advance(const Arg *arg)
                                slides[idx].img->state &= ~(DRAWN | SCALED);
                        idx = new_idx;
                        xdraw();
       -                if (slidecount > idx + 1 && slides[idx + 1].img && !ffread(slides[idx + 1].img))
       -                        die("Unable to read image %s", slides[idx + 1].lines[0]);
       -                if (0 < idx && slides[idx - 1].img && !ffread(slides[idx - 1].img))
       -                        die("Unable to read image %s", slides[idx - 1].lines[0]);
       +                if (slidecount > idx + 1 && slides[idx + 1].img)
       +                        ffread(slides[idx + 1].img);
       +                if (0 < idx && slides[idx - 1].img)
       +                        ffread(slides[idx - 1].img);
                }
        }
        
       t@@ -560,13 +527,6 @@ run()
        }
        
        void
       -usage()
       -{
       -        die("sent " VERSION " (c) 2014-2015 markus.teich@stusta.mhn.de\n" \
       -        "usage: sent FILE1 [FILE2 ...]", argv0);
       -}
       -
       -void
        xdraw()
        {
                unsigned int height, width, i;
       t@@ -586,12 +546,13 @@ xdraw()
                                         slides[idx].lines[i],
                                         0);
                        drw_map(d, xw.win, 0, 0, xw.w, xw.h);
       -        } else if (!(im->state & LOADED) && !ffread(im)) {
       -                eprintf("Unable to read image %s", slides[idx].lines[0]);
       -        } else if (!(im->state & SCALED) && !ffprepare(im)) {
       -                eprintf("Unable to prepare image %s for drawing", slides[idx].lines[0]);
       -        } else if (!(im->state & DRAWN)) {
       -                ffdraw(im);
       +        } else {
       +                if (!(im->state & LOADED))
       +                        ffread(im);
       +                if (!(im->state & SCALED))
       +                        ffprepare(im);
       +                if (!(im->state & DRAWN))
       +                        ffdraw(im);
                }
        }
        
       t@@ -724,6 +685,13 @@ configure(XEvent *e)
                xdraw();
        }
        
       +void
       +usage()
       +{
       +        die("sent " VERSION " (c) 2014-2015 markus.teich@stusta.mhn.de\n" \
       +        "usage: sent FILE1 [FILE2 ...]", argv0);
       +}
       +
        int
        main(int argc, char *argv[])
        {
       t@@ -741,7 +709,7 @@ main(int argc, char *argv[])
                                load(fp);
                                fclose(fp);
                        } else {
       -                        eprintf("Unable to open '%s' for reading:", argv[i]);
       +                        die("Unable to open '%s' for reading:", argv[i]);
                        }
                }