added more code for primitive module loading
This commit is contained in:
309
stix/lib/stix.h
309
stix/lib/stix.h
@ -27,252 +27,12 @@
|
||||
#ifndef _STIX_H_
|
||||
#define _STIX_H_
|
||||
|
||||
#include "stix-cmn.h"
|
||||
#include "stix-rbt.h"
|
||||
|
||||
/* TODO: move this macro out to the build files.... */
|
||||
#define STIX_INCLUDE_COMPILER
|
||||
|
||||
/* =========================================================================
|
||||
* PRIMITIVE TYPE DEFINTIONS
|
||||
* ========================================================================= */
|
||||
/* TODO: define these types and macros using autoconf */
|
||||
typedef unsigned char stix_uint8_t;
|
||||
typedef signed char stix_int8_t;
|
||||
|
||||
typedef unsigned short int stix_uint16_t;
|
||||
typedef signed short int stix_int16_t;
|
||||
|
||||
#if defined(__MSDOS__)
|
||||
typedef unsigned long int stix_uint32_t;
|
||||
typedef signed long int stix_int32_t;
|
||||
#else
|
||||
typedef unsigned int stix_uint32_t;
|
||||
typedef signed int stix_int32_t;
|
||||
#endif
|
||||
|
||||
#if defined(_WIN64)
|
||||
typedef unsigned __int64 stix_uintptr_t;
|
||||
typedef signed __int64 stix_intptr_t;
|
||||
typedef unsigned __int64 stix_size_t;
|
||||
typedef signed __int64 stix_ssize_t;
|
||||
#else
|
||||
typedef unsigned long int stix_uintptr_t;
|
||||
typedef signed long int stix_intptr_t;
|
||||
typedef unsigned long int stix_size_t;
|
||||
typedef signed long int stix_ssize_t;
|
||||
#endif
|
||||
|
||||
typedef stix_uint8_t stix_byte_t;
|
||||
typedef stix_uint16_t stix_uch_t; /* TODO ... wchar_t??? */
|
||||
typedef stix_int32_t stix_uci_t;
|
||||
typedef char stix_bch_t;
|
||||
|
||||
struct stix_ucs_t
|
||||
{
|
||||
stix_uch_t* ptr;
|
||||
stix_size_t len;
|
||||
};
|
||||
typedef struct stix_ucs_t stix_ucs_t;
|
||||
|
||||
|
||||
|
||||
/* =========================================================================
|
||||
* PRIMITIVE MACROS
|
||||
* ========================================================================= */
|
||||
#define STIX_UCI_EOF ((stix_uci_t)-1)
|
||||
#define STIX_UCI_NL ((stix_uci_t)'\n')
|
||||
|
||||
#define STIX_SIZEOF(x) (sizeof(x))
|
||||
#define STIX_COUNTOF(x) (sizeof(x) / sizeof(x[0]))
|
||||
|
||||
/**
|
||||
* The STIX_OFFSETOF() macro returns the offset of a field from the beginning
|
||||
* of a structure.
|
||||
*/
|
||||
#define STIX_OFFSETOF(type,member) ((stix_uintptr_t)&((type*)0)->member)
|
||||
|
||||
/**
|
||||
* The STIX_ALIGNOF() macro returns the alignment size of a structure.
|
||||
* Note that this macro may not work reliably depending on the type given.
|
||||
*/
|
||||
#define STIX_ALIGNOF(type) STIX_OFFSETOF(struct { stix_uint8_t d1; type d2; }, d2)
|
||||
/*(sizeof(struct { stix_uint8_t d1; type d2; }) - sizeof(type))*/
|
||||
|
||||
#if defined(__cplusplus)
|
||||
# if (__cplusplus >= 201103L) /* C++11 */
|
||||
# define STIX_NULL nullptr
|
||||
# else
|
||||
# define STIX_NULL (0)
|
||||
# endif
|
||||
#else
|
||||
# define STIX_NULL ((void*)0)
|
||||
#endif
|
||||
|
||||
/* make a low bit mask that can mask off low n bits*/
|
||||
#define STIX_LBMASK(type,n) (~(~((type)0) << (n)))
|
||||
|
||||
/* get 'length' bits starting from the bit at the 'offset' */
|
||||
#define STIX_GETBITS(type,value,offset,length) \
|
||||
((((type)(value)) >> (offset)) & STIX_LBMASK(type,length))
|
||||
|
||||
#define STIX_SETBITS(type,value,offset,length,bits) \
|
||||
(value = (((type)(value)) | (((bits) & STIX_LBMASK(type,length)) << (offset))))
|
||||
|
||||
|
||||
/**
|
||||
* The STIX_BITS_MAX() macros calculates the maximum value that the 'nbits'
|
||||
* bits of an unsigned integer of the given 'type' can hold.
|
||||
* \code
|
||||
* printf ("%u", STIX_BITS_MAX(unsigned int, 5));
|
||||
* \endcode
|
||||
*/
|
||||
/*#define STIX_BITS_MAX(type,nbits) ((((type)1) << (nbits)) - 1)*/
|
||||
#define STIX_BITS_MAX(type,nbits) ((~(type)0) >> (STIX_SIZEOF(type) * 8 - (nbits)))
|
||||
|
||||
/* =========================================================================
|
||||
* POINTER MANIPULATION MACROS
|
||||
* ========================================================================= */
|
||||
|
||||
#if defined(__MSDOS__)
|
||||
# define STIX_INCPTR(type,base,inc) (((type __huge*)base) + (inc))
|
||||
# define STIX_DECPTR(type,base,inc) (((type __huge*)base) - (inc))
|
||||
# define STIX_GTPTR(type,ptr1,ptr2) (((type __huge*)ptr1) > ((type __huge*)ptr2))
|
||||
# define STIX_GEPTR(type,ptr1,ptr2) (((type __huge*)ptr1) >= ((type __huge*)ptr2))
|
||||
# define STIX_LTPTR(type,ptr1,ptr2) (((type __huge*)ptr1) < ((type __huge*)ptr2))
|
||||
# define STIX_LEPTR(type,ptr1,ptr2) (((type __huge*)ptr1) <= ((type __huge*)ptr2))
|
||||
# define STIX_EQPTR(type,ptr1,ptr2) (((type __huge*)ptr1) == ((type __huge*)ptr2))
|
||||
# define STIX_SUBPTR(type,ptr1,ptr2) (((type __huge*)ptr1) - ((type __huge*)ptr2))
|
||||
#else
|
||||
# define STIX_INCPTR(type,base,inc) (((type*)base) + (inc))
|
||||
# define STIX_DECPTR(type,base,inc) (((type*)base) - (inc))
|
||||
# define STIX_GTPTR(type,ptr1,ptr2) (((type*)ptr1) > ((type*)ptr2))
|
||||
# define STIX_GEPTR(type,ptr1,ptr2) (((type*)ptr1) >= ((type*)ptr2))
|
||||
# define STIX_LTPTR(type,ptr1,ptr2) (((type*)ptr1) < ((type*)ptr2))
|
||||
# define STIX_LEPTR(type,ptr1,ptr2) (((type*)ptr1) <= ((type*)ptr2))
|
||||
# define STIX_EQPTR(type,ptr1,ptr2) (((type*)ptr1) == ((type*)ptr2))
|
||||
# define STIX_SUBPTR(type,ptr1,ptr2) (((type*)ptr1) - ((type*)ptr2))
|
||||
#endif
|
||||
|
||||
/* =========================================================================
|
||||
* MMGR
|
||||
* ========================================================================= */
|
||||
typedef struct stix_mmgr_t stix_mmgr_t;
|
||||
|
||||
/**
|
||||
* allocate a memory chunk of the size \a n.
|
||||
* \return pointer to a memory chunk on success, #STIX_NULL on failure.
|
||||
*/
|
||||
typedef void* (*stix_mmgr_alloc_t) (stix_mmgr_t* mmgr, stix_size_t n);
|
||||
/**
|
||||
* resize a memory chunk pointed to by \a ptr to the size \a n.
|
||||
* \return pointer to a memory chunk on success, #STIX_NULL on failure.
|
||||
*/
|
||||
typedef void* (*stix_mmgr_realloc_t) (stix_mmgr_t* mmgr, void* ptr, stix_size_t n);
|
||||
/**
|
||||
* free a memory chunk pointed to by \a ptr.
|
||||
*/
|
||||
typedef void (*stix_mmgr_free_t) (stix_mmgr_t* mmgr, void* ptr);
|
||||
|
||||
/**
|
||||
* The stix_mmgr_t type defines the memory management interface.
|
||||
* As the type is merely a structure, it is just used as a single container
|
||||
* for memory management functions with a pointer to user-defined data.
|
||||
* The user-defined data pointer \a ctx is passed to each memory management
|
||||
* function whenever it is called. You can allocate, reallocate, and free
|
||||
* a memory chunk.
|
||||
*
|
||||
* For example, a stix_xxx_open() function accepts a pointer of the stix_mmgr_t
|
||||
* type and the xxx object uses it to manage dynamic data within the object.
|
||||
*/
|
||||
struct stix_mmgr_t
|
||||
{
|
||||
stix_mmgr_alloc_t alloc; /**< allocation function */
|
||||
stix_mmgr_realloc_t realloc; /**< resizing function */
|
||||
stix_mmgr_free_t free; /**< disposal function */
|
||||
void* ctx; /**< user-defined data pointer */
|
||||
};
|
||||
|
||||
/**
|
||||
* The STIX_MMGR_ALLOC() macro allocates a memory block of the \a size bytes
|
||||
* using the \a mmgr memory manager.
|
||||
*/
|
||||
#define STIX_MMGR_ALLOC(mmgr,size) ((mmgr)->alloc(mmgr,size))
|
||||
|
||||
/**
|
||||
* The STIX_MMGR_REALLOC() macro resizes a memory block pointed to by \a ptr
|
||||
* to the \a size bytes using the \a mmgr memory manager.
|
||||
*/
|
||||
#define STIX_MMGR_REALLOC(mmgr,ptr,size) ((mmgr)->realloc(mmgr,ptr,size))
|
||||
|
||||
/**
|
||||
* The STIX_MMGR_FREE() macro deallocates the memory block pointed to by \a ptr.
|
||||
*/
|
||||
#define STIX_MMGR_FREE(mmgr,ptr) ((mmgr)->free(mmgr,ptr))
|
||||
|
||||
|
||||
/* =========================================================================
|
||||
* CMGR
|
||||
* =========================================================================*/
|
||||
|
||||
typedef struct stix_cmgr_t stix_cmgr_t;
|
||||
|
||||
typedef stix_size_t (*stix_cmgr_bctouc_t) (
|
||||
const stix_bch_t* mb,
|
||||
stix_size_t size,
|
||||
stix_uch_t* wc
|
||||
);
|
||||
|
||||
typedef stix_size_t (*stix_cmgr_uctobc_t) (
|
||||
stix_uch_t wc,
|
||||
stix_bch_t* mb,
|
||||
stix_size_t size
|
||||
);
|
||||
|
||||
/**
|
||||
* The stix_cmgr_t type defines the character-level interface to
|
||||
* multibyte/wide-character conversion. This interface doesn't
|
||||
* provide any facility to store conversion state in a context
|
||||
* independent manner. This leads to the limitation that it can
|
||||
* handle a stateless multibyte encoding only.
|
||||
*/
|
||||
struct stix_cmgr_t
|
||||
{
|
||||
stix_cmgr_bctouc_t bctouc;
|
||||
stix_cmgr_uctobc_t uctobc;
|
||||
};
|
||||
|
||||
/* =========================================================================
|
||||
* MACROS THAT CHANGES THE BEHAVIORS OF THE C COMPILER/LINKER
|
||||
* =========================================================================*/
|
||||
|
||||
#if defined(_WIN32) || (defined(__WATCOMC__) && !defined(__WINDOWS_386__))
|
||||
# define STIX_IMPORT __declspec(dllimport)
|
||||
# define STIX_EXPORT __declspec(dllexport)
|
||||
# define STIX_PRIVATE
|
||||
#elif defined(__GNUC__) && (__GNUC__>=4)
|
||||
# define STIX_IMPORT __attribute__((visibility("default")))
|
||||
# define STIX_EXPORT __attribute__((visibility("default")))
|
||||
# define STIX_PRIVATE __attribute__((visibility("hidden")))
|
||||
/*# define STIX_PRIVATE __attribute__((visibility("internal")))*/
|
||||
#else
|
||||
# define STIX_IMPORT
|
||||
# define STIX_EXPORT
|
||||
# define STIX_PRIVATE
|
||||
#endif
|
||||
|
||||
#if defined(__STDC_VERSION__) && (__STDC_VERSION__>=199901L)
|
||||
# define STIX_INLINE inline
|
||||
# define STIX_HAVE_INLINE
|
||||
#elif defined(__GNUC__) && defined(__GNUC_GNU_INLINE__)
|
||||
/* gcc disables inline when -std=c89 or -ansi is used.
|
||||
* so use __inline__ supported by gcc regardless of the options */
|
||||
# define STIX_INLINE /*extern*/ __inline__
|
||||
# define STIX_HAVE_INLINE
|
||||
#else
|
||||
# define STIX_INLINE
|
||||
# undef STIX_HAVE_INLINE
|
||||
#endif
|
||||
|
||||
|
||||
/* ========================================================================== */
|
||||
|
||||
/**
|
||||
@ -301,8 +61,8 @@ typedef enum stix_errnum_t stix_errnum_t;
|
||||
enum stix_option_t
|
||||
{
|
||||
STIX_TRAIT,
|
||||
STIX_DFL_SYMTAB_SIZE,
|
||||
STIX_DFL_SYSDIC_SIZE
|
||||
STIX_SYMTAB_SIZE, /* default system table size */
|
||||
STIX_SYSDIC_SIZE /* default system dictionary size */
|
||||
};
|
||||
typedef enum stix_option_t stix_option_t;
|
||||
|
||||
@ -741,33 +501,32 @@ struct stix_heap_t
|
||||
typedef struct stix_t stix_t;
|
||||
|
||||
/* =========================================================================
|
||||
* MODULE MANIPULATION
|
||||
* VIRTUAL MACHINE PRIMITIVES
|
||||
* ========================================================================= */
|
||||
enum stix_mod_cmd_t
|
||||
#define STIX_MOD_PREFIX_LEN_MAX 30
|
||||
#define STIX_MOD_POSTFIX_LEN_MAX 30
|
||||
#define STIX_MOD_NAME_LEN_MAX 60
|
||||
|
||||
struct stix_mod_spec_t
|
||||
{
|
||||
STIX_MOD_OPEN,
|
||||
STIX_MOD_CLOSE,
|
||||
STIX_MOD_READ
|
||||
const stix_uch_t prefix[STIX_MOD_PREFIX_LEN_MAX];
|
||||
const stix_uch_t postfix[STIX_MOD_POSTFIX_LEN_MAX];
|
||||
const stix_uch_t name[STIX_MOD_NAME_LEN_MAX];
|
||||
};
|
||||
typedef enum stix_mod_cmd_t stix_mod_cmd_t;
|
||||
typedef struct stix_mod_spec_t stix_mod_spec_t;
|
||||
|
||||
struct stix_mod_arg_t
|
||||
typedef void* (*stix_mod_open_t) (stix_t* stix, const stix_uch_t* name);
|
||||
typedef void (*stix_mod_close_t) (stix_t* stix, void* handle);
|
||||
typedef void* (*stix_mod_getsym_t) (stix_t* stix, void* handle, const stix_uch_t* name);
|
||||
|
||||
struct stix_vmprim_t
|
||||
{
|
||||
/* [INPUT] */
|
||||
const stix_uch_t* prefix;
|
||||
const stix_uch_t* postfix;
|
||||
const stix_uch_t* name;
|
||||
|
||||
/* [OUTPUT] */
|
||||
void* handle;
|
||||
stix_mod_open_t mod_open;
|
||||
stix_mod_close_t mod_close;
|
||||
stix_mod_getsym_t mod_getsym;
|
||||
};
|
||||
typedef struct stix_mod_arg_t stix_mod_arg_t;
|
||||
|
||||
typedef int (*stix_mod_impl_t) (
|
||||
stix_t* stix,
|
||||
stix_mod_cmd_t cmd,
|
||||
stix_mod_arg_t* arg
|
||||
);
|
||||
typedef struct stix_vmprim_t stix_vmprim_t;
|
||||
|
||||
/* =========================================================================
|
||||
* IO MANIPULATION
|
||||
@ -806,10 +565,14 @@ struct stix_t
|
||||
int trait;
|
||||
stix_oow_t dfl_symtab_size;
|
||||
stix_oow_t dfl_sysdic_size;
|
||||
stix_ucs_t dfl_mod_prefix[STIX_MOD_PREFIX_LEN_MAX + 1];
|
||||
stix_ucs_t dfl_mod_postfix[STIX_MOD_POSTFIX_LEN_MAX + 1];
|
||||
} option;
|
||||
|
||||
stix_cb_t* cblist;
|
||||
stix_vmprim_t vmprim;
|
||||
|
||||
stix_cb_t* cblist;
|
||||
stix_rbt_t pmtable; /* primitive module table */
|
||||
/* ========================= */
|
||||
|
||||
stix_heap_t* permheap; /* TODO: put kernel objects to here */
|
||||
@ -875,10 +638,11 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
STIX_EXPORT stix_t* stix_open (
|
||||
stix_mmgr_t* mmgr,
|
||||
stix_size_t xtnsize,
|
||||
stix_size_t heapsize,
|
||||
stix_errnum_t* errnum
|
||||
stix_mmgr_t* mmgr,
|
||||
stix_size_t xtnsize,
|
||||
stix_size_t heapsize,
|
||||
const stix_vmprim_t* vmprim,
|
||||
stix_errnum_t* errnum
|
||||
);
|
||||
|
||||
STIX_EXPORT void stix_close (
|
||||
@ -886,9 +650,10 @@ STIX_EXPORT void stix_close (
|
||||
);
|
||||
|
||||
STIX_EXPORT int stix_init (
|
||||
stix_t* vm,
|
||||
stix_mmgr_t* mmgr,
|
||||
stix_size_t heapsz
|
||||
stix_t* vm,
|
||||
stix_mmgr_t* mmgr,
|
||||
stix_size_t heapsize,
|
||||
const stix_vmprim_t* vmprim
|
||||
);
|
||||
|
||||
STIX_EXPORT void stix_fini (
|
||||
|
Reference in New Issue
Block a user