bool file_exists(char* path);
char* strmcat(char* first, ...);
-
enum { INPUT, OUTPUT };
typedef void (*event_cbfn_t)(int fd, void* data);
size_t buf_insert(Buf* buf, bool indent, size_t off, Rune rune);
size_t buf_delete(Buf* buf, size_t beg, size_t end);
size_t buf_change(Buf* buf, size_t beg, size_t end);
+void buf_chomp(Buf* buf);
void buf_undo(Buf* buf, Sel* sel);
void buf_redo(Buf* buf, Sel* sel);
void buf_loglock(Buf* buf);
typedef struct {
View* view; /* destination view */
+ size_t beg; /* start of output */
size_t count; /* number of bytes written */
} Rcvr;
static void send_data(int fd, void* data);
static void recv_data(int fd, void* data);
static void watch_or_close(bool valid, int dir, int fd, void* data);
+static void rcvr_finish(Rcvr* rcvr);
void exec_reap(void) {
int pid;
Job* job = JobList;
for (; job && job->pid != pid; job = job->next);
if (job && job->pid == pid) {
+ rcvr_finish(&(job->out_rcvr));
+ rcvr_finish(&(job->err_rcvr));
if (job->prev) {
job->prev->next = job->next;
job->next->prev = job->prev;
}
static void recv_data(int fd, void* data) {
- static char buf[4096];
- long i = 0, nread = read(fd, buf, sizeof(buf));
+ static char buffer[4096];
+ long i = 0, nread = read(fd, buffer, sizeof(buffer));
Rcvr* rcvr = data;
+ View* view = rcvr->view;
+ Buf* buf = &(rcvr->view->buffer);
+ Sel sel = view->selection;
if (nread > 0) {
+ if (!rcvr->count) {
+ if (sel.end < sel.beg) {
+ size_t temp = sel.beg;
+ sel.beg = sel.end, sel.end = temp;
+ }
+ rcvr->beg = sel.beg = sel.end = buf_change(buf, sel.beg, sel.end);
+ view->selection = sel;
+ buf_loglock(buf);
+ }
for (; i < nread;) {
Rune r;
size_t len = 0;
- while (!utf8decode(&r, &len, buf[i++]));
+ while (!utf8decode(&r, &len, buffer[i++]));
view_insert(rcvr->view, false, r);
rcvr->count++;
}
} else {
close(fd);
- if (rcvr->count)
- view_selprev(rcvr->view);
}
}
else
close(fd);
}
+
+static void rcvr_finish(Rcvr* rcvr) {
+ if (rcvr->count) {
+ View* view = rcvr->view;
+ Buf* buf = &(rcvr->view->buffer);
+ if (rcvr->view == win_view(TAGS))
+ buf_chomp(buf), rcvr->count--;
+ view->selection.beg = rcvr->beg;
+ view->selection.end = rcvr->beg + rcvr->count;
+ }
+}