⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oxbow.h

📁 OXCC is a multipass, interpreting C compiler with several language extensions. It generates an Archi
💻 H
📖 第 1 页 / 共 5 页
字号:

/* in cossys.o -- returns a 28 bit, very random, number */
unsigned long strHash(char *str, int *len); /* ret length if 'len' nonnull */
unsigned long charHash(char);		/* argument size is assumed 1 */
unsigned long shortHash(short);		/* argument size is assumed 2 */
unsigned long longHash();		/* argument size is assumed 4 */
unsigned long longlongHash();	/* argument size is assumed 8 */

/*  object must be declared volatile because if the variable is kept in a
    register, it may not be garbage collected  */

typedef void * vobject;		/* methods are defined to return vobject, avoids
								gcc 'volatile' bug */
#ifdef KERNEL
typedef	struct	_object	 * volatile object;
#else
typedef void * object;
#endif

typedef	vobject	(*ofun)();	/* note that functions return 'vobject' */
typedef int (*ifun)();
typedef _LONGLONG_ (*llfun)();

void	InitCOS(void *);
ofun	_FindMethod(object, object);		/* used internally only */
ofun	_FindMethod2(object, object, int);	/* error if no find */
ofun	_FindMethod3(object, object, int);	/* return nulfunc if no find */
ofun	FindMethod(object, object, int);	/* return NULL if no find */
vobject	FindMethodObject(object, object, int);
vobject	_jumpToMethod(ofun f);
_LONGLONG_ _callExtern(void *fp, void *sp, void *ap, int ac);
_LONGLONG_ _callExtern1(void *fp, void *sp, void *ap, int ac);
void	*GetIVptr(object, object);
int	IsObj(object);

#define TRACE_DONT_CARE		0
#define TRACE_OFF		1
#define TRACE_ON		2
#define TRACE_ALL		3


#define _cat5_(a, b, c, d, e) a##b##c##d##e
#define _5cat_(a, b, c, d, e) _cat5_(a, b, c, d, e)
#define _cat4_(a, b, c) a##b##c##d
#define _4cat_(a, b, c, d) _cat4_(a, b, c, d)
#define _cat3_(a, b, c) a##b##c
#define _3cat_(a, b, c) _cat3_(a, b, c)
#define	_cat2_(a, b)	a##b
#define _cat_(a, b)	_cat2_(a, b)
#define CLASS_I		_cat_(CLASS, _i)
#define CLASS_C		_cat_(CLASS, _c)
#define CLASS_A		_cat_(CLASS, _a)
#define Generic(x)	_cat_(x, _i)
#define Genericm(x)	_cat_(g, Generic(x))

#define _cname2_(x)	#x
#define _cname1_(x)	_cname2_(x)
#define cName		_cname1_(CLASS)

#define _im2_(x)	Init##x##Class
#define _im_(x)		_im2_(x)
#define InitMethod	void	_im_(CLASS)


#define ivType		struct	CLASS_I
#define ivTypedef	typedef struct CLASS_I
#define cvType		struct	CLASS_C
#define cvTypedef	typedef struct CLASS_C
#define instanceVars	ivType
#define classVars	cvType

#define ivPtr(x)	((ivType *) GetIVptr((x), CLASS))
#define cvsPtr		((cvType *) GetIVptr(CLASS, ClassOf(CLASS)))
#define ivsPtr		ivPtr(self)
#define accessCVs	cvType *cv = cvsPtr
#define accessIVs	ivType *iv = ivsPtr

#ifdef KERNEL
#define usesClass(c)	{ if (c == NULL) Init##c##Class(); }
#define iMethod(x)	gNew(Method, #x, CLASS, Genericm(x), x)
#define cMethod(x)	gNew(Method, #x, ClassOf(CLASS), Genericm(x), x)
#define iMethodFor(x,y)	gNew(Method, #y, CLASS, Generic(x), y)
#define cMethodFor(x,y)	gNew(Method, #y, ClassOf(CLASS), Generic(x), y)
#else
#define usesClass(c)
#define IMethod(x)	({extern vobject Genericm(x); gNew(Method, #x, CLASS, Genericm(x), x);})
#define CMethod(x)	({extern vobject Genericm(x); gNew(Method, #x, ClassOf(CLASS), Genericm(x), x);})
#define IMethodFor(x,y)	({extern vobject Generic(x);gNew(Method, #y, CLASS, Generic(x), y);})
#define CMethodFor(x,y)	({extern vobject Generic(x);gNew(Method, #y, ClassOf(CLASS), Generic(x), y);})
#define iMethod(x)	({extern vobject Genericm(x); gNew(Method, #x, CLASS, Genericm(x), x);})
#define cMethod(x)	({extern vobject Genericm(x); gNew(Method, #x, ClassOf(CLASS), Genericm(x), x);})
#define iMethodFor(x,y)	({extern vobject Generic(x);gNew(Method, #y, CLASS, Generic(x), y);})
#define cMethodFor(x,y)	({extern vobject Generic(x);gNew(Method, #y, ClassOf(CLASS), Generic(x), y);})
#endif

