ftp.nice.ch/pub/next/unix/music/cm.sd.tar.gz#/midi/sgi/SA_stack.c

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.