Implementacao da nova estrategia para armazenar os arrays
em lista encadeada.
This commit is contained in:
120
hash.c
120
hash.c
@@ -4,7 +4,7 @@
|
||||
** Luiz Henrique de Figueiredo - 17 Aug 90
|
||||
*/
|
||||
|
||||
char *rcs_hash="$Id: hash.c,v 1.1 1993/12/17 18:41:19 celes Exp celes $";
|
||||
char *rcs_hash="$Id: hash.c,v 1.2 1994/03/28 15:14:02 celes Exp celes $";
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
@@ -26,10 +26,23 @@ char *rcs_hash="$Id: hash.c,v 1.1 1993/12/17 18:41:19 celes Exp celes $";
|
||||
#define nhash(t) ((t)->nhash)
|
||||
#define nodelist(t) ((t)->list)
|
||||
#define list(t,i) ((t)->list[i])
|
||||
#define markarray(t) ((t)->mark)
|
||||
#define ref_tag(n) (tag(&(n)->ref))
|
||||
#define ref_nvalue(n) (nvalue(&(n)->ref))
|
||||
#define ref_svalue(n) (svalue(&(n)->ref))
|
||||
|
||||
#ifndef ARRAYBLOCK
|
||||
#define ARRAYBLOCK 50
|
||||
#endif
|
||||
|
||||
typedef struct ArrayList
|
||||
{
|
||||
Hash *array;
|
||||
struct ArrayList *next;
|
||||
} ArrayList;
|
||||
|
||||
static ArrayList *listhead = NULL;
|
||||
|
||||
static int head (Hash *t, Object *ref) /* hash function */
|
||||
{
|
||||
if (tag(ref) == T_NUMBER) return (((int)nvalue(ref))%nhash(t));
|
||||
@@ -91,7 +104,7 @@ static void freelist (Node *n)
|
||||
/*
|
||||
** Create a new hash. Return the hash pointer or NULL on error.
|
||||
*/
|
||||
Hash *lua_hashcreate (unsigned int nhash)
|
||||
static Hash *hashcreate (unsigned int nhash)
|
||||
{
|
||||
Hash *t = new (Hash);
|
||||
if (t == NULL)
|
||||
@@ -113,7 +126,7 @@ Hash *lua_hashcreate (unsigned int nhash)
|
||||
/*
|
||||
** Delete a hash
|
||||
*/
|
||||
void lua_hashdelete (Hash *h)
|
||||
static void hashdelete (Hash *h)
|
||||
{
|
||||
int i;
|
||||
for (i=0; i<nhash(h); i++)
|
||||
@@ -122,6 +135,86 @@ void lua_hashdelete (Hash *h)
|
||||
free(h);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Mark a hash and check its elements
|
||||
*/
|
||||
void lua_hashmark (Hash *h)
|
||||
{
|
||||
if (markarray(h) == 0)
|
||||
{
|
||||
int i;
|
||||
markarray(h) = 1;
|
||||
for (i=0; i<nhash(h); i++)
|
||||
{
|
||||
Node *n;
|
||||
for (n = list(h,i); n != NULL; n = n->next)
|
||||
{
|
||||
lua_markobject(&n->ref);
|
||||
lua_markobject(&n->val);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** Garbage collection to arrays
|
||||
** Delete all unmarked arrays.
|
||||
*/
|
||||
void lua_hashcollector (void)
|
||||
{
|
||||
ArrayList *curr = listhead, *prev = NULL;
|
||||
while (curr != NULL)
|
||||
{
|
||||
ArrayList *next = curr->next;
|
||||
if (markarray(curr->array) != 1)
|
||||
{
|
||||
if (prev == NULL) listhead = next;
|
||||
else prev->next = next;
|
||||
hashdelete(curr->array);
|
||||
free(curr);
|
||||
}
|
||||
else
|
||||
{
|
||||
markarray(curr->array) = 0;
|
||||
prev = curr;
|
||||
}
|
||||
curr = next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Create a new array
|
||||
** This function insert the new array at array list. It also
|
||||
** execute garbage collection if the number of array created
|
||||
** exceed a pre-defined range.
|
||||
*/
|
||||
Hash *lua_createarray (int nhash)
|
||||
{
|
||||
ArrayList *new = new(ArrayList);
|
||||
if (new == NULL)
|
||||
{
|
||||
lua_error ("not enough memory");
|
||||
return NULL;
|
||||
}
|
||||
new->array = hashcreate(nhash);
|
||||
if (new->array == NULL)
|
||||
{
|
||||
lua_error ("not enough memory");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (lua_nentity == lua_block)
|
||||
lua_pack();
|
||||
|
||||
lua_nentity++;
|
||||
new->next = listhead;
|
||||
listhead = new;
|
||||
return new->array;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** If the hash node is present, return its pointer, otherwise create a new
|
||||
** node for the given reference and also return its pointer.
|
||||
@@ -151,26 +244,6 @@ Object *lua_hashdefine (Hash *t, Object *ref)
|
||||
return (&n->val);
|
||||
}
|
||||
|
||||
/*
|
||||
** Mark a hash and check its elements
|
||||
*/
|
||||
void lua_hashmark (Hash *h)
|
||||
{
|
||||
int i;
|
||||
|
||||
markarray(h) = 1;
|
||||
|
||||
for (i=0; i<nhash(h); i++)
|
||||
{
|
||||
Node *n;
|
||||
for (n = list(h,i); n != NULL; n = n->next)
|
||||
{
|
||||
lua_markobject (&n->ref);
|
||||
lua_markobject (&n->val);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Internal function to manipulate arrays.
|
||||
@@ -178,7 +251,6 @@ void lua_hashmark (Hash *h)
|
||||
** in the hash.
|
||||
** This function pushs the element value and its reference to the stack.
|
||||
*/
|
||||
#include "lua.h"
|
||||
static void firstnode (Hash *a, int h)
|
||||
{
|
||||
if (h < nhash(a))
|
||||
|
||||
Reference in New Issue
Block a user