tex: report failures when reading or writing files - neatvi - [fork] simple vi-type editor with UTF-8 support
HTML git clone git://src.adamsgaard.dk/neatvi
DIR Log
DIR Files
DIR Refs
DIR README
---
DIR commit 1c7721d44a7eca5625abb8848294646e9c786f6e
DIR parent 849e2276726b60138737f4fbf260ed3e04f5965b
HTML Author: Ali Gholami Rudi <ali@rudi.ir>
Date: Thu, 14 Apr 2016 01:13:16 +0430
ex: report failures when reading or writing files
Suggested and tested by Christian Neukirchen <chneukirchen@gmail.com>.
Diffstat:
M ex.c | 19 +++++++++++++++----
M lbuf.c | 24 ++++++++++++++++++------
M vi.h | 4 ++--
3 files changed, 35 insertions(+), 12 deletions(-)
---
DIR diff --git a/ex.c b/ex.c
t@@ -379,11 +379,14 @@ static int ec_edit(char *ec)
bufs_switch(bufs_open(path));
fd = open(ex_path(), O_RDONLY);
if (fd >= 0) {
- lbuf_rd(xb, fd, 0, lbuf_len(xb));
+ int rd = lbuf_rd(xb, fd, 0, lbuf_len(xb));
close(fd);
snprintf(msg, sizeof(msg), "\"%s\" %d lines [r]\n",
ex_path(), lbuf_len(xb));
- ex_show(msg);
+ if (rd)
+ ex_show("read failed\n");
+ else
+ ex_show(msg);
}
lbuf_saved(xb, path[0] != '\0');
bufs[0].mtime = mtime(ex_path());
t@@ -420,7 +423,11 @@ static int ec_read(char *ec)
ex_show("read failed\n");
return 1;
}
- lbuf_rd(xb, fd, pos, pos);
+ if (lbuf_rd(xb, fd, pos, pos)) {
+ ex_show("read failed\n");
+ close(fd);
+ return 1;
+ }
close(fd);
}
xrow = end + lbuf_len(xb) - n - 1;
t@@ -469,7 +476,11 @@ static int ec_write(char *ec)
ex_show("write failed\n");
return 1;
}
- lbuf_wr(xb, fd, beg, end);
+ if (lbuf_wr(xb, fd, beg, end)) {
+ ex_show("write failed\n");
+ close(fd);
+ return 1;
+ }
close(fd);
}
snprintf(msg, sizeof(msg), "\"%s\" %d lines [w]\n",
DIR diff --git a/lbuf.c b/lbuf.c
t@@ -200,23 +200,35 @@ static void lbuf_opt(struct lbuf *lb, char *buf, int pos, int n_del)
lbuf_savemark(lb, lo, i);
}
-void lbuf_rd(struct lbuf *lbuf, int fd, int beg, int end)
+int lbuf_rd(struct lbuf *lbuf, int fd, int beg, int end)
{
char buf[1 << 10];
struct sbuf *sb;
- int nr;
+ long nr;
sb = sbuf_make();
while ((nr = read(fd, buf, sizeof(buf))) > 0)
sbuf_mem(sb, buf, nr);
- lbuf_edit(lbuf, sbuf_buf(sb), beg, end);
+ if (!nr)
+ lbuf_edit(lbuf, sbuf_buf(sb), beg, end);
sbuf_free(sb);
+ return nr != 0;
}
-void lbuf_wr(struct lbuf *lbuf, int fd, int beg, int end)
+int lbuf_wr(struct lbuf *lbuf, int fd, int beg, int end)
{
int i;
- for (i = beg; i < end; i++)
- write(fd, lbuf->ln[i], strlen(lbuf->ln[i]));
+ for (i = beg; i < end; i++) {
+ char *ln = lbuf->ln[i];
+ long nw = 0;
+ long nl = strlen(ln);
+ while (nw < nl) {
+ long nc = write(fd, ln + nw, nl - nw);
+ if (nc < 0)
+ return 1;
+ nw += nc;
+ }
+ }
+ return 0;
}
/* replace lines beg through end with buf */
DIR diff --git a/vi.h b/vi.h
t@@ -8,8 +8,8 @@
/* line buffer, managing a number of lines */
struct lbuf *lbuf_make(void);
void lbuf_free(struct lbuf *lbuf);
-void lbuf_rd(struct lbuf *lbuf, int fd, int beg, int end);
-void lbuf_wr(struct lbuf *lbuf, int fd, int beg, int end);
+int lbuf_rd(struct lbuf *lbuf, int fd, int beg, int end);
+int lbuf_wr(struct lbuf *lbuf, int fd, int beg, int end);
void lbuf_edit(struct lbuf *lbuf, char *s, int beg, int end);
char *lbuf_cp(struct lbuf *lbuf, int beg, int end);
char *lbuf_get(struct lbuf *lbuf, int pos);