*** empty log message ***
This commit is contained in:
		| @ -1,10 +1,11 @@ | |||||||
| /* | /* | ||||||
|  * $Id: hash.c,v 1.2 2005-05-09 15:55:04 bacon Exp $ |  * $Id: hash.c,v 1.3 2005-05-10 06:02:19 bacon Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include <xp/stx/hash.h> | #include <xp/stx/hash.h> | ||||||
|  |  | ||||||
| int xp_stx_new_link (xp_stx_t* stx, xp_stx_word_t key, xp_stx_word_t value) | xp_stx_word_t xp_stx_new_link ( | ||||||
|  | 	xp_stx_t* stx, xp_stx_word_t key, xp_stx_word_t value) | ||||||
| { | { | ||||||
| 	xp_stx_word_t x; | 	xp_stx_word_t x; | ||||||
|  |  | ||||||
| @ -17,29 +18,45 @@ int xp_stx_new_link (xp_stx_t* stx, xp_stx_word_t key, xp_stx_word_t value) | |||||||
| 	return x; | 	return x; | ||||||
| } | } | ||||||
|  |  | ||||||
| void xp_stx_hash_insert ( | /* returns the entire link */ | ||||||
| 	xp_stx_t* stx, xp_stx_word_t hash,  | xp_stx_word_t xp_stx_hash_lookup ( | ||||||
| 	xp_stx_word_t key, xp_stx_word_t value) | 	xp_stx_t* stx, xp_stx_word_t table, | ||||||
|  | 	xp_stx_word_t hash, xp_stx_word_t key) | ||||||
| { | { | ||||||
| 	xp_stx_word_t oaha, link; | 	xp_stx_word_t harr, link, next; | ||||||
|  |  | ||||||
| 	/* the first instance variable is an open addressing hash array */ | 	xp_assert (XP_STX_TYPE(stx,table) == XP_STX_INDEXED); | ||||||
| 	oaha = XP_STX_AT(stx,stx->globals,0); |  | ||||||
|  |  | ||||||
| 	hash = hash % oaha_size; | 	harr = XP_STX_AT(stx,table,0); | ||||||
| 	link = XP_STX_AT(stx,oaha,hash); | 	hash = link % XP_STX_SIZE(stx,table); | ||||||
|  | 	link = XP_STX_AT(stx,harr,hash); | ||||||
|  |  | ||||||
| 	if (link == stx->nil || link == key) { | 	while (link != stx->nil) { | ||||||
| 		XP_STX_AT(oaha, hash + 1 | 		if (XP_STX_AT(stx,link,0) == key) return link; | ||||||
|  | 		link = XP_STX_AT(stx,link,2); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for (;;) { | 	return stx->nil; /* not found */ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void xp_stx_hash_insert ( | ||||||
|  | 	xp_stx_t* stx, xp_stx_word_t table, | ||||||
|  | 	xp_stx_word_t hash, xp_stx_word_t key, xp_stx_word_t value) | ||||||
|  | { | ||||||
|  | 	xp_stx_word_t harr, link, next; | ||||||
|  |  | ||||||
|  | 	xp_assert (XP_STX_TYPE(stx,table) == XP_STX_INDEXED); | ||||||
|  |  | ||||||
|  | 	harr = XP_STX_AT(stx,table,0); | ||||||
|  | 	hash = link % XP_STX_SIZE(stx,table); | ||||||
|  | 	link = XP_STX_AT(stx,harr,hash); | ||||||
|  |  | ||||||
| 	if (link == stx->nil) { | 	if (link == stx->nil) { | ||||||
| 		new = xp_stx_new_link (stx, key, value); | 		new = xp_stx_new_link (stx, key, value); | ||||||
| 			 | 		XP_STX_AT(stx,harr,hash) = new; | ||||||
| 	} | 	} | ||||||
|  | 	else { | ||||||
| 		/* | 		for (;;) { | ||||||
| 			if (XP_STX_AT(stx,link,0) == key) { | 			if (XP_STX_AT(stx,link,0) == key) { | ||||||
| 				XP_STX_AT(stx,link,1) = value; | 				XP_STX_AT(stx,link,1) = value; | ||||||
| 				break;		 | 				break;		 | ||||||
| @ -53,6 +70,6 @@ void xp_stx_hash_insert ( | |||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			link = next; | 			link = next; | ||||||
| 		*/ | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,14 +1,25 @@ | |||||||
| /* | /* | ||||||
|  * $Id: hash.h,v 1.1 2005-05-08 15:54:44 bacon Exp $ |  * $Id: hash.h,v 1.2 2005-05-10 06:02:19 bacon Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #ifndef _XP_STX_HASH_H_ | #ifndef _XP_STX_HASH_H_ | ||||||
| #define _XP_STX_HASH_H_ | #define _XP_STX_HASH_H_ | ||||||
|  |  | ||||||
|  | #include <xp/stx/stx.h> | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| extern "C" | extern "C" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | xp_stx_word_t xp_stx_new_link ( | ||||||
|  | 	xp_stx_t* stx, xp_stx_word_t key, xp_stx_word_t value); | ||||||
|  | xp_stx_word_t xp_stx_hash_lookup ( | ||||||
|  | 	xp_stx_t* stx, xp_stx_word_t table, | ||||||
|  | 	xp_stx_word_t hash, xp_stx_word_t key); | ||||||
|  | void xp_stx_hash_insert ( | ||||||
|  | 	xp_stx_t* stx, xp_stx_word_t table, | ||||||
|  | 	xp_stx_word_t hash, xp_stx_word_t key, xp_stx_word_t value); | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: stx.h,v 1.5 2005-05-08 15:22:45 bacon Exp $ |  * $Id: stx.h,v 1.6 2005-05-10 06:02:19 bacon Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #ifndef _XP_STX_STX_H_ | #ifndef _XP_STX_STX_H_ | ||||||
| @ -30,8 +30,8 @@ typedef struct xp_stx_t xp_stx_t; | |||||||
|  |  | ||||||
| struct xp_stx_object_t | struct xp_stx_object_t | ||||||
| { | { | ||||||
| 	/* access - mode: 2; size: rest; | 	/* access - type: 2; size: rest; | ||||||
| 	 * mode - word indexed: 00 byte indexed: 01 char indexed: 10 | 	 * type - word indexed: 00 byte indexed: 01 char indexed: 10 | ||||||
| 	 */ | 	 */ | ||||||
| 	xp_stx_word_t access;  | 	xp_stx_word_t access;  | ||||||
| 	xp_stx_word_t class; | 	xp_stx_word_t class; | ||||||
| @ -69,6 +69,7 @@ struct xp_stx_t | |||||||
| 	xp_stx_word_t nil; | 	xp_stx_word_t nil; | ||||||
| 	xp_stx_word_t true; | 	xp_stx_word_t true; | ||||||
| 	xp_stx_word_t false; | 	xp_stx_word_t false; | ||||||
|  | 	xp_stx_word_t symbol_table; | ||||||
|  |  | ||||||
| 	xp_bool_t __malloced; | 	xp_bool_t __malloced; | ||||||
| }; | }; | ||||||
| @ -85,16 +86,22 @@ struct xp_stx_t | |||||||
| #define XP_STX_STRING_OBJECT(mem,idx) \ | #define XP_STX_STRING_OBJECT(mem,idx) \ | ||||||
| 	((xp_stx_string_object_t*)((mem)->slots[idx])) | 	((xp_stx_string_object_t*)((mem)->slots[idx])) | ||||||
| #define XP_STX_OBJECT_DATA(mem,idx) \ | #define XP_STX_OBJECT_DATA(mem,idx) \ | ||||||
| 	(((XP_STX_OBJECT_ACCESS(mem,idx) & 0x03) == 0x00)? \ | 	((XP_STX_OBJECT_TYPE(mem,idx) == XP_STX_INDEXED)? \ | ||||||
| 		(XP_STX_OBJECT(mem,idx)).data): \ | 		(XP_STX_OBJECT(mem,idx)).data): \ | ||||||
| 	 (((XP_STX_OBJECT_ACCESS(mem,idx) & 0x03) == 0x01)? \ | 	 ((XP_STX_OBJECT_TYPE(mem,idx) == XP_STX_BYTE_INDEXED)? \ | ||||||
| 		(XP_STX_BYTE_OBJECT(mem,idx)).data): \ | 		(XP_STX_BYTE_OBJECT(mem,idx)).data): \ | ||||||
| 		(XP_STX_STRING_OBJECT(mem,idx)).data)) | 		(XP_STX_STRING_OBJECT(mem,idx)).data)) | ||||||
| */ | */ | ||||||
|  |  | ||||||
| #define XP_STX_OBJECT(stx,idx) (((stx)->memory).slots[idx]) | #define XP_STX_OBJECT(stx,idx) (((stx)->memory).slots[idx]) | ||||||
| #define XP_STX_ACCESS(stx,idx) (XP_STX_OBJECT(stx,(idx))->access) |  | ||||||
| #define XP_STX_CLASS(stx,idx) (XP_STX_OBJECT(stx,(idx))->class) | #define XP_STX_CLASS(stx,idx) (XP_STX_OBJECT(stx,(idx))->class) | ||||||
|  | #define XP_STX_ACCESS(stx,idx) (XP_STX_OBJECT(stx,(idx))->access) | ||||||
|  |  | ||||||
|  | #define XP_STX_TYPE(stx,idx) (XP_STX_ACCESS(stx,idx) & 0x03) | ||||||
|  | #define XP_STX_SIZE(stx,idx) (XP_STX_ACCESS(stx,idx) >> 0x02) | ||||||
|  | #define XP_STX_INDEXED       (0x00) | ||||||
|  | #define XP_STX_BYTE_INDEXED  (0x01) | ||||||
|  | #define XP_STX_CHAR_INDEXED  (0x02) | ||||||
|  |  | ||||||
| #define XP_STX_AT(stx,idx,n) \ | #define XP_STX_AT(stx,idx,n) \ | ||||||
| 	(((xp_stx_word_t*)(XP_STX_OBJECT(stx,idx) + 1))[n]) | 	(((xp_stx_word_t*)(XP_STX_OBJECT(stx,idx) + 1))[n]) | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user