#include <stddef.h>
#include <stdlib.h>
#include <assert.h>

#include "sysdep.h"
#include "registry.h"
#include "biregistry.h"
#include "verb.h"
#include "verbrgy.h"

static Biregistry AlVerb_TheRegistry = NULL;

/* Adds a new verb to the registry, with an associated name */

NORET AlVerbReg_init(NOARGS)
{
  if (AlVerb_TheRegistry != NULL) return;
  AlVerb_TheRegistry = Biregistry_create(Registry_strcasecmp,
					 Registry_strcasehash,
					 Registry_ptrcmp,
					 Registry_ptrhash);
}


Bool AlVerbReg_register(name, verb_obj)
     const char *name;
     AlVerb verb_obj;
{
  
  assert(AlVerb_TheRegistry != NULL);
  return Biregistry_add(AlVerb_TheRegistry, (VOIDP)name, (VOIDP)verb_obj);
}

/* Gets a verb in the registry, given the name.  Returns NULL if 
 * no such verb */

AlVerb AlVerbReg_get_obj(name)
     const char *name;
{
  assert(AlVerb_TheRegistry != NULL);
  return (AlVerb)Biregistry_get(AlVerb_TheRegistry, (VOIDP)name);
}

/* Gets the name of a verb in the registry, given the verb object.
 * Returns NULL if no such verb */

const char *AlVerbReg_get_name(verb_obj)
     AlVerb verb_obj;
{
  assert(AlVerb_TheRegistry != NULL);
  return (const char *)Biregistry_rev_get(AlVerb_TheRegistry, (VOIDP)verb_obj);
}

/* Returns the Darray of action names, and the Darray of action
 * objects.  If a Darray is passed as NULL, the corresponding data is
 * not returned */

NORET AlVerbReg_get_verbs(name_da, obj_da)
     Darray name_da;
     Darray obj_da;
{
  assert(name_da == NULL || Darray_len(name_da) == 0);
  assert(obj_da == NULL || Darray_len(obj_da) == 0);

  Biregistry_fetch_contents(AlVerb_TheRegistry, name_da, obj_da);
}
