#ifndef XPKMASTER_OBJECTS_C
#define XPKMASTER_OBJECTS_C

/* Routinesheader

	Name:		objects.c
	Main:		xpkmaster
	Versionstring:	$VER: objects.c 1.2 (21.02.1998)
	Author:		SDI
	Distribution:	Freeware
	Description:	object allocation functions and prefs sem get funcs

 1.0   27.12.96 : first version
 1.1   09.01.98 : added XPK_ALLINONE
 1.2   21.02.98 : uses new style register definition
*/

#include <proto/exec.h>
#include <exec/memory.h>
#include <xpk/xpk.h>
#include <xpk/xpkprefs.h>
#include "xpkmaster.h"

XPK_ALLINONE struct XpkPrefsSemaphore *GetPrefsSem(void)
{
  struct XpkPrefsSemaphore *sem;
  Forbid();
  if((sem = (struct XpkPrefsSemaphore *) FindSemaphore(XPKPREFSSEMNAME)))
    ObtainSemaphoreShared((struct SignalSemaphore *) sem);
  Permit();
  
  return sem;
}

static ULONG GetXpkObjectSize(ULONG type)
{
  switch(type)
  {
  case XPKOBJ_FIB:		return sizeof(struct XpkFib); break;
  case XPKOBJ_PACKERINFO:	return sizeof(struct XpkPackerInfo); break;
  case XPKOBJ_MODE:		return sizeof(struct XpkMode); break;
  case XPKOBJ_PACKERLIST:	return sizeof(struct XpkPackerList); break;
  };
  return 0;
}

APTR LIBXpkAllocObject(void)
{
	struct TagItem *tags = (struct TagItem *)REG_A0;
	ULONG type = (ULONG)REG_D0;

  ULONG size;
  
  if((size = GetXpkObjectSize(type)))
    return AllocMem(size, MEMF_PUBLIC|MEMF_CLEAR);

  return 0;
}

void LIBXpkFreeObject(void)
{
	APTR object = (APTR)REG_A0;
	ULONG type = (ULONG)REG_D0;

  ULONG size;
  
  if((size = GetXpkObjectSize(type)))
    FreeMem(object, size);
}

#endif	/* XPKMASTER_OBJECTS_C */
