-------------------------------------------------------------------------*/
#include <stdio.h>
-#include <malloc.h>
#include "newalloc.h"
#include <assert.h>
#include "SDCCset.h"
/* 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;
/* if this item is at the head of the list */
- if ((*list)->item == item)
- {
- lp = *list;
- *list = (*list)->next;
- return;
- }
+ if ((*list)->item == item) {
+ lp = *list;
+ *list = (*list)->next;
+ Safe_free (lp);
+ return;
+ }
/* find the item in the list */
- for (lp = *list; lp->next; lp = lp->next)
- {
- if (lp->next->item == item) /* the next one is it */
- {
- lp1 = lp->next; /* this one will need to be freed */
- lp->next = lp->next->next; /* take out of list */
- return;
- }
+ for (lp = *list; lp->next; lp = lp->next) {
+ if (lp->next->item == item) { /* the next one is it */
+ lp1 = lp->next; /* this one will need to be freed */
+ lp->next = lp->next->next; /* take out of list */
+ Safe_free (lp1);
+ return;
}
+ }
/* could not find it */
- return;
}
/*-----------------------------------------------------------------*/
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;
+}
+