158 lines
3.7 KiB
C
158 lines
3.7 KiB
C
/*
|
|
* $Id: sce.h,v 1.2 2005-09-30 09:46:10 bacon Exp $
|
|
*/
|
|
|
|
#ifndef _XP_SCE_SCE_H_
|
|
#define _XP_SCE_SCE_H_
|
|
|
|
#include <xp/types.h>
|
|
#include <xp/macros.h>
|
|
|
|
typedef struct xp_sce_objhdr_t xp_sce_objhdr_t;
|
|
typedef struct xp_sce_obj_t xp_sce_obj_t;
|
|
typedef struct xp_sce_word_obj_t xp_sce_word_obj_t;
|
|
typedef struct xp_sce_byte_obj_t xp_sce_byte_obj_t;
|
|
typedef struct xp_sce_char_obj_t xp_sce_char_obj_t;
|
|
typedef struct xp_sce_int_obj_t xp_sce_int_obj_t;
|
|
typedef struct xp_sce_real_obj_t xp_sce_real_obj_t;
|
|
typedef struct xp_sce_mem_t xp_sce_mem_t;
|
|
typedef struct xp_sce_t xp_sce_t;
|
|
|
|
/* common obj structure */
|
|
struct xp_sce_objhdr_t
|
|
{
|
|
/*
|
|
* lower 4 bytes: atomic types...
|
|
* CHAR
|
|
* INT
|
|
* REAL
|
|
*
|
|
* the rest of the bytes: number of elements in the array.
|
|
* this value will be 1 for atomic types
|
|
*
|
|
* // array types
|
|
* ARRAY OF ATTOMIC TYPES
|
|
*/
|
|
xp_word_t access;
|
|
};
|
|
|
|
struct xp_sce_obj_t
|
|
{
|
|
xp_sce_objhdr_t hdr;
|
|
};
|
|
|
|
struct xp_sce_word_obj_t
|
|
{
|
|
xp_sce_objhdr_t hdr;
|
|
xp_word_t data[1];
|
|
};
|
|
|
|
struct xp_sce_byte_obj_t
|
|
{
|
|
xp_sce_objhdr_t hdr;
|
|
xp_byte_t data[1];
|
|
};
|
|
|
|
struct xp_sce_char_obj_t
|
|
{
|
|
xp_sce_objhdr_t hdr;
|
|
xp_char_t data[1];
|
|
};
|
|
|
|
struct xp_sce_int_obj_t
|
|
{
|
|
xp_sce_objhdr_t hdr;
|
|
xp_long_t data[1];
|
|
};
|
|
|
|
struct xp_sce_real_obj_t
|
|
{
|
|
xp_sce_objhdr_t hdr;
|
|
xp_real_t data[1];
|
|
};
|
|
|
|
struct xp_sce_proc_obj_t
|
|
{
|
|
xp_sce_objhdr_t hdr;
|
|
xp_real_
|
|
xp_byte_t code[1];
|
|
};
|
|
|
|
struct xp_sce_mem_t
|
|
{
|
|
xp_word_t capacity;
|
|
xp_sce_obj_t** slots;
|
|
xp_sce_obj_t** free;
|
|
xp_bool_t __malloced;
|
|
};
|
|
|
|
struct xp_sce_t
|
|
{
|
|
xp_sce_mem_t mem;
|
|
xp_bool_t __malloced;
|
|
};
|
|
|
|
#define XP_SCE_IS_SMALLINT(x) (((x) & 0x01) == 0x01)
|
|
#define XP_SCE_TO_SMALLINT(x) (((x) << 1) | 0x01)
|
|
#define XP_SCE_FROM_SMALLINT(x) ((x) >> 1)
|
|
|
|
#define XP_SCE_IS_OINDEX(x) (((x) & 0x01) == 0x00)
|
|
#define XP_SCE_TO_OINDEX(x) (((x) << 1) | 0x00)
|
|
#define XP_SCE_FROM_OINDEX(x) ((x) >> 1)
|
|
|
|
#define XP_SCE_NIL XP_SCE_TO_OINDEX(0)
|
|
|
|
#define XP_SCE_OBJ(sce,idx) (((sce)->mem).slots[XP_SCE_FROM_OINDEX(idx)])
|
|
#define XP_SCE_ACCESS(sce,idx) (XP_SCE_OBJ(sce,(idx))->hdr.access)
|
|
#define XP_SCE_DATA(sce,idx) ((void*)(XP_SCE_OBJ(sce,idx) + 1))
|
|
|
|
#define XP_SCE_TYPE(sce,idx) (XP_SCE_ACCESS(sce,idx) & 0x0F)
|
|
#define XP_SCE_SIZE(sce,idx) (XP_SCE_ACCESS(sce,idx) >> 0x04)
|
|
|
|
#define XP_SCE_WORD_INDEXED (0x00)
|
|
#define XP_SCE_BYTE_INDEXED (0x01)
|
|
#define XP_SCE_CHAR_INDEXED (0x02)
|
|
#define XP_SCE_INT_INDEXED (0x03)
|
|
#define XP_SCE_REAL_INDEXED (0x04)
|
|
|
|
#define XP_SCE_IS_WORD_OBJ(sce,idx) \
|
|
(XP_SCE_TYPE(sce,idx) == XP_SCE_WORD_INDEXED)
|
|
#define XP_SCE_IS_BYTE_OBJ(sce,idx) \
|
|
(XP_SCE_TYPE(sce,idx) == XP_SCE_BYTE_INDEXED)
|
|
#define XP_SCE_IS_CHAR_OBJ(sce,idx) \
|
|
(XP_SCE_TYPE(sce,idx) == XP_SCE_CHAR_INDEXED)
|
|
#define XP_SCE_IS_INT_OBJ(sce,idx) \
|
|
(XP_SCE_TYPE(sce,idx) == XP_SCE_INT_INDEXED)
|
|
#define XP_SCE_IS_REAL_OBJ(sce,idx) \
|
|
(XP_SCE_TYPE(sce,idx) == XP_SCE_REAL_INDEXED)
|
|
|
|
#define XP_SCE_WORD_OBJ(sce,idx) \
|
|
((xp_sce_word_obj_t*)XP_SCE_OBJ(sce,idx))
|
|
#define XP_SCE_BYTE_OBJ(sce,idx) \
|
|
((xp_sce_byte_obj_t*)XP_SCE_OBJ(sce,idx))
|
|
#define XP_SCE_CHAR_OBJ(sce,idx) \
|
|
((xp_sce_char_obj_t*)XP_SCE_OBJ(sce,idx))
|
|
#define XP_SCE_INT_OBJ(sce,idx) \
|
|
((xp_sce_int_obj_t*)XP_SCE_OBJ(sce,idx))
|
|
#define XP_SCE_REAL_OBJ(sce,idx) \
|
|
((xp_sce_real_obj_t*)XP_SCE_OBJ(sce,idx))
|
|
|
|
#define XP_SCE_WORD_AT(sce,idx,n) (XP_SCE_WORD_OBJ(sce,idx)->data[n])
|
|
#define XP_SCE_BYTE_AT(sce,idx,n) (XP_SCE_BYTE_OBJ(sce,idx)->data[n])
|
|
#define XP_SCE_CHAR_AT(sce,idx,n) (XP_SCE_CHAR_OBJ(sce,idx)->data[n])
|
|
#define XP_SCE_INT_AT(sce,idx,n) (XP_SCE_INT_OBJ(sce,idx)->data[n])
|
|
#define XP_SCE_REAL_AT(sce,idx,n) (XP_SCE_REAL_OBJ(sce,idx)->data[n])
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
xp_sce_t* xp_sce_open (xp_sce_t* sce, xp_word_t capacity);
|
|
void xp_sce_close (xp_sce_t* sce);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|