[1506] | 1 | /* os2thunk.h,v 1.4 2004/09/14 22:27:35 bird Exp */
|
---|
| 2 | /** @file
|
---|
| 3 | * EMX
|
---|
| 4 | */
|
---|
[18] | 5 |
|
---|
| 6 | #ifndef _OS2THUNK_H
|
---|
| 7 | #define _OS2THUNK_H
|
---|
| 8 |
|
---|
[1506] | 9 | #include <sys/cdefs.h>
|
---|
| 10 |
|
---|
| 11 | __BEGIN_DECLS
|
---|
| 12 |
|
---|
[18] | 13 | typedef unsigned long _far16ptr;
|
---|
[3861] | 14 | extern _far16ptr _Optlink DosFlatToSel(void *ptr);
|
---|
| 15 | extern void * _Optlink DosSelToFlat(_far16ptr ptr);
|
---|
| 16 | #define _libc_32to16 DosFlatToSel
|
---|
| 17 | #define _libc_16to32 DosSelToFlat
|
---|
[18] | 18 |
|
---|
[1517] | 19 | typedef union _thunk_u
|
---|
| 20 | {
|
---|
| 21 | void *pv;
|
---|
| 22 | unsigned short *pus;
|
---|
| 23 | unsigned long *pul;
|
---|
| 24 | } _thunk_t;
|
---|
| 25 |
|
---|
[236] | 26 | unsigned long _libc_thunk1 (void *args, void *fun);
|
---|
[18] | 27 |
|
---|
| 28 | #define _THUNK_PASCAL_PROLOG(SIZE) \
|
---|
[1517] | 29 | __extension__ ({ char _tb[(SIZE)+4]; _thunk_t _tu; _tu.pv = _tb + sizeof (_tb); \
|
---|
[18] | 30 | *(unsigned long *)_tb = (SIZE);
|
---|
| 31 | #define _THUNK_PASCAL_CHAR(ARG) _THUNK_PASCAL_SHORT (ARG)
|
---|
[1517] | 32 | #define _THUNK_PASCAL_SHORT(ARG) (*--_tu.pus = (ARG))
|
---|
| 33 | #define _THUNK_PASCAL_LONG(ARG) (*--_tu.pul = (ARG))
|
---|
[236] | 34 | #define _THUNK_PASCAL_FLAT(ARG) _THUNK_PASCAL_LONG (_libc_32to16 (ARG))
|
---|
[18] | 35 | #define _THUNK_PASCAL_FAR16(ARG) _THUNK_PASCAL_LONG (ARG)
|
---|
[156] | 36 | #define _THUNK_PASCAL_FUNCTION(FUN) APIENTRY _16_##FUN
|
---|
[236] | 37 | #define _THUNK_PASCAL_CALL(FUN) _libc_thunk1 (_tb, (void *)(_16_##FUN)); })
|
---|
| 38 | #define _THUNK_PASCAL_CALLI(FUN) _libc_thunk1 (_tb, (void *)(FUN)); })
|
---|
[18] | 39 |
|
---|
| 40 | #define _THUNK_C_PROLOG(SIZE) \
|
---|
[1517] | 41 | __extension__ ({ char _tb[(SIZE)+4]; _thunk_t _tu; _tu.pv = _tb + sizeof (unsigned long); \
|
---|
[18] | 42 | *(unsigned long *)_tb = (SIZE);
|
---|
| 43 | #define _THUNK_C_CHAR(ARG) _THUNK_C_SHORT (ARG)
|
---|
[1517] | 44 | #define _THUNK_C_SHORT(ARG) (*_tu.pus++ = (ARG))
|
---|
| 45 | #define _THUNK_C_LONG(ARG) (*_tu.pul++ = (ARG))
|
---|
[236] | 46 | #define _THUNK_C_FLAT(ARG) _THUNK_C_LONG (_libc_32to16 (ARG))
|
---|
[18] | 47 | #define _THUNK_C_FAR16(ARG) _THUNK_C_LONG (ARG)
|
---|
| 48 | #define _THUNK_C_FUNCTION(FUN) _16__##FUN
|
---|
[236] | 49 | #define _THUNK_C_CALL(FUN) _libc_thunk1 (_tb, (void *)(_16__##FUN)); })
|
---|
| 50 | #define _THUNK_C_CALLI(FUN) _libc_thunk1 (_tb, (void *)(FUN)); })
|
---|
[18] | 51 |
|
---|
| 52 | #define _THUNK_PROLOG(SIZE) _THUNK_PASCAL_PROLOG (SIZE)
|
---|
| 53 | #define _THUNK_CHAR(ARG) _THUNK_PASCAL_CHAR (ARG)
|
---|
| 54 | #define _THUNK_SHORT(ARG) _THUNK_PASCAL_SHORT (ARG)
|
---|
| 55 | #define _THUNK_LONG(ARG) _THUNK_PASCAL_LONG (ARG)
|
---|
| 56 | #define _THUNK_FLAT(ARG) _THUNK_PASCAL_FLAT (ARG)
|
---|
| 57 | #define _THUNK_FAR16(ARG) _THUNK_PASCAL_FAR16 (ARG)
|
---|
| 58 | #define _THUNK_FUNCTION(FUN) _THUNK_PASCAL_FUNCTION (FUN)
|
---|
| 59 | #define _THUNK_CALL(FUN) _THUNK_PASCAL_CALL (FUN)
|
---|
| 60 | #define _THUNK_CALLI(FUN) _THUNK_PASCAL_CALLI (FUN)
|
---|
| 61 |
|
---|
| 62 | #define MAKE16P(sel,off) ((_far16ptr)((sel) << 16 | (off)))
|
---|
[236] | 63 | #define MAKEP(sel,off) _libc_16to32 (MAKE16P (sel, off))
|
---|
[18] | 64 | #define SELECTOROF(farptr) ((SEL)((farptr) >> 16))
|
---|
| 65 | #define OFFSETOF(farptr) ((USHORT)(farptr))
|
---|
| 66 |
|
---|
| 67 | /* Return true iff the block of SIZE bytes at PTR does not cross a
|
---|
| 68 | 64Kbyte boundary. */
|
---|
| 69 |
|
---|
| 70 | #define _THUNK_PTR_SIZE_OK(ptr,size) \
|
---|
| 71 | (((ULONG)(ptr) & ~0xffff) == (((ULONG)(ptr) + (size) - 1) & ~0xffff))
|
---|
| 72 |
|
---|
| 73 | /* Return true iff the structure pointed to by PTR does not cross a
|
---|
| 74 | 64KByte boundary. */
|
---|
| 75 |
|
---|
| 76 | #define _THUNK_PTR_STRUCT_OK(ptr) _THUNK_PTR_SIZE_OK ((ptr), sizeof (*(ptr)))
|
---|
| 77 |
|
---|
[1506] | 78 | __END_DECLS
|
---|
| 79 |
|
---|
[18] | 80 | #endif /* not _OS2THUNK_H */
|
---|