home *** CD-ROM | disk | FTP | other *** search
- #include "c.h"
-
- static List freenodes; /* free list nodes */
-
- /* append - append x to list, return new list */
- List append(void *x, List list)
- {
- List new;
-
- if ((new = freenodes) != NULL)
- freenodes = freenodes->link;
- else
- NEW(new, PERM);
- if (list) {
- new->link = list->link;
- list->link = new;
- } else
- new->link = new;
- new->x = x;
- return new;
- }
-
- /* length - # elements in list */
- int length(List list)
- {
- int n = 0;
-
- if (list) {
- List lp = list;
- do
- n++;
- while ((lp = lp->link) != list);
- }
- return n;
- }
-
- /* ltov - convert list to an NULL-terminated vector allocated in arena */
- void *ltov(List *list, unsigned arena)
- {
- int i = 0;
- void **array = newarray(length(*list) + 1, sizeof array[0], arena);
-
- if (*list) {
- List lp = *list;
- do {
- lp = lp->link;
- array[i++] = lp->x;
- } while (lp != *list);
- #ifndef PURIFY
- lp = (*list)->link;
- (*list)->link = freenodes;
- freenodes = lp;
- #endif
- }
- *list = NULL;
- array[i] = NULL;
- return array;
- }
-