#include <stddef.h>
#include <assert.h>
#include <string.h>
#include <stdio.h>

#include "sysdep.h"
#include "memory.h"
#include "FieldType.h"
#include "biregistry.h"

#include "FTregP.h"

static Biregistry AlFieldTypeRegistry=NULL;

/*--------------------------------*/
NORET AlFTreg_init(NOARGS)
{
  if (AlFieldTypeRegistry==NULL)
    AlFieldTypeRegistry=Biregistry_create(Registry_strcmp,
					  Registry_strhash,
					  Registry_ptrcmp,
					  Registry_ptrhash);
}

/*--------------------------------*/
Biregistry AlFTreg_get_globalref()
{
  assert(AlFieldTypeRegistry != NULL);

  return(AlFieldTypeRegistry);
}

/*---------------------------*/
NORET AlFTreg_register_field_type(rr)
struct AlFieldTypeRegistry_str *rr;
{
  Biregistry FTReg;
  AlFieldType ft;
  char  *constName;
  
  FTReg=AlFTreg_get_globalref();
  ft=AlFieldType_create(rr);
  constName=(char *)Memory_allocate(strlen(rr->name)+2);
  strcpy(constName,rr->name);
  Biregistry_add(FTReg,(VOIDP)constName,(VOIDP)ft);
}

/*--------------------*/
NORET FTreg_get_names_from_reg(name,FT,da)
VOIDP        name;
VOIDP        FT;
VOIDP        da;
{
  Darray_addl((Darray)da,name);
}

/*-------------------------------------*/
NORET   AlFTreg_get_all_field_types(da)
Darray da;
{
  Biregistry ftr;
  AlFieldType FT;
  int count, i;
  char *name;

  ftr=AlFTreg_get_globalref();
  Biregistry_traverse(ftr,FTreg_get_names_from_reg,(VOIDP)da);
}

/*-------------------*/
const char * AlFTreg_obj_to_string(ft)
AlFieldType ft;
{
  char *s;
  
  assert(ft != (AlFieldType)NULL);

  s=(char *)Biregistry_rev_get(AlFTreg_get_globalref(),ft);
  assert(s != (char *)NULL);

  return(s);
}

/*--------------------*/
AlFieldType AlFTreg_string_to_obj(s)
const char *s;
{
  AlFieldType af;
  af=(AlFieldType)Biregistry_get(AlFTreg_get_globalref(),s);
  if (af==NULL)
    printf("AlFTreg_string_to_obj:no return value because of invlaid input\n");
  return(af);
}

/*---------------------*/
Bool AlFTreg_exists_obj(af)
AlFieldType af;
{
  if ((Biregistry_rev_get(AlFTreg_get_globalref(),af))==NULL)
    return(Bool_FALSE);
  else
    return(Bool_TRUE);
}

/*---------------------*/
Bool AlFTreg_exists_string(af)
const char *af;
{
  if ((Biregistry_get(AlFTreg_get_globalref(),af))==NULL)
    return(Bool_FALSE);
  else
    return(Bool_TRUE);
}




