Introduction
Introduction Statistics Contact Development Disclaimer Help
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]);
}
}
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.