106 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <SWI-Prolog.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <ctype.h>
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
	lookup_ht(HT,Key,Values) :-
 | 
						|
		term_hash(Key,Hash),
 | 
						|
		HT = ht(Capacity,_,Table),
 | 
						|
		Index is (Hash mod Capacity) + 1,
 | 
						|
		arg(Index,Table,Bucket),
 | 
						|
		nonvar(Bucket),
 | 
						|
		( Bucket = K-Vs ->
 | 
						|
		    K == Key,	
 | 
						|
		    Values = Vs
 | 
						|
		;
 | 
						|
		    lookup(Bucket,Key,Values)
 | 
						|
		).
 | 
						|
 | 
						|
	lookup([K - V | KVs],Key,Value) :-
 | 
						|
		( K = Key ->
 | 
						|
			V = Value
 | 
						|
		;
 | 
						|
			lookup(KVs,Key,Value)
 | 
						|
		).
 | 
						|
*/
 | 
						|
static foreign_t
 | 
						|
pl_lookup_ht1(term_t ht, term_t pl_hash, term_t key, term_t values)
 | 
						|
{
 | 
						|
  int capacity;
 | 
						|
  int hash;
 | 
						|
  int index;
 | 
						|
 | 
						|
  term_t pl_capacity = PL_new_term_ref();
 | 
						|
  term_t table       = PL_new_term_ref();
 | 
						|
  term_t bucket      = PL_new_term_ref();
 | 
						|
 | 
						|
  /* HT = ht(Capacity,_,Table) */
 | 
						|
  PL_get_arg(1, ht, pl_capacity);
 | 
						|
  PL_get_integer(pl_capacity, &capacity);
 | 
						|
  PL_get_arg(3, ht, table);
 | 
						|
 | 
						|
  /* Index is (Hash mod Capacity) + 1 */
 | 
						|
  PL_get_integer(pl_hash, &hash);
 | 
						|
  index = (hash % capacity) + 1;  
 | 
						|
 | 
						|
  /* arg(Index,Table,Bucket) */
 | 
						|
  PL_get_arg(index, table, bucket);
 | 
						|
 | 
						|
  /* nonvar(Bucket) */ 
 | 
						|
  if (PL_is_variable(bucket)) PL_fail;  
 | 
						|
 | 
						|
  if (PL_is_list(bucket)) {
 | 
						|
  	term_t pair	     = PL_new_term_ref();
 | 
						|
  	term_t k	     = PL_new_term_ref();
 | 
						|
	term_t vs	     = PL_new_term_ref();
 | 
						|
	while (PL_get_list(bucket, pair,bucket)) {
 | 
						|
  		PL_get_arg(1, pair, k);
 | 
						|
		if ( PL_compare(k,key) == 0 ) {
 | 
						|
      			/* Values = Vs */
 | 
						|
			PL_get_arg(2, pair, vs);
 | 
						|
			return PL_unify(values,vs);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	PL_fail;
 | 
						|
  } else {
 | 
						|
  	term_t k	     = PL_new_term_ref();
 | 
						|
	term_t vs	     = PL_new_term_ref();
 | 
						|
  	PL_get_arg(1, bucket, k);
 | 
						|
        /* K == Key */	
 | 
						|
	if ( PL_compare(k,key) == 0 ) {
 | 
						|
      		/* Values = Vs */
 | 
						|
		PL_get_arg(2, bucket, vs);
 | 
						|
		return PL_unify(values,vs);
 | 
						|
	} else {
 | 
						|
		PL_fail;
 | 
						|
	}
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
static foreign_t
 | 
						|
pl_memberchk_eq(term_t element, term_t maybe_list)
 | 
						|
{
 | 
						|
 | 
						|
  term_t head = PL_new_term_ref();      	/* variable for the elements */
 | 
						|
  term_t list = PL_copy_term_ref(maybe_list);   /* copy as we need to write */
 | 
						|
 | 
						|
  while( PL_get_list(list, head, list) )
 | 
						|
  { if ( PL_compare(element,head) == 0 )
 | 
						|
     PL_succeed ;
 | 
						|
  }
 | 
						|
 | 
						|
  PL_fail;  
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
	/* INSTALL */
 | 
						|
 | 
						|
install_t
 | 
						|
install_chr_support()
 | 
						|
{
 | 
						|
  PL_register_foreign("memberchk_eq",2, pl_memberchk_eq, 0);
 | 
						|
  PL_register_foreign("lookup_ht1",4, pl_lookup_ht1, 0);
 | 
						|
}
 | 
						|
 |