#define ivSize		sizeof(instanceVars)
#define cvSize		sizeof(classVars)

#define ClassOf(x)	(vobject) *((object *) (x))
#define method		static
#define imethod		method
#define cmethod		method
#define END		(vobject) 0

#define IsInstanceOf(i,c)	(ClassOf(i) == (c))
#define IsaMetaClass(x)		(ClassOf(x) == MetaClass)
#define IsaClass(x)		(IsaMetaClass(ClassOf(x)) || IsaMetaClass(x))

#define EQ(a,b)		((a) == (b))
#define NEQ(a,b)	((a) != (b))



#define tFindMethod(t, c, g, l)  (*(t (*)()) _FindMethod2(c, g, l))

#ifndef KERNEL
#define super(g)	({extern vobject Generic(g);(*_FindMethod2(CLASS, Generic(g), 2));})
#define cSuper(g)	({extern vobject Generic(g);(*_FindMethod2(ClassOf(CLASS), Generic(g), 2));})
#define typedSuper(t,g)	({extern vobject Generic(g);(*tFindMethod(t, ClassOf(self), Generic(g), 2));})
#define mSuper(g,c) ({extern vobject Generic(g);(*_FindMethod2(c, Generic(g), 2));})
#define mDirect(g,c) ({extern vobject Generic(g);(*_FindMethod2(c, Generic(g), 1));})
#define mSuperNoError(g,c) ({extern vobject Generic(g);(*_FindMethod3(c, Generic(g), 2));})
#define mDirectNoError(g,c) ({extern vobject Generic(g);(*_FindMethod3(c, Generic(g), 1));})


/* get instance method from a class object */
#define imcPointer(c,g)  (ofun)({extern vobject Generic(g);gFindMethod(c, Generic(g), 1);})
/* get class method from a class object */
#define cmcPointer(c,g)  (ofun)({extern vobject Generic(g);gFindMethod(ClassOf(c), Generic(g), 1);})
/* get instance method from an instance object */
#define imiPointer(i,g)  (ofun)({extern vobject Generic(g);gFindMethod(ClassOf(i), Generic(g), 1);})
/* get class method from an instance object */
#define cmiPointer(i,g)  (ofun)({extern vobject Generic(g);gFindMethod(ClassOf(ClassOf(i)), Generic(g), 1);})
#define RespondsTo(i,g)	(ofun)({extern vobject Generic(g);(gFindMethod(ClassOf(i), Generic(g), 1) != NULL);})

extern object Class;
extern object Method;
extern object COS;
extern vobject gNew(object, ...);
extern vobject gDispose(object);
extern ofun gFindMethod();
extern vobject LoadClass(void *);

#else /* KERNEL */
#define super(g)	(*_FindMethod2(CLASS, Generic(g), 2))
#define cSuper(g)	(*_FindMethod2(ClassOf(CLASS), Generic(g), 2))
#define typedSuper(t,g)	(*tFindMethod(t, ClassOf(self), Generic(g), 2))
/* get instance method from a class object */
#define imcPointer(c,g)  gFindMethod(c, Generic(g), 1)
/* get class method from a class object */
#define cmcPointer(c,g)  gFindMethod(ClassOf(c), Generic(g), 1)
/* get instance method from an instance object */
#define imiPointer(i,g)  gFindMethod(ClassOf(i), Generic(g), 1)
/* get class method from an instance object */
#define cmiPointer(i,g)  gFindMethod(ClassOf(ClassOf(i)), Generic(g), 1)
#define RespondsTo(i,g)	(gFindMethod(ClassOf(i), Generic(g), 1) != NULL)
#define mDirect(g,c) (*_FindMethod2(c, Generic(g), 1))
#endif /* KERNEL */

#define typedGeneric(t,g) 	(*(t (*)()) &g)


#define RegisterVariable(v)	gRegisterMemory(COS, &v, (long) sizeof(object))

#define makeThenAccess(self, obj, iv)  		\
	object	obj = cSuper(gNew)(self);	\
	ivType	*iv = ivPtr(obj)

extern	int	_CheckObjects_;
extern	object	_LastGeneric_;		/*  last generic called  */

#define ChkArg(obj, argn)						\
	if (_CheckObjects_  &&  !IsObj(obj))				\
		gInvalidObject(_LastGeneric_, argn, self)

#define ChkArgTyp(obj, argn, argType)					\
	if (_CheckObjects_)  {						\
		if (!IsObj(obj))					\
			gInvalidObject(_LastGeneric_, argn, self);	\
		if (argType)  {						\
			object	lg = _LastGeneric_;			\
			if (!gIsKindOf(obj, argType))			\
				gInvalidType(lg, argn, self, argType, obj); \
			_LastGeneric_ = lg;				\
		}							\
	}

