Quake-III-Arena

Quake III Arena GPL Source Release
Log | Files | Refs

list.c (975B)


      1 #include "c.h"
      2 
      3 
      4 static List freenodes;		/* free list nodes */
      5 
      6 /* append - append x to list, return new list */
      7 List append(void *x, List list) {
      8 	List new;
      9 
     10 	if ((new = freenodes) != NULL)
     11 		freenodes = freenodes->link;
     12 	else
     13 		NEW(new, PERM);
     14 	if (list) {
     15 		new->link = list->link;
     16 		list->link = new;
     17 	} else
     18 		new->link = new;
     19 	new->x = x;
     20 	return new;
     21 }
     22 
     23 /* length - # elements in list */
     24 int length(List list) {
     25 	int n = 0;
     26 
     27 	if (list) {
     28 		List lp = list;
     29 		do
     30 			n++;
     31 		while ((lp = lp->link) != list);
     32 	}
     33 	return n;
     34 }
     35 
     36 /* ltov - convert list to an NULL-terminated vector allocated in arena */
     37 void *ltov(List *list, unsigned arena) {
     38 	int i = 0;
     39 	void **array = newarray(length(*list) + 1, sizeof array[0], arena);
     40 
     41 	if (*list) {
     42 		List lp = *list;
     43 		do {
     44 			lp = lp->link;
     45 			array[i++] = lp->x;
     46 		} while (lp != *list);
     47 #ifndef PURIFY
     48 		lp = (*list)->link;
     49 		(*list)->link = freenodes;
     50 		freenodes = lp;
     51 #endif
     52 	}
     53 	*list = NULL;
     54 	array[i] = NULL;
     55 	return array;
     56 }