/*
 * Implementation of the symbol table type.
 *
 * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
 */

/* Ported to Xen 3.0, George Coker, <gscoker@alpha.ncsc.mil> */

#include <xen/lib.h>
#include <xen/xmalloc.h>
#include <xen/string.h>
#include <xen/errno.h>
#include "symtab.h"

static unsigned int symhash(struct hashtab *h, const void *key)
{
    const char *p, *keyp;
    unsigned int size;
    unsigned int val;

    val = 0;
    keyp = key;
    size = strlen(keyp);
    for ( p = keyp; (p - keyp) < size; p++ )
        val = (val << 4 | (val >> (8*sizeof(unsigned int)-4))) ^ (*p);
    return val & (h->size - 1);
}

static int symcmp(struct hashtab *h, const void *key1, const void *key2)
{
    const char *keyp1, *keyp2;

    keyp1 = key1;
    keyp2 = key2;
    return strcmp(keyp1, keyp2);
}


int symtab_init(struct symtab *s, unsigned int size)
{
    s->table = hashtab_create(symhash, symcmp, size);
    if ( !s->table )
        return -1;
    s->nprim = 0;
    return 0;
}

