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

This is sh_midibuffer.c in view mode; [Download] [Up]

#include "midibuffer.h"
#include <stdio.h>

MIevent_list MIcdr(MIevent_list list)
{
  if (list)
    return list->next;
}

MIevent *MIcar(MIevent_list list)
{
  if (list)
    return list->event;
  else {
    perror("Attempt to take the CAR of NIL\n");
    exit(-1);
  }
}

MIevent *MIcons(MIevent *msg,MIevent_list list)
{
  MIevent_list  result;

  result = MIlist_alloc();
  result->event = msg;
  result->next  = list;
  return result;
}


MIevent *MIQhead(MIevent_queue *q)
{
  if (q->first_event) {
#ifdef DEBUG0
   fprintf(stderr,"MIQhead: %ld\n", q->first_event->event);
#endif    
   return q->first_event->event;
 }
}

void MIfree (MIevent *event)
{
  if (event->t == MISYSEX) 
    free(SYSEX_MESSAGE(*event));
  free(event);
}

MIevent *MIQpop(MIevent_queue *q)
{
  MIevent_list  fe,next,last;
  MIevent       *recycle;
  
#ifdef DEBUG0
   fprintf(stderr,"IN MIQpop - length: %d\n",MIQlength(q));
#endif
  fe = q->first_event;
  if (fe) {
    if (fe == q->last_event) {
      q->first_event = (MIevent_list) NULL;
      q->last_event  = (MIevent_list) NULL;
    } else 
      q->first_event = fe->next;
    fe->next = q->first_recyclable;
    q->first_recyclable = fe;
    recycle = fe->event;
    if (recycle->t == MISYSEX) 
      free(SYSEX_MESSAGE(*recycle));
  }
#ifdef DEBUG0
   fprintf(stderr,"OUT MIQpop - length: %d\n",MIQlength(q));
#endif
}


MIevent_list MIlist_alloc()
{
   MIevent_list  result;

   result = (MIevent_list) malloc(sizeof(MIevent_cell));
   /*result->event = (MIevent *) malloc(MSGBUFFERSIZE); */
   /*result->next = (MIevent_list) NULL;*/
}

MIevent_list MIQextend(MIevent_queue *q)
{ 
  MIevent_list  next;

  next = MIlist_alloc();
  next->next = q->first_free;
  q->first_free = next;
  /*q->last_event->next = next for moebius */
  return next;
} 

MIevent_list MIQrecycle(MIevent_queue *q, MIevent* event)
{
  MIevent_list  recycle_cell;
    
  recycle_cell = q->first_free;
  if (recycle_cell) {
    recycle_cell->event = event;
    q->first_free = recycle_cell->next;
    recycle_cell->next = q->first_recyclable;
    q->first_recyclable = recycle_cell;
  } else
    free(event);
  return recycle_cell;
}

MIevent *MIQreserve(MIevent_queue *q)
{
  MIevent       *recycle;
  MIevent_list  recycle_cell;
  
#ifdef DEBUG
   fprintf(stderr,"IN MIQreserve - length: %d\n",MIQlength(q));
#endif
  recycle_cell = q->first_recyclable;
  if (recycle_cell) {
    recycle = recycle_cell->event;
    q->first_recyclable = recycle_cell->next;
    recycle_cell->next = q->first_free;
    q->first_free = recycle_cell;
  } else
    recycle = (MIevent *) malloc(sizeof(MIevent));
#ifdef DEBUG_BUFFER
  fprintf(stderr,"OUT MIQreserve - length: %d buffer: %ld\n",MIQlength(q), recycle);
#endif    
  return recycle;
}

int MIQlength(MIevent_queue *q) 
{
  int i = 0;
  MIevent_list  cell;

  for(cell = q->first_event;cell; cell= cell->next)
    i++;
  return i;
}
  

MIevent_list MIQpush(MIevent_queue *q, MIevent* event)
{
   MIevent_list  fe,newfirst,oldlast;

#ifdef DEBUG
   fprintf(stderr,"IN MIQpush - length: %d\n",MIQlength(q));
#endif
   fe = q->first_free;
   if (fe)
      q->first_free = fe->next;
   else
     fe = MIlist_alloc();
/*   fe->next = (MIevent_list) NULL;*/
   fe->event = event;
   oldlast = q->last_event;
   if (oldlast)
     oldlast->next = fe;
   else 
     q->first_event = fe;
   q->last_event = fe;
#ifdef DEBUG
   fprintf(stderr,"OUT MIQpush - length: %d\n",MIQlength(q));
#endif
   return fe;
 }
/*
MIevent_list MIQalloc(MIevent_queue *q)
{
  MIevent_list  fe;
  
  fe = q->first_event;
  if (fe) {
    if (fe->next == q->first_free) 
      q->first_event = (MIevent_list) NULL;
    else
       q->first_event = fe->next;
    return q->first_event->event;
  }
}
*/

MIevent_queue *MIQnew(int size) 
{
  MIevent_list prevcell,nextcell = (MIevent_list) NULL;
  MIevent_queue *result;
  int i;

  result = (MIevent_queue *) malloc(sizeof(MIevent_queue));
  result->first_event = (MIevent_list) NULL;
  result->last_event = (MIevent_list) NULL;
  result->first_recyclable = (MIevent_list) NULL;
  prevcell =  MIlist_alloc();
  result->first_free =  prevcell;
/*  result->last_free =  prevcell;*/
  
  for(i=1;i<size;i++) {
    nextcell = MIlist_alloc();
    prevcell->next = nextcell;
    prevcell = nextcell;
  }
  prevcell->next = (MIevent_list) NULL;

  return result;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.