[hackers] [sent] improve error handling || Markus Teich

From: <git_AT_suckless.org>
Date: Sat, 6 Feb 2016 14:07:52 +0100 (CET)

commit 30192292793f02ca7504a05773d1456fe43db0d9
Author: Markus Teich <markus.teich_AT_stusta.mhn.de>
AuthorDate: Sat Feb 6 14:08:43 2016 +0100
Commit: Markus Teich <markus.teich_AT_stusta.mhn.de>
CommitDate: Sat Feb 6 14:08:43 2016 +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

diff --git a/sent.c b/sent.c
index 3a79b82..a098d3a 100644
--- a/sent.c
+++ b/sent.c
_AT_@ -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);
_AT_@ -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);
_AT_@ -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)
_AT_@ -216,7 +214,7 @@ fffree(Image *img)
         free(img);
 }
 
-int
+void
 ffread(Image *img)
 {
         uint32_t y, x;
_AT_@ -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 */
_AT_@ -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) {
_AT_@ -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);
_AT_@ -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
_AT_@ -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);
_AT_@ -445,6 +410,8 @@ eprintf(const char *fmt, ...)
         } else {
                 fputc('\n', stderr);
         }
+
+ exit(1);
 }
 
 void
_AT_@ -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);
         }
 }
 
_AT_@ -560,13 +527,6 @@ run()
 }
 
 void
-usage()
-{
- die("sent " VERSION " (c) 2014-2015 markus.teich_AT_stusta.mhn.de\n" \
- "usage: sent FILE1 [FILE2 ...]", argv0);
-}
-
-void
 xdraw()
 {
         unsigned int height, width, i;
_AT_@ -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);
         }
 }
 
_AT_@ -724,6 +685,13 @@ configure(XEvent *e)
         xdraw();
 }
 
+void
+usage()
+{
+ die("sent " VERSION " (c) 2014-2015 markus.teich_AT_stusta.mhn.de\n" \
+ "usage: sent FILE1 [FILE2 ...]", argv0);
+}
+
 int
 main(int argc, char *argv[])
 {
_AT_@ -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]);
                 }
         }
 
Received on Sat Feb 06 2016 - 14:07:52 CET

This archive was generated by hypermail 2.3.0 : Sat Feb 06 2016 - 14:12:13 CET