📄 oxbow.h
字号:
/* 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 + -