#define ChkArgNul(obj, argn)           if (obj)  ChkArg(obj, argn)

#define ChkArgTypNul(obj, argn, argType) 	\
	if (obj)  ChkArgTyp(obj, argn, argType)

#define CheckArg(obj, argn, argType)					\
	if (_CheckObjects_)  {						\
		if (!IsObj(obj))					\
			gInvalidObject(_LastGeneric_, argn, self);	\
		if (argType)  {						\
			object	lg = _LastGeneric_;			\
			if (!gIsKindOf(obj, argType))			\
				gInvalidType(lg, argn, self, argType, obj); \
			_LastGeneric_ = lg;				\
		}							\
	}


/*  Thread stuff  */


/*  thread states   */

#define NEW_THREAD			(0)
#define	RUNNING_THREAD		(1)
#define HOLD_THREAD			(2)
#define DONE_THREAD			(3)
#define EXPUNGE_THREAD		(4)
#define WAITING_FOR_THREAD	(5)
#define WAITING_FOR_SEMAPHORE	(6)

#define DEFAULT_PRIORITY	100

#define TIMESTAMP (OXPORT_timestamp())
#define THREAD_COUNTDOWN (OXPORT_thread_countdown())
#define THREAD_MSEC (oxport_thread_msec)
#define MSEC_PER_TICK (55)
#define DEFAULT_THREAD_MSEC MSEC_PER_TICK

extern	unsigned long	_final_thread_tick;
extern	int	_no_context_switch;
extern	jmp_buf	_t_start;

extern	void	(*__cos_yield)();
extern	void	_start_threader(), _start_thread();

#define INHIBIT_THREADER	_no_context_switch++
#define ENABLE_THREADER		if (_no_context_switch) _no_context_switch--

#if 0  /*  Debugging or to disable Threads  */
#define YIELD	
#else
#define YIELD	({if (!_no_context_switch){if(THREAD_COUNTDOWN){(*__cos_yield)(0);}}})
#endif

#define StartThreader(x)		\
	_start_threader(&x);		\
	if (setjmp(_t_start))		\
		_start_thread()


/*  End of thread specific stuff  */

/* Message dispatch */
#define __CFWNDCLASS_ID__ 0xd24f193c
#define __CFMSGCLASS_ID__ 0x87104be5

typedef struct __mdis__ {
	long id;
	_LONGLONG_ (*defproc)();
	_LONGLONG_ (*usrproc)();
} *MD, MDIV;

#define ClassMsgProc(cl) \
({MD biv=GetIVptr(self,cl);(*biv->defproc)(self,wnd,it);})

#define DefaultMsgProc() \
({MD biv=GetIVptr(self,ClassOf(self));(*biv->defproc)(self,wnd,it);})

#define Mfunc(a) _5cat_(CLASS,_,MPROC,_,a)

#if 0
#define MsgFunc(a) _LONGLONG_ Mfunc(a)(object self,WINDOW wnd,CFmsg it,CLASS_I *iv,CLASS_C *cv)
#else
#define MsgFunc(a) _LONGLONG_ Mfunc(a)(MSGARGS *args)
#endif

typedef struct msgbitstuf {
void *cmdDict;
vobject bitVec;
int (*bitTest)();	
} MSGBITSTUF;

#define MSGARGS CLASS_A

#define MSGARGDEF \
typedef struct CLASS_A { \
	vobject self; \
	struct window  *wnd; \
	CFmsg it; \
	CLASS_I *iv; \
	CLASS_C *cv; \
	MSGBITSTUF bs; \
	char *fn; \
} CLASS_A;

#define TO_SUPERCLASS (0x7a6b290cf31e4811LL)

