#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "kernel.h"
#include "swis.h"

#include "buffer.h"

_kernel_oserror *buffer_shift(buffer_entry **new_entry)
{
  // get from start of pile the first valid entry (ie not empty)
  // note doesn't actually remove the entry or copy it
  int index=4;
  int buffer_size;
  
  if (new_entry==NULL) return NULL;

  if (buffer_area==-1) {
    *new_entry=NULL;
    return NULL;
  }

  _swix(OS_DynamicArea,_INR(0,1)|_OUT(2),2,buffer_area,&buffer_size);
  if (buffer_size==0) {
    *new_entry=NULL;
    return NULL;
  }

  while (index<*((int *)buffer_address)) {
    buffer_entry *entry=(buffer_entry *)(buffer_address+index);
    if (entry->hdr.type!=BUFFER_ENTRY_EMPTY) {
      *new_entry=entry;
      return NULL;
    }
    index+=entry->hdr.size;
  }

  *new_entry=NULL;
  
  return NULL;
}

_kernel_oserror *buffer_remove(buffer_entry *entry)
{
  // remove from pile (mark as empty and tidy if all list freed)
  int index=4;
  int buffer_size;

  entry->hdr.type=BUFFER_ENTRY_EMPTY;

  while (index<*((int *)buffer_address)) {
    buffer_entry *entry=(buffer_entry *)(buffer_address+index);
    if (entry->hdr.type!=BUFFER_ENTRY_EMPTY) {
      return NULL;
    }
    index+=entry->hdr.size;
  }

  // all empty, free the workspace
  _swix(OS_DynamicArea,_INR(0,1)|_OUT(2),2,buffer_area,&buffer_size);
  _swix(OS_ChangeDynamicArea,_INR(0,1),buffer_area,-buffer_size);
  
  return NULL;
}
