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