#define CLASSMSG(args...) \
({\
extern _LONGLONG_ MASTERdomsg();\
static MSGARGS margs = {fn: "_" cName "_" __FUNCTION__ "_"};\
_LONGLONG_ result; \
if(it.e_type == evAddCmd) {\
if(margs.bs.bitVec)\
  if(margs.bs.bitTest(margs.bs.bitVec, it.M_LPARAM))\
	gReset(margs.bs.bitVec, it.M_LPARAM);\
  result = 0;\
}else {\
margs.cv = cvsPtr;\
margs.iv = ivsPtr;\
margs.it = it;\
margs.wnd = wnd;\
margs.self = self;\
result = MASTERdomsg(&margs , ## args);\
}\
result;})

#if 0
#define defGeneric(t, g)   					\
	object	Generic(g) = (vobject) 0;			\
	t	g(object i, ...)			\
        {							\
		if (_CheckObjects_)  {				\
			if (!IsObj(i))				\
				gInvalidObject(Generic(g), 1, i);  \
			_LastGeneric_ = Generic(g);		\
		}						\
		YIELD;						\
		_jumpToMethod( _FindMethod(ClassOf(i), Generic(g), 1) ); \
	}
#else
#define defGeneric(t, g)   					\
	object	Generic(g) = (object) 0;			\
	t	g(object i, ...)			\
    {							\
		_jumpToMethod( _FindMethod(i, Generic(g)) ); 	\
	}
#endif

#define externGeneric(t, g)					\
	extern	object	Generic(g);				\
	extern	t	g(object i, ...);

#define InitGeneric(x)	Generic(x) = gNew(GenericFunction, #x)

#define _qt2_(x) #x
#define _qt_(x) _qt2_(x)

#define oxcall(func, args...) ({ \
typedef _fret = (func()); \
_fret (*dofunc)(); _fret _ret; \
dofunc = oxlink_find_bare_func(_qt_(_cat_(_, func))); \
if(!dofunc) \
dofunc = oxlink_load_bare_symb(_qt_(_cat_(_, func)),1); \
else oxlink_clear_bss(oxlink_file_of_bare(_qt_(_cat_(_, func))));\
if(dofunc) _ret = dofunc(## args); \
else _ret = (_fret) -1; \
_ret;})


#define oxrun(func, args...) ({ \
typedef _fret = (func()); \
_fret (*dofunc)(); _fret _ret; \
dofunc = oxlink_find_bare_func(_qt_(_cat_(_, func))); \
if(!dofunc) \
dofunc = oxlink_load_bare_symb(_qt_(_cat_(_, func)),1); \
if(dofunc) { _ret = dofunc(## args);gGC(COS);oxlink_unload_symb(#func, 0); } \
else _ret = (_fret) -1; \
_ret;})

#define oxfunc(func, args...) ({ \
typedef _fret = (appfunc()); \
_fret (*dofunc)(); _fret _ret; \
dofunc = oxlink_load_bare_symb(func,1); \
if(dofunc) _ret = dofunc(## args); \
else _ret = (_fret) -1; \
_ret;})

#define oxload_bare(func) \
oxlink_load_bare_symb(_qt_(_cat_(_, func)),1)

#define oxload(func) \
oxlink_load_symb(#func,1)

#define oxunload(func) \
oxlink_unload_symb(#func, 0)


#define DISPATCH_MESSAGES \
({extern vobject Thread; vobject _th = (vobject)gFind(Thread, NULL); \
while(DispatchMessages(_th));})

#define INIT_IO(arg) \
({_LONGLONG_ AppMsg();CF_InitIO(arg, AppMsg); \
if((arg & (CF_USE_MESSAGES|CF_USE_EVENTS)) && !(arg & CF_USE_GUI)) { \
extern object Absorber; \
extern object Application; \
vobject pgm = gNew(Absorber, AppMsg); \
Application = Absorber; \
CaptureKeyboard(pgm, 0);}})

extern void *_cos_malloc(unsigned);
extern void *_cos_calloc(unsigned, unsigned);
extern void *_cos_realloc(void *, unsigned);
#define	 Talloc(t)   (t *) _cos_malloc(sizeof(t))
#define	 Tcalloc(t)  (t *) _cos_calloc(1, sizeof(t))
#define	 Tnalloc(t,n)   (t *) _cos_malloc((n) * sizeof(t))
#define	 Tncalloc(t,n)  (t *) _cos_calloc((n), sizeof(t))
#define  Tnrealloc(t,n,b) (t *) _cos_realloc(b, (n) * sizeof(t))

#ifdef KERNEL
#include <generics.h>
#endif /* KERNEL */

/*  from the Stream class  */
extern	object	stdoutStream, stdinStream, stderrStream;
extern	object	traceStream;

void	*MA_malloc(unsigned, void *);
void	MA_free(void *);
void	*MA_realloc(void *, unsigned);
void	MA_compact(void);
void	*MA_calloc(unsigned, void *);

#define	 MTncalloc(t,n,v)  (t *) MA_calloc((n) * sizeof(t), &v)
#define	 MTnalloc(t,n,v)   (t *) MA_malloc((n) * sizeof(t), &v)

/* KEYCODES */
/* ----------- keys ------------ */

/* 
	This file defines all extended keys which can be read from DOS in
	raw unfiltered mode with CTRL BREAK checking turned off. i.e.
	the first character read is == 0 and the second character contains
	a scan code. Here we create a 2 byte character with the scan code
	in the low order byte and a flag bit in the high order byte.
	
	Non printable characters created by typing the CTRL key are also
	defined here.
*/
/* 
	Believe it or not, gcc 2.2.2 has a bug which causes parsing to fail
	if a hex constant ends in E or e. So you will see decimal values
	occasionally. [NDC]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -