mirror of
https://github.com/zsh-users/zsh
synced 2024-10-15 04:13:34 +00:00
15919: use LinkLists in place of somewhat equivalent code
This commit is contained in:
parent
89719fbac3
commit
1bbe1d1b0a
|
@ -1,3 +1,8 @@
|
||||||
|
2001-10-02 Clint Adams <clint@zsh.org>
|
||||||
|
|
||||||
|
* 15919: Src/linklist.c, Src/Modules/tcp.c, Src/Modules/tcp.h:
|
||||||
|
use LinkLists in tcp module rather than somewhat equivalent code.
|
||||||
|
|
||||||
2001-10-01 Peter Stephenson <pws@csr.com>
|
2001-10-01 Peter Stephenson <pws@csr.com>
|
||||||
|
|
||||||
* 15917: Test/C03traps.ztst: test for EXIT trap fix in 15844.
|
* 15917: Test/C03traps.ztst: test for EXIT trap fix in 15844.
|
||||||
|
|
|
@ -226,19 +226,7 @@ freehostent(struct hostent *ptr)
|
||||||
/**/
|
/**/
|
||||||
#endif /* !HAVE_GETIPNODEBYNAME */
|
#endif /* !HAVE_GETIPNODEBYNAME */
|
||||||
|
|
||||||
Tcp_session ztcp_head = NULL, ztcp_tail = NULL;
|
LinkList ztcp_sessions;
|
||||||
|
|
||||||
static Tcp_session
|
|
||||||
zts_head(void)
|
|
||||||
{
|
|
||||||
return ztcp_head;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Tcp_session
|
|
||||||
zts_next(Tcp_session cur)
|
|
||||||
{
|
|
||||||
return cur ? cur->next : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* "allocate" a tcp_session */
|
/* "allocate" a tcp_session */
|
||||||
static Tcp_session
|
static Tcp_session
|
||||||
|
@ -249,16 +237,10 @@ zts_alloc(int ztflags)
|
||||||
sess = (Tcp_session)zcalloc(sizeof(struct tcp_session));
|
sess = (Tcp_session)zcalloc(sizeof(struct tcp_session));
|
||||||
if (!sess) return NULL;
|
if (!sess) return NULL;
|
||||||
sess->fd=-1;
|
sess->fd=-1;
|
||||||
sess->next=NULL;
|
|
||||||
sess->flags=ztflags;
|
sess->flags=ztflags;
|
||||||
|
|
||||||
if (!zts_head()) {
|
zinsertlinknode(ztcp_sessions, lastnode(ztcp_sessions), (void *)sess);
|
||||||
ztcp_head = ztcp_tail = sess;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ztcp_tail->next = sess;
|
|
||||||
ztcp_tail = sess;
|
|
||||||
}
|
|
||||||
return sess;
|
return sess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -275,49 +257,40 @@ tcp_socket(int domain, int type, int protocol, int ztflags)
|
||||||
return sess;
|
return sess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
ztcp_free_session(Tcp_session sess)
|
||||||
|
{
|
||||||
|
zfree(sess, sizeof(struct tcp_session));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
zts_delete(Tcp_session sess)
|
zts_delete(Tcp_session sess)
|
||||||
{
|
{
|
||||||
Tcp_session tsess;
|
LinkNode node;
|
||||||
|
|
||||||
tsess = zts_head();
|
node = linknodebydatum(ztcp_sessions, (void *)sess);
|
||||||
|
|
||||||
if(!sess) return 1;
|
if (!node)
|
||||||
|
|
||||||
if (tsess == sess)
|
|
||||||
{
|
{
|
||||||
ztcp_head = sess->next;
|
return 1;
|
||||||
free(sess);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while((tsess->next != sess) && (tsess->next)) {
|
ztcp_free_session(getdata(node));
|
||||||
tsess = zts_next(tsess);
|
remnode(ztcp_sessions, node);
|
||||||
}
|
|
||||||
|
|
||||||
if (!tsess->next) return 1;
|
|
||||||
|
|
||||||
if (ztcp_tail == sess)
|
|
||||||
ztcp_tail = tsess;
|
|
||||||
tsess->next = sess->next;
|
|
||||||
free(sess);
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Tcp_session
|
static Tcp_session
|
||||||
zts_byfd(int fd)
|
zts_byfd(int fd)
|
||||||
{
|
{
|
||||||
Tcp_session tsess;
|
LinkNode node;
|
||||||
|
|
||||||
tsess = zts_head();
|
for (node = firstnode(ztcp_sessions); node; incnode(node))
|
||||||
|
if (((Tcp_session)getdata(node))->fd == fd)
|
||||||
while(tsess != NULL) {
|
return (Tcp_session)node;
|
||||||
if (tsess->fd == fd)
|
|
||||||
return tsess;
|
|
||||||
|
|
||||||
tsess = zts_next(tsess);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -325,13 +298,10 @@ zts_byfd(int fd)
|
||||||
static void
|
static void
|
||||||
tcp_cleanup(void)
|
tcp_cleanup(void)
|
||||||
{
|
{
|
||||||
Tcp_session sess, prev;
|
LinkNode node;
|
||||||
|
|
||||||
for(sess = zts_head(); sess != NULL; sess = zts_next(prev))
|
for (node = firstnode(ztcp_sessions); node; incnode(node))
|
||||||
{
|
tcp_close((Tcp_session)getdata(node));
|
||||||
prev = sess;
|
|
||||||
tcp_close(sess);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
|
@ -601,8 +571,11 @@ bin_ztcp(char *nam, char **args, char *ops, int func)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!dargs[0]) {
|
if (!dargs[0]) {
|
||||||
for(sess = zts_head(); sess != NULL; sess = zts_next(sess))
|
LinkNode node;
|
||||||
|
for(node = firstnode(ztcp_sessions); node; incnode(node))
|
||||||
{
|
{
|
||||||
|
sess = (Tcp_session)getdata(node);
|
||||||
|
|
||||||
if (sess->fd != -1)
|
if (sess->fd != -1)
|
||||||
{
|
{
|
||||||
zthost = gethostbyaddr(&(sess->sock.in.sin_addr), sizeof(struct sockaddr_in), AF_INET);
|
zthost = gethostbyaddr(&(sess->sock.in.sin_addr), sizeof(struct sockaddr_in), AF_INET);
|
||||||
|
@ -708,6 +681,7 @@ setup_(Module m)
|
||||||
int
|
int
|
||||||
boot_(Module m)
|
boot_(Module m)
|
||||||
{
|
{
|
||||||
|
ztcp_sessions = znewlinklist();
|
||||||
return !addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
|
return !addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -717,6 +691,7 @@ int
|
||||||
cleanup_(Module m)
|
cleanup_(Module m)
|
||||||
{
|
{
|
||||||
tcp_cleanup();
|
tcp_cleanup();
|
||||||
|
freelinklist(ztcp_sessions, (FreeFunc) ztcp_free_session);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,7 +80,6 @@ struct tcp_session {
|
||||||
int fd; /* file descriptor */
|
int fd; /* file descriptor */
|
||||||
union tcp_sockaddr sock; /* local address */
|
union tcp_sockaddr sock; /* local address */
|
||||||
union tcp_sockaddr peer; /* remote address */
|
union tcp_sockaddr peer; /* remote address */
|
||||||
Tcp_session next;
|
|
||||||
int flags;
|
int flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
103
Src/linklist.c
103
Src/linklist.c
|
@ -33,12 +33,24 @@
|
||||||
/* Get an empty linked list header */
|
/* Get an empty linked list header */
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
LinkList
|
mod_export LinkList
|
||||||
newlinklist(void)
|
newlinklist(void)
|
||||||
{
|
{
|
||||||
LinkList list;
|
LinkList list;
|
||||||
|
|
||||||
list = (LinkList) alloc(sizeof *list);
|
list = (LinkList) zhalloc(sizeof *list);
|
||||||
|
list->first = NULL;
|
||||||
|
list->last = (LinkNode) list;
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**/
|
||||||
|
mod_export LinkList
|
||||||
|
znewlinklist(void)
|
||||||
|
{
|
||||||
|
LinkList list;
|
||||||
|
|
||||||
|
list = (LinkList) zalloc(sizeof *list);
|
||||||
list->first = NULL;
|
list->first = NULL;
|
||||||
list->last = (LinkNode) list;
|
list->last = (LinkNode) list;
|
||||||
return list;
|
return list;
|
||||||
|
@ -47,13 +59,31 @@ newlinklist(void)
|
||||||
/* Insert a node in a linked list after a given node */
|
/* Insert a node in a linked list after a given node */
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
LinkNode
|
mod_export LinkNode
|
||||||
insertlinknode(LinkList list, LinkNode node, void *dat)
|
insertlinknode(LinkList list, LinkNode node, void *dat)
|
||||||
{
|
{
|
||||||
LinkNode tmp, new;
|
LinkNode tmp, new;
|
||||||
|
|
||||||
tmp = node->next;
|
tmp = node->next;
|
||||||
node->next = new = (LinkNode) alloc(sizeof *tmp);
|
node->next = new = (LinkNode) zhalloc(sizeof *tmp);
|
||||||
|
new->last = node;
|
||||||
|
new->dat = dat;
|
||||||
|
new->next = tmp;
|
||||||
|
if (tmp)
|
||||||
|
tmp->last = new;
|
||||||
|
else
|
||||||
|
list->last = new;
|
||||||
|
return new;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**/
|
||||||
|
mod_export LinkNode
|
||||||
|
zinsertlinknode(LinkList list, LinkNode node, void *dat)
|
||||||
|
{
|
||||||
|
LinkNode tmp, new;
|
||||||
|
|
||||||
|
tmp = node->next;
|
||||||
|
node->next = new = (LinkNode) zalloc(sizeof *tmp);
|
||||||
new->last = node;
|
new->last = node;
|
||||||
new->dat = dat;
|
new->dat = dat;
|
||||||
new->next = tmp;
|
new->next = tmp;
|
||||||
|
@ -67,7 +97,7 @@ insertlinknode(LinkList list, LinkNode node, void *dat)
|
||||||
/* Insert an already-existing node into a linked list after a given node */
|
/* Insert an already-existing node into a linked list after a given node */
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
LinkNode
|
mod_export LinkNode
|
||||||
uinsertlinknode(LinkList list, LinkNode node, LinkNode new)
|
uinsertlinknode(LinkList list, LinkNode node, LinkNode new)
|
||||||
{
|
{
|
||||||
LinkNode tmp = node->next;
|
LinkNode tmp = node->next;
|
||||||
|
@ -84,7 +114,7 @@ uinsertlinknode(LinkList list, LinkNode node, LinkNode new)
|
||||||
/* Insert a list in another list */
|
/* Insert a list in another list */
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
void
|
mod_export void
|
||||||
insertlinklist(LinkList l, LinkNode where, LinkList x)
|
insertlinklist(LinkList l, LinkNode where, LinkList x)
|
||||||
{
|
{
|
||||||
LinkNode nx;
|
LinkNode nx;
|
||||||
|
@ -104,7 +134,7 @@ insertlinklist(LinkList l, LinkNode where, LinkList x)
|
||||||
/* Get top node in a linked list */
|
/* Get top node in a linked list */
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
void *
|
mod_export void *
|
||||||
getlinknode(LinkList list)
|
getlinknode(LinkList list)
|
||||||
{
|
{
|
||||||
void *dat;
|
void *dat;
|
||||||
|
@ -125,7 +155,7 @@ getlinknode(LinkList list)
|
||||||
/* Get top node in a linked list without freeing */
|
/* Get top node in a linked list without freeing */
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
void *
|
mod_export void *
|
||||||
ugetnode(LinkList list)
|
ugetnode(LinkList list)
|
||||||
{
|
{
|
||||||
void *dat;
|
void *dat;
|
||||||
|
@ -145,7 +175,7 @@ ugetnode(LinkList list)
|
||||||
/* Remove a node from a linked list */
|
/* Remove a node from a linked list */
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
void *
|
mod_export void *
|
||||||
remnode(LinkList list, LinkNode nd)
|
remnode(LinkList list, LinkNode nd)
|
||||||
{
|
{
|
||||||
void *dat;
|
void *dat;
|
||||||
|
@ -164,7 +194,7 @@ remnode(LinkList list, LinkNode nd)
|
||||||
/* Remove a node from a linked list without freeing */
|
/* Remove a node from a linked list without freeing */
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
void *
|
mod_export void *
|
||||||
uremnode(LinkList list, LinkNode nd)
|
uremnode(LinkList list, LinkNode nd)
|
||||||
{
|
{
|
||||||
void *dat;
|
void *dat;
|
||||||
|
@ -181,7 +211,7 @@ uremnode(LinkList list, LinkNode nd)
|
||||||
/* Free a linked list */
|
/* Free a linked list */
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
void
|
mod_export void
|
||||||
freelinklist(LinkList list, FreeFunc freefunc)
|
freelinklist(LinkList list, FreeFunc freefunc)
|
||||||
{
|
{
|
||||||
LinkNode node, next;
|
LinkNode node, next;
|
||||||
|
@ -198,7 +228,7 @@ freelinklist(LinkList list, FreeFunc freefunc)
|
||||||
/* Count the number of nodes in a linked list */
|
/* Count the number of nodes in a linked list */
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
int
|
mod_export int
|
||||||
countlinknodes(LinkList list)
|
countlinknodes(LinkList list)
|
||||||
{
|
{
|
||||||
LinkNode nd;
|
LinkNode nd;
|
||||||
|
@ -209,7 +239,7 @@ countlinknodes(LinkList list)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
void
|
mod_export void
|
||||||
rolllist(LinkList l, LinkNode nd)
|
rolllist(LinkList l, LinkNode nd)
|
||||||
{
|
{
|
||||||
l->last->next = l->first;
|
l->last->next = l->first;
|
||||||
|
@ -220,3 +250,50 @@ rolllist(LinkList l, LinkNode nd)
|
||||||
l->last->next = 0;
|
l->last->next = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**/
|
||||||
|
mod_export LinkList
|
||||||
|
newsizedlist(int size)
|
||||||
|
{
|
||||||
|
LinkList list;
|
||||||
|
LinkNode node;
|
||||||
|
|
||||||
|
list = (LinkList) zhalloc(sizeof(struct linklist) +
|
||||||
|
(size * sizeof(struct linknode)));
|
||||||
|
|
||||||
|
list->first = (LinkNode) (list + 1);
|
||||||
|
for (node = list->first; size; size--, node++) {
|
||||||
|
node->last = node - 1;
|
||||||
|
node->next = node + 1;
|
||||||
|
}
|
||||||
|
list->last = node - 1;
|
||||||
|
list->first->last = (LinkNode) list;
|
||||||
|
node[-1].next = NULL;
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**/
|
||||||
|
mod_export int
|
||||||
|
listcontains(LinkList list, void *dat)
|
||||||
|
{
|
||||||
|
LinkNode node;
|
||||||
|
|
||||||
|
for (node = firstnode(list); node; incnode(node))
|
||||||
|
if (getdata(node) == dat)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**/
|
||||||
|
mod_export LinkNode
|
||||||
|
linknodebydatum(LinkList list, void *dat)
|
||||||
|
{
|
||||||
|
LinkNode node;
|
||||||
|
|
||||||
|
for (node = firstnode(list); node; incnode(node))
|
||||||
|
if (getdata(node) == dat)
|
||||||
|
return node;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue