lpc4/lib/
lpc4/lib/doc/efun/
lpc4/lib/doc/lfun/
lpc4/lib/doc/operators/
lpc4/lib/doc/simul_efuns/
lpc4/lib/doc/types/
lpc4/lib/etc/
lpc4/lib/include/
lpc4/lib/include/arpa/
lpc4/lib/obj/d/
lpc4/lib/save/
lpc4/lib/secure/
lpc4/lib/std/
lpc4/lib/std/living/
#include "global.h"
#include "exec.h"
#include "interpret.h"
#include "object.h"
#include "array.h"
#include "stralloc.h"

unsigned int hashmem(const char *a,int len,int mlen)
{
  unsigned int ret;
  ret=9248339*len;
  if(len<mlen) mlen=len;
  switch(mlen&7)
  {
    case 7: ret^=*(a++);
    case 6: ret^=(ret<<4)+*(a++);
    case 5: ret^=(ret<<7)+*(a++);
    case 4: ret^=(ret<<6)+*(a++);
    case 3: ret^=(ret<<3)+*(a++);
    case 2: ret^=(ret<<7)+*(a++);
    case 1: ret^=(ret<<5)+*(a++);
  }

#ifdef HANDLES_UNALIGNED_MEMORY_ACCESS
  for(mlen>>=3;--mlen>=0;)
  {
    ret^=(ret<<7)+*(((unsigned int *)a)++);
    ret^=(ret>>6)+*(((unsigned int *)a)++);
  }
#else
  for(mlen>>=3;--mlen>=0;)
  {
    ret^=(ret<<7)+((((((*(a++)<<3)+*(a++))<<4)+*(a++))<<5)+*(a++));
    ret^=(ret>>6)+((((((*(a++)<<3)+*(a++))<<4)+*(a++))<<5)+*(a++));
  }
#endif
  return ret;
}

unsigned int hashstr(const char *str,int maxn)
{
  return hashmem(str,strlen(str),maxn);
}

unsigned int hash_svalue(struct svalue *s,unsigned int size)
{
  switch (s->type)
  {
    case T_NUMBER: return (s->u.number) % size;
    case T_OBJECT: return (s->u.ob->clone_number) % size;
    case T_STRING: return hashstr(strptr(s),100) % size;
    case T_POINTER:
    case T_ALIST_PART: return s->u.vec->size % size;
    case T_LIST:
    case T_MAPPING:  return s->u.vec->item[0].u.vec->size % size;
    default: return 0;
  }
}