This is SA_stack.c in view mode; [Download] [Up]
#include "SA_stack.h" #include <stdio.h> sigaction_list SAcdr(sigaction_list list) { if (list) return list->next; } struct sigaction *SAcar(sigaction_list list) { if (list) return list->action; else { perror("Attempt to take the CAR of NIL\n"); exit(-1); } } struct sigaction *SAcons(struct sigaction *msg,sigaction_list list) { sigaction_list result; result = SAlist_alloc(); result->action = msg; result->next = list; return result; } struct sigaction *SAShead(sigaction_stack *q) { if (q->first_action) { #ifdef DEBUG0 fprintf(stderr,"SAShead: %ld\n", q->first_action->action); #endif return q->first_action->action; } } void SAfree (struct sigaction *action) { free(action); } struct sigaction *SASpop(sigaction_stack *q) { sigaction_list fe,next,last; struct sigaction *recycle; #ifdef DEBUG0 fprintf(stderr,"IN SASpop - length: %d\n",SASlength(q)); #endif fe = q->first_action; if (fe) { if (fe == q->last_action) { q->first_action = (sigaction_list) NULL; q->last_action = (sigaction_list) NULL; } else q->first_action = fe->next; fe->next = q->first_recyclable; q->first_recyclable = fe; return fe->action; } #ifdef DEBUG0 fprintf(stderr,"OUT SASpop - length: %d\n",SASlength(q)); #endif } struct sigaction *SASpopkeep(sigaction_stack *q) { sigaction_list fe,next,last; struct sigaction *recycle; #ifdef DEBUG0 fprintf(stderr,"IN SASpop - length: %d\n",SASlength(q)); #endif fe = q->first_action; if (fe) { if (fe == q->last_action) { q->first_action = (sigaction_list) NULL; q->last_action = (sigaction_list) NULL; } else q->first_action = fe->next; fe->next = q->first_free; q->first_free = fe; return fe->action; } #ifdef DEBUG0 fprintf(stderr,"OUT SASpop - length: %d\n",SASlength(q)); #endif } sigaction_list SAlist_alloc() { sigaction_list result; result = (sigaction_list) malloc(sizeof(sigaction_cell)); /*result->action = (struct sigaction *) malloc(sizeof(struct sigaction)); */ /*result->next = (sigaction_list) NULL;*/ } sigaction_list SASextend(sigaction_stack *q) { sigaction_list next; next = SAlist_alloc(); next->next = q->first_free; q->first_free = next; /*q->last_action->next = next for moebius */ return next; } sigaction_list SASrecycle(sigaction_stack *q, struct sigaction* action) { sigaction_list recycle_cell; recycle_cell = q->first_free; if (recycle_cell) { recycle_cell->action = action; q->first_free = recycle_cell->next; recycle_cell->next = q->first_recyclable; q->first_recyclable = recycle_cell; } else free(action); return recycle_cell; } struct sigaction *SASreserve(sigaction_stack *q) { struct sigaction *recycle; sigaction_list recycle_cell; #ifdef DEBUG fprintf(stderr,"IN SASreserve - length: %d\n",SASlength(q)); #endif recycle_cell = q->first_recyclable; if (recycle_cell) { recycle = recycle_cell->action; q->first_recyclable = recycle_cell->next; recycle_cell->next = q->first_free; q->first_free = recycle_cell; } else recycle = (struct sigaction *) malloc(sizeof(struct sigaction)); #ifdef DEBUG_BUFFER fprintf(stderr,"OUT SASreserve - length: %d buffer: %ld\n",SASlength(q), recycle); #endif return recycle; } int SASlength(sigaction_stack *q) { int i = 0; sigaction_list cell; for(cell = q->first_action;cell; cell= cell->next) i++; return i; } sigaction_list SASpush(sigaction_stack *q, struct sigaction* action) { sigaction_list fe,newfirst,oldfirst; #ifdef DEBUG fprintf(stderr,"IN SASpush - length: %d\n",SASlength(q)); #endif fe = q->first_free; if (fe) q->first_free = fe->next; else fe = SAlist_alloc(); /* fe->next = (sigaction_list) NULL;*/ fe->action = action; oldfirst = q->first_action; fe->next = oldfirst; if (!oldfirst) q->last_action = fe; q->first_action = fe; #ifdef DEBUG fprintf(stderr,"OUT SASpush - length: %d\n",SASlength(q)); #endif return fe; } /* sigaction_list SASalloc(sigaction_stack *q) { sigaction_list fe; fe = q->first_action; if (fe) { if (fe->next == q->first_free) q->first_action = (sigaction_list) NULL; else q->first_action = fe->next; return q->first_action->action; } } */ void SASrelease(sigaction_stack *q) { sigaction_list nextcell,cell; for(cell=q->first_free;cell;cell=nextcell) { nextcell = cell->next; free(cell); } for(cell=q->first_recyclable;cell;cell=nextcell) { nextcell = cell->next; free(cell->action); free(cell); } q->first_free = (sigaction_list) NULL; q->first_recyclable = (sigaction_list) NULL; } sigaction_stack *SASnew(int size) { sigaction_list prevcell,nextcell = (sigaction_list) NULL; sigaction_stack *result; int i; static short lock_initial_state = 1; result = (sigaction_stack *) malloc(sizeof(sigaction_stack)); result->first_action = (sigaction_list) NULL; result->last_action = (sigaction_list) NULL; result->first_recyclable = (sigaction_list) NULL; prevcell = SAlist_alloc(); result->first_free = prevcell; /* result->last_free = prevcell;*/ for(i=1;i<size;i++) { nextcell = SAlist_alloc(); prevcell->next = nextcell; prevcell = nextcell; } prevcell->next = (sigaction_list) NULL; return result; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.