102 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			102 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include <assert.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "uthash_udi.h"
							 | 
						||
| 
								 | 
							
								#include "uthash_udi_private.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static struct udi_control_block UTHashCB;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void udi_uthash_init(void) {
							 | 
						||
| 
								 | 
							
									UdiControlBlock cb = &UTHashCB;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									memset((void *) cb,0, sizeof(*cb));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									cb->decl=YAP_LookupAtom(SPEC);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									cb->init=UTHashUdiInit;
							 | 
						||
| 
								 | 
							
									cb->insert=UTHashUdiInsert;
							 | 
						||
| 
								 | 
							
									cb->search=UTHashUdiSearch;
							 | 
						||
| 
								 | 
							
									cb->destroy=UTHashUdiDestroy;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Yap_UdiRegister(cb);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void *UTHashUdiInit (YAP_Term spec, int arg, int arity) {
							 | 
						||
| 
								 | 
							
									return NULL; /*empty uthash*/
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void *UTHashUdiInsert (void *control,
							 | 
						||
| 
								 | 
							
										YAP_Term term, int arg, void *data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  uthash_t hash = (uthash_t) control;
							 | 
						||
| 
								 | 
							
								  YAP_Term argterm;
							 | 
						||
| 
								 | 
							
								  uthash_t element;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//  Yap_DebugPlWrite(term); fprintf(stderr, "\n");
							 | 
						||
| 
								 | 
							
								  argterm = YAP_ArgOfTerm(arg,term);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (YAP_IsAtomTerm(argterm) || YAP_IsIntTerm(argterm))
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      element = (uthash_t) malloc(sizeof(*element));
							 | 
						||
| 
								 | 
							
								      element->data = data;
							 | 
						||
| 
								 | 
							
								      if (YAP_IsAtomTerm(argterm))
							 | 
						||
| 
								 | 
							
								        element->key.atom = YAP_AtomOfTerm(argterm);
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								        element->key.integer = YAP_IntOfTerm(argterm);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      HASH_ADD_AI(hash, element);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /*TODO: check how to handle if a different value appears*/
							 | 
						||
| 
								 | 
							
								  return (void *) hash;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*ARGS ARE AVAILABLE*/
							 | 
						||
| 
								 | 
							
								int UTHashUdiSearch (void *control,
							 | 
						||
| 
								 | 
							
										int arg, Yap_UdiCallback callback, void *args)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  YAP_Term argterm;
							 | 
						||
| 
								 | 
							
								  YAP_Atom atom;
							 | 
						||
| 
								 | 
							
								  uthash_t element;
							 | 
						||
| 
								 | 
							
								  uthash_t hash = (uthash_t) control;
							 | 
						||
| 
								 | 
							
								  int count = 0;
							 | 
						||
| 
								 | 
							
								  union AI ai;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  assert(hash);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  argterm = YAP_A(arg); /*Deref(XREGS[arg]); */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (YAP_IsAtomTerm(argterm) || YAP_IsIntTerm(argterm))
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
									  if (YAP_IsAtomTerm(argterm))
							 | 
						||
| 
								 | 
							
										  ai.atom = YAP_AtomOfTerm(argterm);
							 | 
						||
| 
								 | 
							
									  else
							 | 
						||
| 
								 | 
							
										  ai.integer = YAP_IntOfTerm(argterm);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      HASH_FIND_AI(hash,&ai,element);
							 | 
						||
| 
								 | 
							
								      /* HASH_FIND(hh,utcontrol->tree,&atom,sizeof(Atom),element); */
							 | 
						||
| 
								 | 
							
								      while (element)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								    	  callback((void *) &(element->key), element->data, args);
							 | 
						||
| 
								 | 
							
								          count ++;
							 | 
						||
| 
								 | 
							
								          HASH_FIND_NEXT_AI(element,&ai);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								//      fprintf(stderr,"found %d\n",count);
							 | 
						||
| 
								 | 
							
								      return (count);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								//  fprintf(stderr,"not found\n");
							 | 
						||
| 
								 | 
							
								  return -1; /*YAP FALLBACK*/
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int UTHashUdiDestroy(void *control)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  uthash_t hash = (uthash_t) control;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  assert(hash);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (hash)
							 | 
						||
| 
								 | 
							
								    HASH_CLEAR(hh,hash); /* TODO: check if this is enough */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return TRUE;
							 | 
						||
| 
								 | 
							
								}
							 |