cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | |
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | ||| This file a part of Pike, and is copyright by Fredrik Hubinette
||| Pike is distributed as GPL (General Public License)
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | ||| See the files COPYING and DISCLAIMER for more information.
\*/
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "global.h"
|
fe3dd1 | 1997-09-08 | Henrik Grubbström (Grubba) | | RCSID("$Id: mapping.c,v 1.22 1997/09/08 21:51:04 grubba Exp $");
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | #include "main.h"
#include "object.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "mapping.h"
#include "svalue.h"
#include "array.h"
|
bb55f8 | 1997-03-16 | Fredrik Hübinette (Hubbe) | | #include "pike_macros.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "language.h"
#include "error.h"
|
9aa6fa | 1997-05-19 | Fredrik Hübinette (Hubbe) | | #include "pike_memory.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "dynamic_buffer.h"
#include "interpret.h"
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | #include "las.h"
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | | #include "gc.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #define AVG_LINK_LENGTH 4
#define MIN_LINK_LENGTH 1
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | #define MAP_SLOTS(X) ((X)?((X)+((X)>>4)+8):0)
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | #define LOOP(m) for(e=0;e<m->hashsize;e++) for(k=m->hash[e];k;k=k->next)
struct keypair
{
struct keypair *next;
struct svalue ind, val;
};
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
struct mapping *first_mapping;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
#ifdef DEBUG
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | static void check_mapping_type_fields(struct mapping *m)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | INT32 e;
struct keypair *k,**prev;
TYPE_FIELD ind_types, val_types;
ind_types=val_types=0;
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | LOOP(m)
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | {
val_types |= 1 << k->val.type;
ind_types |= 1 << k->ind.type;
}
if(val_types & ~(m->val_types))
fatal("Mapping value types out of order!\n");
if(ind_types & ~(m->ind_types))
fatal("Mapping indices types out of order!\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | static void init_mapping(struct mapping *m, INT32 size)
{
char *tmp;
INT32 e;
INT32 hashsize,hashspace;
#ifdef DEBUG
if(size < 0) fatal("init_mapping with negative value.\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | if(size)
{
hashsize=size / AVG_LINK_LENGTH + 1;
if(!(hashsize & 1)) hashsize++;
hashspace=hashsize+1;
e=sizeof(struct keypair)*size+ sizeof(struct keypair *)*hashspace;
tmp=(char *)xalloc(e);
m->hash=(struct keypair **) tmp;
m->hashsize=hashsize;
tmp+=sizeof(struct keypair *)*hashspace;
MEMSET((char *)m->hash, 0, sizeof(struct keypair *) * m->hashsize);
m->free_list=(struct keypair *) tmp;
for(e=1;e<size;e++)
m->free_list[e-1].next = m->free_list + e;
m->free_list[e-1].next=0;
}else{
m->hashsize=0;
m->hash=0;
m->free_list=0;
}
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | m->ind_types = 0;
m->val_types = 0;
m->size = 0;
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | |
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
14dae9 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | struct mapping *allocate_mapping(int size)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct mapping *m;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
GC_ALLOC();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | m=ALLOC_STRUCT(mapping);
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
init_mapping(m,size);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | m->next = first_mapping;
m->prev = 0;
m->refs = 1;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(first_mapping) first_mapping->prev = m;
first_mapping=m;
return m;
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | |
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
void really_free_mapping(struct mapping *m)
{
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | INT32 e;
struct keypair *k;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG
if(m->refs)
fatal("really free mapping on mapping with nonzero refs.\n");
#endif
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | LOOP(m)
{
free_svalue(& k->val);
free_svalue(& k->ind);
}
if(m->prev)
m->prev->next = m->next;
else
first_mapping = m->next;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
if(m->next) m->next->prev = m->prev;
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | if(m->hash)
free((char *)m->hash);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | free((char *)m);
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
GC_FREE();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | static void mapping_rehash_backwards(struct mapping *m, struct keypair *p)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | unsigned INT32 h;
struct keypair *tmp;
if(!p) return;
mapping_rehash_backwards(m,p->next);
h=hash_svalue(& p->ind) % m->hashsize;
tmp=m->free_list;
m->free_list=tmp->next;
tmp->next=m->hash[h];
m->hash[h]=tmp;
tmp->ind=p->ind;
tmp->val=p->val;
m->size++;
m->ind_types |= 1 << p->ind.type;
m->val_types |= 1 << p->val.type;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | static struct mapping *rehash(struct mapping *m, int new_size)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG
INT32 tmp=m->size;
#endif
INT32 e,hashsize;
struct keypair *k,**hash;
hashsize=m->hashsize;
hash=m->hash;
init_mapping(m, new_size);
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | if(hash)
{
for(e=0;e<hashsize;e++)
mapping_rehash_backwards(m, hash[e]);
free((char *)hash);
}
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
#ifdef DEBUG
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | if(m->size != tmp)
fatal("Rehash failed, size not same any more.\n");
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | #endif
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | |
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG
if(d_flag > 1) check_mapping_type_fields(m);
#endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return m;
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | void mapping_fix_type_field(struct mapping *m)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | INT32 e;
struct keypair *k;
TYPE_FIELD ind_types, val_types;
val_types = ind_types = 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | LOOP(m)
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
val_types |= 1 << k->val.type;
ind_types |= 1 << k->ind.type;
}
#ifdef DEBUG
if(val_types & ~(m->val_types))
fatal("Mapping value types out of order!\n");
if(ind_types & ~(m->ind_types))
fatal("Mapping indices types out of order!\n");
#endif
m->val_types = val_types;
m->ind_types = ind_types;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | void mapping_insert(struct mapping *m,
struct svalue *key,
struct svalue *val)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | unsigned INT32 h,h2;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | struct keypair *k, **prev;
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | h2=hash_svalue(key);
if(m->hashsize)
{
h=h2 % m->hashsize;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
#ifdef DEBUG
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1) check_mapping_type_fields(m);
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | #endif
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | if(m->ind_types & (1 << key->type))
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
|
9c6f7d | 1997-04-15 | Fredrik Hübinette (Hubbe) | | for(prev= m->hash + h;(k=*prev);prev=&k->next)
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | if(is_eq(& k->ind, key))
{
*prev=k->next;
k->next=m->hash[h];
m->hash[h]=k;
m->val_types |= 1 << val->type;
assign_svalue(& k->val, val);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1) check_mapping_type_fields(m);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #endif
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | return;
}
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
}
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | }else{
h=0;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | |
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | if(!(k=m->free_list))
{
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | rehash(m, m->size * 2 + 2);
h=h2 % m->hashsize;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | k=m->free_list;
}
m->free_list=k->next;
k->next=m->hash[h];
m->hash[h]=k;
m->ind_types |= 1 << key->type;
m->val_types |= 1 << val->type;
assign_svalue_no_free(& k->ind, key);
assign_svalue_no_free(& k->val, val);
m->size++;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG
if(d_flag > 1) check_mapping_type_fields(m);
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | #endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | union anything *mapping_get_item_ptr(struct mapping *m,
struct svalue *key,
TYPE_T t)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | unsigned INT32 h, h2;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | struct keypair *k, **prev;
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | h2=hash_svalue(key);
if(m->hashsize)
{
h=h2 % m->hashsize;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
#ifdef DEBUG
if(d_flag > 1) check_mapping_type_fields(m);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
|
9c6f7d | 1997-04-15 | Fredrik Hübinette (Hubbe) | | for(prev= m->hash + h;(k=*prev);prev=&k->next)
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | {
if(is_eq(& k->ind, key))
{
*prev=k->next;
k->next=m->hash[h];
m->hash[h]=k;
if(k->val.type == t) return & ( k->val.u );
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1) check_mapping_type_fields(m);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #endif
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | |
return 0;
}
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | }else{
h=0;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | |
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | if(!(k=m->free_list))
{
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | rehash(m, m->size * 2 + 2);
h=h2 % m->hashsize;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | k=m->free_list;
}
m->free_list=k->next;
k->next=m->hash[h];
m->hash[h]=k;
assign_svalue_no_free(& k->ind, key);
k->val.type=T_INT;
k->val.subtype=NUMBER_NUMBER;
k->val.u.integer=0;
m->ind_types |= 1 << key->type;
m->val_types |= BIT_INT;
m->size++;
if(t != T_INT) return 0;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG
if(d_flag > 1) check_mapping_type_fields(m);
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | #endif
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
return & ( k->val.u );
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
void map_delete(struct mapping *m,
struct svalue *key)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | unsigned INT32 h;
struct keypair *k, **prev;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | if(!m->size) return;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | h=hash_svalue(key) % m->hashsize;
|
9c6f7d | 1997-04-15 | Fredrik Hübinette (Hubbe) | | for(prev= m->hash + h;(k=*prev);prev=&k->next)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | if(is_eq(& k->ind, key))
{
*prev=k->next;
free_svalue(& k->ind);
free_svalue(& k->val);
k->next=m->free_list;
m->free_list=k;
m->size--;
if(m->size < (m->hashsize + 1) * MIN_LINK_LENGTH)
rehash(m, MAP_SLOTS(m->size));
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG
if(d_flag > 1) check_mapping_type_fields(m);
#endif
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | return;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
void check_mapping_for_destruct(struct mapping *m)
{
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | INT32 e;
struct keypair *k, **prev;
TYPE_FIELD ind_types, val_types;
#ifdef DEBUG
if(d_flag > 1) check_mapping_type_fields(m);
#endif
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | if(!m->size) return;
|
4ab0aa | 1996-09-23 | Fredrik Hübinette (Hubbe) | | if((m->ind_types | m->val_types) & (BIT_OBJECT | BIT_FUNCTION))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | val_types = ind_types = 0;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | m->val_types |= BIT_INT;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | for(e=0;e<m->hashsize;e++)
{
|
9c6f7d | 1997-04-15 | Fredrik Hübinette (Hubbe) | | for(prev= m->hash + e;(k=*prev);)
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
check_destructed(& k->val);
|
4ab0aa | 1996-09-23 | Fredrik Hübinette (Hubbe) | | if((k->ind.type == T_OBJECT || k->ind.type == T_FUNCTION) &&
!k->ind.u.object->prog)
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
*prev=k->next;
free_svalue(& k->ind);
free_svalue(& k->val);
k->next=m->free_list;
m->free_list=k;
m->size--;
}else{
val_types |= 1 << k->val.type;
ind_types |= 1 << k->ind.type;
|
cb859e | 1996-09-23 | Fredrik Hübinette (Hubbe) | | prev=&k->next;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
}
}
if(MAP_SLOTS(m->size) < m->hashsize * MIN_LINK_LENGTH)
rehash(m, MAP_SLOTS(m->size));
m->val_types = val_types;
m->ind_types = ind_types;
#ifdef DEBUG
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1) check_mapping_type_fields(m);
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | #endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct svalue *low_mapping_lookup(struct mapping *m,
struct svalue *key)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | unsigned INT32 h;
struct keypair *k, **prev;
#ifdef DEBUG
if(d_flag > 1) check_mapping_type_fields(m);
#endif
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | if(!m->size) return 0;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
if((1 << key->type) & m->ind_types)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | h=hash_svalue(key) % m->hashsize;
|
9c6f7d | 1997-04-15 | Fredrik Hübinette (Hubbe) | | for(prev= m->hash + h;(k=*prev);prev=&k->next)
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
if(is_eq(& k->ind, key))
{
*prev=k->next;
k->next=m->hash[h];
m->hash[h]=k;
return &k->val;
}
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
return 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
14dae9 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | struct svalue *low_mapping_string_lookup(struct mapping *m,
struct pike_string *p)
{
struct svalue tmp;
tmp.type=T_STRING;
tmp.u.string=p;
return low_mapping_lookup(m, &tmp);
}
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | void mapping_index_no_free(struct svalue *dest,
struct mapping *m,
struct svalue *key)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | struct svalue *p;
|
9c6f7d | 1997-04-15 | Fredrik Hübinette (Hubbe) | | if((p=low_mapping_lookup(m,key)))
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | if(p->type==T_INT)
p->subtype=NUMBER_NUMBER;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | assign_svalue_no_free(dest, p);
}else{
dest->type=T_INT;
dest->u.integer=0;
dest->subtype=NUMBER_UNDEFINED;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | struct array *mapping_indices(struct mapping *m)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | INT32 e;
struct array *a;
struct svalue *s;
struct keypair *k;
a=allocate_array(m->size);
s=ITEM(a);
LOOP(m) assign_svalue(s++, & k->ind);
a->type_field = m->ind_types;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG
if(d_flag > 1) check_mapping_type_fields(m);
#endif
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | return a;
}
struct array *mapping_values(struct mapping *m)
{
INT32 e;
struct keypair *k;
struct array *a;
struct svalue *s;
a=allocate_array(m->size);
s=ITEM(a);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | LOOP(m) assign_svalue(s++, & k->val);
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
a->type_field = m->val_types;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
#ifdef DEBUG
if(d_flag > 1) check_mapping_type_fields(m);
#endif
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
return a;
}
void mapping_replace(struct mapping *m,struct svalue *from, struct svalue *to)
{
INT32 e;
struct keypair *k;
LOOP(m)
if(is_eq(& k->val, from))
assign_svalue(& k->val, to);
m->val_types |= 1 << to->type;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
#ifdef DEBUG
if(d_flag > 1) check_mapping_type_fields(m);
#endif
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
struct mapping *mkmapping(struct array *ind, struct array *val)
{
struct mapping *m;
struct svalue *i,*v;
INT32 e;
#ifdef DEBUG
if(ind->size != val->size)
fatal("mkmapping on different sized arrays.\n");
#endif
m=allocate_mapping(MAP_SLOTS(ind->size));
i=ITEM(ind);
v=ITEM(val);
for(e=0;e<ind->size;e++) mapping_insert(m, i++, v++);
return m;
}
struct mapping *copy_mapping(struct mapping *m)
{
INT32 e;
struct mapping *n;
struct keypair *k;
n=allocate_mapping(MAP_SLOTS(m->size));
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | LOOP(m) mapping_insert(n, &k->ind, &k->val);
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
36ce9c | 1996-10-08 | Fredrik Hübinette (Hubbe) | | return n;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
struct mapping *merge_mappings(struct mapping *a, struct mapping *b, INT32 op)
{
struct array *ai, *av;
struct array *bi, *bv;
struct array *ci, *cv;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | INT32 *zipper;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | struct mapping *m;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | ai=mapping_indices(a);
av=mapping_values(a);
zipper=get_set_order(ai);
order_array(ai, zipper);
order_array(av, zipper);
free((char *)zipper);
bi=mapping_indices(b);
bv=mapping_values(b);
zipper=get_set_order(bi);
order_array(bi, zipper);
order_array(bv, zipper);
free((char *)zipper);
zipper=merge(ai,bi,op);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | ci=array_zip(ai,bi,zipper);
free_array(ai);
free_array(bi);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | cv=array_zip(av,bv,zipper);
free_array(av);
free_array(bv);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | free((char *)zipper);
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
m=mkmapping(ci, cv);
free_array(ci);
free_array(cv);
return m;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | struct mapping *add_mappings(struct svalue *argp, INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct mapping *ret,*a,*b;
switch(args)
{
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | case 0: return allocate_mapping(0);
case 1: return copy_mapping(argp->u.mapping);
case 2: return merge_mappings(argp[0].u.mapping, argp[1].u.mapping, OP_ADD);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | case 3:
a=merge_mappings(argp[0].u.mapping,argp[1].u.mapping,OP_ADD);
ret=merge_mappings(a,argp[2].u.mapping,OP_ADD);
free_mapping(a);
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | return ret;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | default:
a=add_mappings(argp,args/2);
b=add_mappings(argp+args/2,args-args/2);
ret=merge_mappings(a,b,OP_ADD);
free_mapping(a);
free_mapping(b);
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | return ret;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
int mapping_equal_p(struct mapping *a, struct mapping *b, struct processing *p)
{
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | struct processing curr;
struct keypair *k;
INT32 e;
if(a==b) return 1;
if(a->size != b->size) return 0;
curr.pointer_a = a;
curr.pointer_b = b;
curr.next = p;
for( ;p ;p=p->next)
if(p->pointer_a == (void *)a && p->pointer_b == (void *)b)
return 1;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | check_mapping_for_destruct(a);
check_mapping_for_destruct(b);
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | LOOP(a)
{
struct svalue *s;
|
9c6f7d | 1997-04-15 | Fredrik Hübinette (Hubbe) | | if((s=low_mapping_lookup(b, & k->ind)))
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
if(!low_is_equal(s, &k->val, &curr)) return 0;
}else{
return 0;
}
}
return 1;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
void describe_mapping(struct mapping *m,struct processing *p,int indent)
{
struct processing doing;
INT32 e,d;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | struct keypair *k;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | char buf[40];
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | if(! m->size)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
my_strcat("([ ])");
return;
}
doing.next=p;
doing.pointer_a=(void *)m;
for(e=0;p;e++,p=p->next)
{
if(p->pointer_a == (void *)m)
{
|
f90e54 | 1995-08-17 | Fredrik Hübinette (Hubbe) | | sprintf(buf,"@%ld",(long)e);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | my_strcat(buf);
return;
}
}
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | sprintf(buf,"([ /* %ld elements */\n",(long) m->size);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | my_strcat(buf);
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
d=0;
LOOP(m)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
36ce9c | 1996-10-08 | Fredrik Hübinette (Hubbe) | | if(d)
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
my_strcat(",\n");
|
36ce9c | 1996-10-08 | Fredrik Hübinette (Hubbe) | | } else {
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | d=1;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | for(d=0; d<indent; d++) my_putchar(' ');
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | describe_svalue(& k->ind, indent+2, p);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | my_putchar(':');
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | describe_svalue(& k->val, indent+2, p);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | my_putchar('\n');
for(e=2; e<indent; e++) my_putchar(' ');
my_strcat("])");
}
node * make_node_from_mapping(struct mapping *m)
{
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | struct keypair *k;
INT32 e;
mapping_fix_type_field(m);
if((m->ind_types | m->val_types) & (BIT_FUNCTION | BIT_OBJECT))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | struct array *ind, *val;
node *n;
ind=mapping_indices(m);
|
69d94d | 1997-04-23 | Fredrik Hübinette (Hubbe) | | val=mapping_values(m);
|
3c04e8 | 1997-03-13 | Fredrik Hübinette (Hubbe) | | n=mkefuncallnode("mkmapping",
mknode(F_ARG_LIST,
make_node_from_array(ind),
make_node_from_array(val)));
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | free_array(ind);
free_array(val);
return n;
}else{
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | struct svalue s;
|
3c04e8 | 1997-03-13 | Fredrik Hübinette (Hubbe) | |
if(!m->size)
return mkefuncallnode("aggregate_mapping",0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | s.type=T_MAPPING;
s.subtype=0;
s.u.mapping=m;
return mkconstantsvaluenode(&s);
}
}
void f_m_delete(INT32 args)
{
if(args < 2)
error("Too few arguments to m_delete.\n");
if(sp[-args].type != T_MAPPING)
|
fe3dd1 | 1997-09-08 | Henrik Grubbström (Grubba) | | error("Bad argument 1 to m_delete.\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
map_delete(sp[-args].u.mapping,sp+1-args);
pop_n_elems(args-1);
}
void f_aggregate_mapping(INT32 args)
{
INT32 e;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | struct keypair *k;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | struct mapping *m;
if(args & 1)
|
24697f | 1997-03-12 | Henrik Grubbström (Grubba) | | error("Uneven number of arguments to aggregate_mapping.\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | m=allocate_mapping(MAP_SLOTS(args / 2));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | for(e=-args;e<0;e+=2) mapping_insert(m, sp+e, sp+e+1);
pop_n_elems(args);
push_mapping(m);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
struct mapping *copy_mapping_recursively(struct mapping *m,
struct processing *p)
{
struct processing doing;
struct mapping *ret;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | INT32 e;
struct keypair *k;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
doing.next=p;
doing.pointer_a=(void *)m;
for(;p;p=p->next)
{
if(p->pointer_a == (void *)m)
{
ret=(struct mapping *)p->pointer_b;
ret->refs++;
return ret;
}
}
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | ret=allocate_mapping(MAP_SLOTS(m->size));
doing.pointer_b=ret;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
f15240 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | check_stack(2);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | LOOP(m)
{
copy_svalues_recursively_no_free(sp,&k->ind, 1, p);
sp++;
copy_svalues_recursively_no_free(sp,&k->val, 1, p);
sp++;
mapping_insert(ret, sp-2, sp-1);
pop_n_elems(2);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
return ret;
}
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | void mapping_search_no_free(struct svalue *to,
struct mapping *m,
struct svalue *look_for,
struct svalue *start)
{
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | unsigned INT32 h;
struct keypair *k;
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | if(m->size)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | h=0;
k=m->hash[h];
if(start)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | h=hash_svalue(start) % m->hashsize;
for(k=m->hash[h];k;k=k->next)
if(is_eq(&k->ind, start))
break;
if(!k)
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | to->type=T_INT;
to->subtype=NUMBER_UNDEFINED;
to->u.integer=0;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | return;
}
k=k->next;
}
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | |
while(h < (unsigned INT32)m->hashsize)
{
while(k)
{
if(is_eq(look_for, &k->val))
{
assign_svalue_no_free(to,&k->ind);
return;
}
k=k->next;
}
k=m->hash[++h];
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
to->type=T_INT;
to->subtype=NUMBER_UNDEFINED;
to->u.integer=0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | void check_mapping(struct mapping *m)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
if(m->refs <=0)
fatal("Mapping has zero refs.\n");
if(m->next && m->next->prev != m)
fatal("Mapping ->next->prev != mapping.\n");
if(m->prev)
{
if(m->prev->next != m)
fatal("Mapping ->prev->next != mapping.\n");
}else{
if(first_mapping != m)
fatal("Mapping ->prev == 0 but first_mapping != mapping.\n");
}
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
if(m->hashsize < 0)
fatal("Assert: I don't think he's going to make it Jim.\n");
if(m->size < 0)
fatal("Core breach, evacuate ship!\n");
if(m->size > (m->hashsize + 3) * AVG_LINK_LENGTH)
fatal("Pretty mean hashtable there buster!.\n");
if(m->size < (m->hashsize - 3) * MIN_LINK_LENGTH)
fatal("Hashsize is too small for mapping.\n");
if(m->size > 0 && (!m->ind_types || !m->val_types))
fatal("Mapping type fields are... wrong.\n");
|
9076fa | 1997-02-17 | Fredrik Hübinette (Hubbe) | | if(!m->hash && m->size)
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | fatal("Hey! where did my hashtable go??\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void check_all_mappings(void)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct mapping *m;
for(m=first_mapping;m;m=m->next)
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | check_mapping(m);
}
#endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
#ifdef GC2
void gc_mark_mapping_as_referenced(struct mapping *m)
{
INT32 e;
struct keypair *k;
if(gc_mark(m))
{
if((m->ind_types | m->val_types) & BIT_COMPLEX)
{
LOOP(m)
{
|
5d7d05 | 1996-09-25 | Fredrik Hübinette (Hubbe) | |
if(((1 << k->ind.type) & (BIT_OBJECT | BIT_FUNCTION)) &&
!(k->ind.u.object->prog))
continue;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | gc_mark_svalues(&k->ind, 1);
gc_mark_svalues(&k->val, 1);
}
}
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void gc_check_all_mappings(void)
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
INT32 e;
struct keypair *k;
struct mapping *m;
for(m=first_mapping;m;m=m->next)
{
if((m->ind_types | m->val_types) & BIT_COMPLEX)
{
LOOP(m)
{
|
5d7d05 | 1996-09-25 | Fredrik Hübinette (Hubbe) | |
if(((1 << k->ind.type) & (BIT_OBJECT | BIT_FUNCTION)) &&
!(k->ind.u.object->prog))
continue;
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | gc_check_svalues(&k->ind, 1);
|
5d7d05 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | m->val_types |= gc_check_svalues(&k->val, 1);
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
#ifdef DEBUG
if(d_flag > 1) check_mapping_type_fields(m);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
}
}
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void gc_mark_all_mappings(void)
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
struct mapping *m;
for(m=first_mapping;m;m=m->next)
if(gc_is_referenced(m))
gc_mark_mapping_as_referenced(m);
}
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void gc_free_all_unreferenced_mappings(void)
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
INT32 e;
struct keypair *k;
struct mapping *m,*next;
for(m=first_mapping;m;m=next)
{
|
5d7d05 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | check_mapping_for_destruct(m);
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | if(gc_do_free(m))
{
m->refs++;
for(e=0;e<m->hashsize;e++)
{
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | k=m->hash[e];
while(k)
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
free_svalue(&k->ind);
free_svalue(&k->val);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
if(k->next)
{
k = k->next;
} else {
k->next=m->free_list;
m->free_list=m->hash[e];
m->hash[e]=0;
break;
}
|
515b6c | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
}
m->size=0;
next=m->next;
free_mapping(m);
}else{
next=m->next;
}
}
}
#endif /* GC2 */
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void zap_all_mappings(void)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
INT32 e;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct keypair *k;
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | | struct mapping *m,*next;
for(m=first_mapping;m;m=next)
{
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | m->refs++;
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | |
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | for(e=0;e<m->hashsize;e++)
{
|
9c6f7d | 1997-04-15 | Fredrik Hübinette (Hubbe) | | while((k=m->hash[e]))
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | {
|
66f747 | 1997-02-06 | Fredrik Hübinette (Hubbe) | | m->hash[e]=k->next;
k->next=m->free_list;
m->free_list=k;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | free_svalue(&k->ind);
free_svalue(&k->val);
}
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | | }
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | m->size=0;
next=m->next;
|
cbd60b | 1996-12-04 | Fredrik Hübinette (Hubbe) | |
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | | }
}
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | |
void count_memory_in_mappings(INT32 *num_, INT32 *size_)
{
INT32 num=0, size=0;
struct mapping *m;
for(m=first_mapping;m;m=m->next)
{
struct keypair *k;
num++;
size+=sizeof(struct mapping)+
sizeof(struct keypair *) * m->hashsize+
sizeof(struct keypair) * m->size;
for(k=m->free_list;k;k=k->next)
size+=sizeof(struct keypair);
}
*num_=num;
*size_=size;
}
|