qse/ase/lsp/obj.h

152 lines
3.4 KiB
C
Raw Normal View History

2005-02-04 15:39:11 +00:00
/*
2005-09-18 11:54:23 +00:00
* $Id: obj.h,v 1.1 2005-09-18 11:54:23 bacon Exp $
2005-02-04 15:39:11 +00:00
*/
2005-09-18 11:54:23 +00:00
#ifndef _XP_LSP_OBJ_H_
#define _XP_LSP_OBJ_H_
2005-02-04 15:39:11 +00:00
2005-05-28 13:34:26 +00:00
#include <xp/lsp/types.h>
2005-02-04 15:39:11 +00:00
// object types
enum
{
2005-09-18 08:10:50 +00:00
XP_LSP_OBJ_NIL = 0,
XP_LSP_OBJ_TRUE,
XP_LSP_OBJ_INT,
XP_LSP_OBJ_FLOAT,
XP_LSP_OBJ_SYMBOL,
XP_LSP_OBJ_STRING,
XP_LSP_OBJ_CONS,
XP_LSP_OBJ_FUNC,
XP_LSP_OBJ_MACRO,
XP_LSP_OBJ_PRIM,
XP_LSP_TYPE_COUNT // the number of lsp object types
2005-02-04 15:39:11 +00:00
};
2005-09-18 08:10:50 +00:00
#define XP_LSP_OBJ_HEADER \
2005-02-04 16:00:37 +00:00
xp_uint32_t type: 24; \
xp_uint32_t mark: 4; \
xp_uint32_t lock: 4; \
2005-02-04 15:39:11 +00:00
xp_size_t size; \
2005-09-18 08:10:50 +00:00
struct xp_lsp_obj_t* link
2005-02-04 15:39:11 +00:00
2005-09-18 08:10:50 +00:00
struct xp_lsp_obj_t
2005-02-04 15:39:11 +00:00
{
2005-09-18 08:10:50 +00:00
XP_LSP_OBJ_HEADER;
2005-02-04 15:39:11 +00:00
};
2005-09-18 08:10:50 +00:00
struct xp_lsp_obj_nil_t
2005-02-04 15:39:11 +00:00
{
2005-09-18 08:10:50 +00:00
XP_LSP_OBJ_HEADER;
2005-02-04 15:39:11 +00:00
};
2005-09-18 08:10:50 +00:00
struct xp_lsp_obj_true_t
2005-02-04 15:39:11 +00:00
{
2005-09-18 08:10:50 +00:00
XP_LSP_OBJ_HEADER;
2005-02-04 15:39:11 +00:00
};
2005-09-18 08:10:50 +00:00
struct xp_lsp_obj_int_t
2005-02-04 15:39:11 +00:00
{
2005-09-18 08:10:50 +00:00
XP_LSP_OBJ_HEADER;
xp_lsp_int_t value;
2005-02-04 15:39:11 +00:00
};
2005-09-18 08:10:50 +00:00
struct xp_lsp_obj_float_t
2005-02-04 15:39:11 +00:00
{
2005-09-18 08:10:50 +00:00
XP_LSP_OBJ_HEADER;
xp_lsp_real_t value;
2005-02-04 15:39:11 +00:00
};
2005-09-18 08:10:50 +00:00
struct xp_lsp_obj_symbol_t
2005-02-04 15:39:11 +00:00
{
2005-09-18 08:10:50 +00:00
XP_LSP_OBJ_HEADER;
2005-02-04 15:39:11 +00:00
#ifdef __BORLANDC__
#else
2005-02-07 15:10:41 +00:00
xp_char_t buffer[0];
2005-02-04 15:39:11 +00:00
#endif
};
2005-09-18 08:10:50 +00:00
struct xp_lsp_obj_string_t
2005-02-04 15:39:11 +00:00
{
2005-09-18 08:10:50 +00:00
XP_LSP_OBJ_HEADER;
2005-02-04 15:39:11 +00:00
#ifdef __BORLANDC__
#else
2005-02-07 15:10:41 +00:00
xp_char_t buffer[0];
2005-02-04 15:39:11 +00:00
#endif
};
2005-09-18 08:10:50 +00:00
struct xp_lsp_obj_cons_t
2005-02-04 15:39:11 +00:00
{
2005-09-18 08:10:50 +00:00
XP_LSP_OBJ_HEADER;
struct xp_lsp_obj_t* car;
struct xp_lsp_obj_t* cdr;
2005-02-04 15:39:11 +00:00
};
2005-09-18 08:10:50 +00:00
struct xp_lsp_obj_func_t
2005-02-04 15:39:11 +00:00
{
2005-09-18 08:10:50 +00:00
XP_LSP_OBJ_HEADER;
struct xp_lsp_obj_t* formal;
struct xp_lsp_obj_t* body;
2005-02-04 15:39:11 +00:00
};
2005-09-18 08:10:50 +00:00
struct xp_lsp_obj_macro_t
2005-02-04 15:39:11 +00:00
{
2005-09-18 08:10:50 +00:00
XP_LSP_OBJ_HEADER;
struct xp_lsp_obj_t* formal;
struct xp_lsp_obj_t* body;
2005-02-04 15:39:11 +00:00
};
2005-09-18 08:10:50 +00:00
struct xp_lsp_obj_prim_t
2005-02-04 15:39:11 +00:00
{
2005-09-18 08:10:50 +00:00
XP_LSP_OBJ_HEADER;
void* impl; // xp_lsp_prim_t
2005-02-04 15:39:11 +00:00
};
2005-09-18 08:10:50 +00:00
typedef struct xp_lsp_obj_t xp_lsp_obj_t;
typedef struct xp_lsp_obj_nil_t xp_lsp_obj_nil_t;
typedef struct xp_lsp_obj_true_t xp_lsp_obj_true_t;
typedef struct xp_lsp_obj_int_t xp_lsp_obj_int_t;
typedef struct xp_lsp_obj_float_t xp_lsp_obj_float_t;
typedef struct xp_lsp_obj_symbol_t xp_lsp_obj_symbol_t;
typedef struct xp_lsp_obj_string_t xp_lsp_obj_string_t;
typedef struct xp_lsp_obj_cons_t xp_lsp_obj_cons_t;
typedef struct xp_lsp_obj_func_t xp_lsp_obj_func_t;
typedef struct xp_lsp_obj_macro_t xp_lsp_obj_macro_t;
typedef struct xp_lsp_obj_prim_t xp_lsp_obj_prim_t;
2005-02-04 15:39:11 +00:00
// header access
2005-09-18 08:10:50 +00:00
#define XP_LSP_TYPE(x) (((xp_lsp_obj_t*)x)->type)
#define XP_LSP_SIZE(x) (((xp_lsp_obj_t*)x)->size)
#define XP_LSP_MARK(x) (((xp_lsp_obj_t*)x)->mark)
#define XP_LSP_LOCK(x) (((xp_lsp_obj_t*)x)->lock)
#define XP_LSP_LINK(x) (((xp_lsp_obj_t*)x)->link)
2005-02-04 15:39:11 +00:00
// value access
2005-09-18 08:10:50 +00:00
#define XP_LSP_IVALUE(x) (((xp_lsp_obj_int_t*)x)->value)
#define XP_LSP_FVALUE(x) (((xp_lsp_obj_float_t*)x)->value)
2005-02-04 15:39:11 +00:00
#ifdef __BORLANDC__
2005-09-18 08:10:50 +00:00
#define XP_LSP_SYMVALUE(x) ((xp_char_t*)(((xp_lsp_obj_symbol_t*)x) + 1))
2005-02-04 15:39:11 +00:00
#else
2005-09-18 08:10:50 +00:00
#define XP_LSP_SYMVALUE(x) (((xp_lsp_obj_symbol_t*)x)->buffer)
2005-02-04 15:39:11 +00:00
#endif
2005-09-18 08:10:50 +00:00
#define XP_LSP_SYMLEN(x) ((((xp_lsp_obj_symbol_t*)x)->size - sizeof(xp_lsp_obj_t)) / sizeof(xp_char_t) - 1)
2005-02-04 15:39:11 +00:00
#ifdef __BORLANDC__
2005-09-18 08:10:50 +00:00
#define XP_LSP_STRVALUE(x) ((xp_char_t*)(((xp_lsp_obj_string_t*)x) + 1))
2005-02-04 15:39:11 +00:00
#else
2005-09-18 08:10:50 +00:00
#define XP_LSP_STRVALUE(x) (((xp_lsp_obj_string_t*)x)->buffer)
2005-02-04 15:39:11 +00:00
#endif
2005-09-18 08:10:50 +00:00
#define XP_LSP_STRLEN(x) ((((xp_lsp_obj_string_t*)x)->size - sizeof(xp_lsp_obj_t)) / sizeof(xp_char_t) - 1)
#define XP_LSP_CAR(x) (((xp_lsp_obj_cons_t*)x)->car)
#define XP_LSP_CDR(x) (((xp_lsp_obj_cons_t*)x)->cdr)
#define XP_LSP_FFORMAL(x) (((xp_lsp_obj_func_t*)x)->formal)
#define XP_LSP_FBODY(x) (((xp_lsp_obj_func_t*)x)->body)
#define XP_LSP_MFORMAL(x) (((xp_lsp_obj_macro_t*)x)->formal)
#define XP_LSP_MBODY(x) (((xp_lsp_obj_macro_t*)x)->body)
#define XP_LSP_PIMPL(x) ((xp_lsp_pimpl_t)(((xp_lsp_obj_prim_t*)x)->impl))
2005-02-04 15:39:11 +00:00
#endif