improve error handling - sent - simple plaintext presentation tool | |
git clone git://git.suckless.org/sent | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 30192292793f02ca7504a05773d1456fe43db0d9 | |
parent 77809fae79eb8b8acbb7198615717a96b08002b2 | |
Author: Markus Teich <[email protected]> | |
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(-) | |
--- | |
diff --git a/sent.c b/sent.c | |
@@ -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); | |
@@ -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); | |
@@ -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) | |
@@ -216,7 +214,7 @@ fffree(Image *img) | |
free(img); | |
} | |
-int | |
+void | |
ffread(Image *img) | |
{ | |
uint32_t y, x; | |
@@ -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 */ | |
@@ -257,7 +250,7 @@ ffread(Image *img) | |
while (nbytes < rowlen) { | |
count = read(img->fd, (char *)row + nbytes, rowlen - n… | |
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) { | |
@@ -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); | |
@@ -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,… | |
- 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 | |
@@ -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); | |
@@ -445,6 +410,8 @@ eprintf(const char *fmt, ...) | |
} else { | |
fputc('\n', stderr); | |
} | |
+ | |
+ exit(1); | |
} | |
void | |
@@ -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(sli… | |
- die("Unable to read image %s", slides[idx + 1].lines[0… | |
- if (0 < idx && slides[idx - 1].img && !ffread(slides[idx - 1].… | |
- 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); | |
} | |
} | |
@@ -560,13 +527,6 @@ run() | |
} | |
void | |
-usage() | |
-{ | |
- die("sent " VERSION " (c) 2014-2015 [email protected]\n" \ | |
- "usage: sent FILE1 [FILE2 ...]", argv0); | |
-} | |
- | |
-void | |
xdraw() | |
{ | |
unsigned int height, width, i; | |
@@ -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].… | |
- } 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); | |
} | |
} | |
@@ -724,6 +685,13 @@ configure(XEvent *e) | |
xdraw(); | |
} | |
+void | |
+usage() | |
+{ | |
+ die("sent " VERSION " (c) 2014-2015 [email protected]\n" \ | |
+ "usage: sent FILE1 [FILE2 ...]", argv0); | |
+} | |
+ | |
int | |
main(int argc, char *argv[]) | |
{ | |
@@ -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]); | |
} | |
} | |