From 2fc2bb7c17aeb7514e5d42e46bb08304480bf125 Mon Sep 17 00:00:00 2001
From: Peter Stephenson
Date: Tue, 12 Nov 2013 20:41:06 +0000
Subject: 31961: rationalise fd watching to use structure
---
ChangeLog | 5 ++++
Src/Zle/zle.h | 12 ++++++++++
Src/Zle/zle_main.c | 40 ++++++++++++++++----------------
Src/Zle/zle_thingy.c | 64 ++++++++++++++++++++--------------------------------
4 files changed, 61 insertions(+), 60 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 4b5cb8926..bfdbbfb9c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-11-12 Peter Stephenson
+
+ * 31961: Src/Zle/zle.h, Src/Zle/zle_main.c,
+ Src/Zle/zle_thingy.c: rationalise fd watch to use structures.
+
2013-11-08 Peter Stephenson
* unposted: fix ChangeLog to say 5.0.3 instead of 4.0.3.
diff --git a/Src/Zle/zle.h b/Src/Zle/zle.h
index cf44b47d2..870e2149d 100644
--- a/Src/Zle/zle.h
+++ b/Src/Zle/zle.h
@@ -497,3 +497,15 @@ typedef REFRESH_ELEMENT *REFRESH_STRING;
#define METACHECK()
#define UNMETACHECK()
#endif
+
+
+typedef struct watch_fd *Watch_fd;
+
+struct watch_fd {
+ /* Function to call */
+ char *func;
+ /* Watched fd */
+ int fd;
+ /* 1 if func is called as a widget */
+ int widget;
+};
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index 6822230b4..040b7cb83 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -197,12 +197,11 @@ static int delayzsetterm;
*/
/**/
int nwatch; /* Number of fd's we are watching */
+/*
+ * Array of nwatch structures.
+ */
/**/
-int *watch_fds; /* The list of fds, not terminated! */
-/**/
-char **watch_funcs; /* The corresponding functions to call, normal array */
-/**/
-int *watch_widgets; /* 1 if corresponding function is called as widget */
+Watch_fd watch_fds;
/* set up terminal */
@@ -588,7 +587,7 @@ raw_getbyte(long do_keytmout, char *cptr)
*/
fds[0].events = POLLIN;
for (i = 0; i < nwatch; i++) {
- fds[i+1].fd = watch_fds[i];
+ fds[i+1].fd = watch_fds[i].fd;
fds[i+1].events = POLLIN;
}
# endif
@@ -613,7 +612,7 @@ raw_getbyte(long do_keytmout, char *cptr)
FD_SET(SHTTY, &foofd);
if (!errtry) {
for (i = 0; i < nwatch; i++) {
- int fd = watch_fds[i];
+ int fd = watch_fds[i].fd;
FD_SET(fd, &foofd);
if (fd > fdmax)
fdmax = fd;
@@ -725,33 +724,33 @@ raw_getbyte(long do_keytmout, char *cptr)
* handler function.
*/
int lnwatch = nwatch;
- int *lwatch_fds = zalloc(lnwatch*sizeof(int));
- char **lwatch_funcs = zarrdup(watch_funcs);
- int *lwatch_widgets = zalloc(lnwatch*sizeof(int));
- memcpy(lwatch_fds, watch_fds, lnwatch*sizeof(int));
- memcpy(lwatch_widgets, watch_widgets, lnwatch*sizeof(int));
+ Watch_fd lwatch_fds = zalloc(lnwatch*sizeof(struct watch_fd));
+ memcpy(lwatch_fds, watch_fds, lnwatch*sizeof(struct watch_fd));
+ for (i = 0; i < lnwatch; i++)
+ lwatch_fds[i].func = ztrdup(lwatch_fds[i].func);
for (i = 0; i < lnwatch; i++) {
+ Watch_fd lwatch_fd = lwatch_fds + i;
if (
# ifdef HAVE_POLL
(fds[i+1].revents & POLLIN)
# else
- FD_ISSET(lwatch_fds[i], &foofd)
+ FD_ISSET(lwatch_fd->fd, &foofd)
# endif
) {
/* Handle the fd. */
char *fdbuf;
{
char buf[BDIGBUFSIZE];
- convbase(buf, lwatch_fds[i], 10);
+ convbase(buf, lwatch_fd->fd, 10);
fdbuf = ztrdup(buf);
}
- if (lwatch_widgets[i]) {
- zlecallhook(lwatch_funcs[i], fdbuf);
+ if (lwatch_fd->widget) {
+ zlecallhook(lwatch_fd->func, fdbuf);
zsfree(fdbuf);
} else {
LinkList funcargs = znewlinklist();
- zaddlinknode(funcargs, ztrdup(lwatch_funcs[i]));
+ zaddlinknode(funcargs, ztrdup(lwatch_fd->func));
zaddlinknode(funcargs, fdbuf);
# ifdef HAVE_POLL
# ifdef POLLERR
@@ -767,7 +766,7 @@ raw_getbyte(long do_keytmout, char *cptr)
zaddlinknode(funcargs, ztrdup("nval"));
# endif
# endif
- callhookfunc(lwatch_funcs[i], funcargs, 0, NULL);
+ callhookfunc(lwatch_fd->func, funcargs, 0, NULL);
freelinklist(funcargs, freestr);
}
if (errflag) {
@@ -784,8 +783,9 @@ raw_getbyte(long do_keytmout, char *cptr)
/* Function may have invalidated the display. */
if (resetneeded)
zrefresh();
- zfree(lwatch_fds, lnwatch*sizeof(int));
- freearray(lwatch_funcs);
+ for (i = 0; i < lnwatch; i++)
+ zsfree(lwatch_fds[i].func);
+ zfree(lwatch_fds, lnwatch*sizeof(struct watch_fd));
}
}
# ifdef HAVE_POLL
diff --git a/Src/Zle/zle_thingy.c b/Src/Zle/zle_thingy.c
index 78c7918d2..7fd3a5941 100644
--- a/Src/Zle/zle_thingy.c
+++ b/Src/Zle/zle_thingy.c
@@ -778,11 +778,12 @@ bin_zle_fd(char *name, char **args, Options ops, UNUSED(char func))
return 1;
}
for (i = 0; i < nwatch; i++) {
- if (*args && watch_fds[i] != fd)
+ Watch_fd watch_fd = watch_fds + i;
+ if (*args && watch_fd->fd != fd)
continue;
found = 1;
- printf("%s -F %s%d %s\n", name, watch_widgets[i] ? "-w " : "",
- watch_fds[i], watch_funcs[i]);
+ printf("%s -F %s%d %s\n", name, watch_fd->widget ? "-w " : "",
+ watch_fd->fd, watch_fd->func);
}
/* only return status 1 if fd given and not found */
return *args && !found;
@@ -793,10 +794,11 @@ bin_zle_fd(char *name, char **args, Options ops, UNUSED(char func))
char *funcnam = ztrdup(args[1]);
if (nwatch) {
for (i = 0; i < nwatch; i++) {
- if (watch_fds[i] == fd) {
- zsfree(watch_funcs[i]);
- watch_funcs[i] = funcnam;
- watch_widgets[i] = OPT_ISSET(ops,'w') ? 1 : 0;
+ Watch_fd watch_fd = watch_fds + i;
+ if (watch_fd->fd == fd) {
+ zsfree(watch_fd->func);
+ watch_fd->func = funcnam;
+ watch_fd->widget = OPT_ISSET(ops,'w') ? 1 : 0;
found = 1;
break;
}
@@ -805,56 +807,38 @@ bin_zle_fd(char *name, char **args, Options ops, UNUSED(char func))
if (!found) {
/* zrealloc handles NULL pointers, so OK for first time through */
int newnwatch = nwatch+1;
- watch_fds = (int *)zrealloc(watch_fds,
- newnwatch * sizeof(int));
- watch_funcs = (char **)zrealloc(watch_funcs,
- (newnwatch+1) * sizeof(char *));
- watch_widgets = (int *)zrealloc(watch_widgets,
- newnwatch * sizeof(int));
- watch_fds[nwatch] = fd;
- watch_funcs[nwatch] = funcnam;
- watch_funcs[newnwatch] = NULL;
- watch_widgets[nwatch] = OPT_ISSET(ops,'w') ? 1 : 0;
+ Watch_fd new_fd;
+ watch_fds = (Watch_fd)zrealloc(watch_fds,
+ newnwatch * sizeof(struct watch_fd));
+ new_fd = watch_fds + nwatch;
+ new_fd->fd = fd;
+ new_fd->func = funcnam;
+ new_fd->widget = OPT_ISSET(ops,'w') ? 1 : 0;
nwatch = newnwatch;
}
} else {
/* Deleting a handler */
for (i = 0; i < nwatch; i++) {
- if (watch_fds[i] == fd) {
+ Watch_fd watch_fd = watch_fds + i;
+ if (watch_fd->fd == fd) {
int newnwatch = nwatch-1;
- int *new_fds, *new_widgets;
- char **new_funcs;
+ Watch_fd new_fds;
- zsfree(watch_funcs[i]);
+ zsfree(watch_fd->func);
if (newnwatch) {
- new_fds = zalloc(newnwatch*sizeof(int));
- new_funcs = zalloc((newnwatch+1)*sizeof(char*));
- new_widgets = zalloc(newnwatch*sizeof(int));
+ new_fds = zalloc(newnwatch*sizeof(struct watch_fd));
if (i) {
- memcpy(new_fds, watch_fds, i*sizeof(int));
- memcpy(new_funcs, watch_funcs, i*sizeof(char *));
- memcpy(new_widgets, watch_widgets, i*sizeof(int));
+ memcpy(new_fds, watch_fds, i*sizeof(struct watch_fd));
}
if (i < newnwatch) {
memcpy(new_fds+i, watch_fds+i+1,
- (newnwatch-i)*sizeof(int));
- memcpy(new_funcs+i, watch_funcs+i+1,
- (newnwatch-i)*sizeof(char *));
- memcpy(new_widgets+i, watch_widgets+i+1,
- (newnwatch-i)*sizeof(int));
+ (newnwatch-i)*sizeof(struct watch_fd));
}
- new_funcs[newnwatch] = NULL;
} else {
new_fds = NULL;
- new_funcs = NULL;
- new_widgets = NULL;
}
- zfree(watch_fds, nwatch*sizeof(int));
- zfree(watch_funcs, (nwatch+1)*sizeof(char *));
- zfree(watch_widgets, nwatch*sizeof(int));
+ zfree(watch_fds, nwatch*sizeof(struct watch_fd));
watch_fds = new_fds;
- watch_funcs = new_funcs;
- watch_widgets = new_widgets;
nwatch = newnwatch;
found = 1;
break;
--
cgit 1.4.1