/* newSet - will allocate & return a new set entry */
/*-----------------------------------------------------------------*/
set *
-newSet ()
+newSet (void)
{
set *lp;
- lp = Safe_calloc (1, sizeof (set));
+ lp = Safe_alloc ( sizeof (set));
// if (lp == 0) {
// fprintf(stderr, "out of virtual memory: %s\n", __FILE__);
// exit(1);
set *sp = *sset;
va_list ap;
- va_start (ap, cond);
-
while (sp)
{
+ // On the x86 va_list is just a pointer, so due to pass by value
+ // ap is not mofified by the called function. On the PPC va_list
+ // is a pointer to a structure, so ap is modified. Re-init each time.
+ va_start (ap, cond);
+
if ((*cond) (sp->item, ap))
{
deleteSetItem (sset, sp->item);
continue;
}
+ va_end(ap);
sp = sp->next;
}
}
return count;
}
+/*-----------------------------------------------------------------*/
+/* reverseSet - reverse the order of the items of a set */
+/*-----------------------------------------------------------------*/
+
+set *
+reverseSet(set * s)
+{
+ set *t = NULL;
+ set *u = NULL;
+
+ while(s->next) {
+ t = s->next;
+ s->next = u;
+ u = s;
+ s = t;
+ }
+ s->next = u;
+ return s;
+}
+
/*-----------------------------------------------------------------*/
/* subtractFromSet - take away from set1 elements of set2 */
/*-----------------------------------------------------------------*/
if (!*item)
return;
- free (*item);
+ Safe_free (*item);
*item = NULL;
}
+
+/*-----------------------------------------------------------------*/
+/* deleteSet - will throw away the entire list */
+/* note - setToNull doesn't actually throw away the whole list. */
+/* Instead it only throws away the first item. */
+/*-----------------------------------------------------------------*/
+void deleteSet(set **s)
+{
+ set *curr;
+ set *next;
+
+ if(!s || !*s)
+ return;
+
+ curr = *s;
+ next = curr->next;
+ while (next) {
+ Safe_free (curr);
+ curr = next;
+ next = next->next;
+ }
+
+ Safe_free (curr);
+
+ *s = NULL;
+}
+