summaryrefslogtreecommitdiff
path: root/ext/dl/dl.h
blob: 7b8ad077ae060f5f648fb79e7626560917f9a574 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#ifndef RUBY_DL_H
#define RUBY_DL_H

#include <ruby.h>

#if !defined(FUNC_CDECL)
#  define FUNC_CDECL(x) x
#endif
#if !defined(FUNC_STDCALL)
#  define FUNC_STDCALL(x) x
#endif

#if defined(HAVE_DLFCN_H)
# include <dlfcn.h>
# /* some stranger systems may not define all of these */
#ifndef RTLD_LAZY
#define RTLD_LAZY 0
#endif
#ifndef RTLD_GLOBAL
#define RTLD_GLOBAL 0
#endif
#ifndef RTLD_NOW
#define RTLD_NOW 0
#endif
#else
# if defined(HAVE_WINDOWS_H)
#   include <windows.h>
#   define dlclose(ptr) FreeLibrary((HINSTANCE)ptr)
#   define dlopen(name,flag) ((void*)LoadLibrary(name))
#   define dlerror()    "unknown error"
#   define dlsym(handle,name) ((void*)GetProcAddress(handle,name))
#   define RTLD_LAZY -1
#   define RTLD_NOW  -1
#   define RTLD_GLOBAL -1
# endif
#endif

#define MAX_CALLBACK 5
#define DLSTACK_TYPE long
#define DLSTACK_SIZE (20)
#define DLSTACK_PROTO \
    DLSTACK_TYPE,DLSTACK_TYPE,DLSTACK_TYPE,DLSTACK_TYPE,DLSTACK_TYPE,\
    DLSTACK_TYPE,DLSTACK_TYPE,DLSTACK_TYPE,DLSTACK_TYPE,DLSTACK_TYPE,\
    DLSTACK_TYPE,DLSTACK_TYPE,DLSTACK_TYPE,DLSTACK_TYPE,DLSTACK_TYPE,\
    DLSTACK_TYPE,DLSTACK_TYPE,DLSTACK_TYPE,DLSTACK_TYPE,DLSTACK_TYPE
#define DLSTACK_ARGS(stack) \
    stack[0],stack[1],stack[2],stack[3],stack[4],\
    stack[5],stack[6],stack[7],stack[8],stack[9],\
    stack[10],stack[11],stack[12],stack[13],stack[14],\
    stack[15],stack[16],stack[17],stack[18],stack[19]

#define DLSTACK_PROTO0 
#define DLSTACK_PROTO1 DLSTACK_TYPE
#define DLSTACK_PROTO2 DLSTACK_PROTO1, DLSTACK_TYPE
#define DLSTACK_PROTO3 DLSTACK_PROTO2, DLSTACK_TYPE
#define DLSTACK_PROTO4 DLSTACK_PROTO3, DLSTACK_TYPE
#define DLSTACK_PROTO4 DLSTACK_PROTO3, DLSTACK_TYPE
#define DLSTACK_PROTO5 DLSTACK_PROTO4, DLSTACK_TYPE
#define DLSTACK_PROTO6 DLSTACK_PROTO5, DLSTACK_TYPE
#define DLSTACK_PROTO7 DLSTACK_PROTO6, DLSTACK_TYPE
#define DLSTACK_PROTO8 DLSTACK_PROTO7, DLSTACK_TYPE
#define DLSTACK_PROTO9 DLSTACK_PROTO8, DLSTACK_TYPE
#define DLSTACK_PROTO10 DLSTACK_PROTO9, DLSTACK_TYPE
#define DLSTACK_PROTO11 DLSTACK_PROTO10, DLSTACK_TYPE
#define DLSTACK_PROTO12 DLSTACK_PROTO11, DLSTACK_TYPE
#define DLSTACK_PROTO13 DLSTACK_PROTO12, DLSTACK_TYPE
#define DLSTACK_PROTO14 DLSTACK_PROTO13, DLSTACK_TYPE
#define DLSTACK_PROTO14 DLSTACK_PROTO13, DLSTACK_TYPE
#define DLSTACK_PROTO15 DLSTACK_PROTO14, DLSTACK_TYPE
#define DLSTACK_PROTO16 DLSTACK_PROTO15, DLSTACK_TYPE
#define DLSTACK_PROTO17 DLSTACK_PROTO16, DLSTACK_TYPE
#define DLSTACK_PROTO18 DLSTACK_PROTO17, DLSTACK_TYPE
#define DLSTACK_PROTO19 DLSTACK_PROTO18, DLSTACK_TYPE
#define DLSTACK_PROTO20 DLSTACK_PROTO19, DLSTACK_TYPE

#define DLSTACK_ARGS0(stack)
#define DLSTACK_ARGS1(stack) stack[0]
#define DLSTACK_ARGS2(stack) DLSTACK_ARGS1(stack), stack[1]
#define DLSTACK_ARGS3(stack) DLSTACK_ARGS2(stack), stack[2]
#define DLSTACK_ARGS4(stack) DLSTACK_ARGS3(stack), stack[3]
#define DLSTACK_ARGS5(stack) DLSTACK_ARGS4(stack), stack[4]
#define DLSTACK_ARGS6(stack) DLSTACK_ARGS5(stack), stack[5]
#define DLSTACK_ARGS7(stack) DLSTACK_ARGS6(stack), stack[6]
#define DLSTACK_ARGS8(stack) DLSTACK_ARGS7(stack), stack[7]
#define DLSTACK_ARGS9(stack) DLSTACK_ARGS8(stack), stack[8]
#define DLSTACK_ARGS10(stack) DLSTACK_ARGS9(stack), stack[9]
#define DLSTACK_ARGS11(stack) DLSTACK_ARGS10(stack), stack[10]
#define DLSTACK_ARGS12(stack) DLSTACK_ARGS11(stack), stack[11]
#define DLSTACK_ARGS13(stack) DLSTACK_ARGS12(stack), stack[12]
#define DLSTACK_ARGS14(stack) DLSTACK_ARGS13(stack), stack[13]
#define DLSTACK_ARGS15(stack) DLSTACK_ARGS14(stack), stack[14]
#define DLSTACK_ARGS16(stack) DLSTACK_ARGS15(stack), stack[15]
#define DLSTACK_ARGS17(stack) DLSTACK_ARGS16(stack), stack[16]
#define DLSTACK_ARGS18(stack) DLSTACK_ARGS17(stack), stack[17]
#define DLSTACK_ARGS19(stack) DLSTACK_ARGS18(stack), stack[18]
#define DLSTACK_ARGS20(stack) DLSTACK_ARGS19(stack), stack[19]

extern VALUE rb_mDL;
extern VALUE rb_cDLHandle;
extern VALUE rb_cDLSymbol;
extern VALUE rb_eDLError;
extern VALUE rb_eDLTypeError;

typedef struct { char c; void *x; } s_voidp;
typedef struct { char c; short x; } s_short;
typedef struct { char c; int x; } s_int;
typedef struct { char c; long x; } s_long;
typedef struct { char c; float x; } s_float;
typedef struct { char c; double x; } s_double;
#if HAVE_LONG_LONG
typedef struct { char c; LONG_LONG x; } s_long_long;
#endif

#define ALIGN_VOIDP  (sizeof(s_voidp) - sizeof(void *))
#define ALIGN_SHORT  (sizeof(s_short) - sizeof(short))
#define ALIGN_CHAR   (1)
#define ALIGN_INT    (sizeof(s_int) - sizeof(int))
#define ALIGN_LONG   (sizeof(s_long) - sizeof(long))
#if HAVE_LONG_LONG
#define ALIGN_LONG_LONG (sizeof(s_long_long) - sizeof(LONG_LONG))
#endif
#define ALIGN_FLOAT  (sizeof(s_float) - sizeof(float))
#define ALIGN_DOUBLE (sizeof(s_double) - sizeof(double))

#define DLALIGN(ptr,offset,align) {\
  while( (((unsigned long)((char *)ptr + offset)) % align) != 0 ) offset++;\
}


#define DLTYPE_VOID  0
#define DLTYPE_VOIDP 1
#define DLTYPE_CHAR  2
#define DLTYPE_SHORT 3
#define DLTYPE_INT   4
#define DLTYPE_LONG  5
#if HAVE_LONG_LONG
#define DLTYPE_LONG_LONG 6
#endif
#define DLTYPE_FLOAT 7
#define DLTYPE_DOUBLE 8
#define MAX_DLTYPE 9

#if SIZEOF_VOIDP == SIZEOF_LONG
# define PTR2NUM(x)   (ULONG2NUM((unsigned long)(x)))
# define NUM2PTR(x)   ((void*)(NUM2ULONG(x)))
#else
/* # error --->> Ruby/DL2 requires sizeof(void*) == sizeof(long) to be compiled. <<--- */
# define PTR2NUM(x)   (ULL2NUM((unsigned long long)(x)))
# define NUM2PTR(x)   ((void*)(NUM2ULL(x)))
#endif

#define BOOL2INT(x)  ((x == Qtrue)?1:0)
#define INT2BOOL(x)  (x?Qtrue:Qfalse)

typedef void (*freefunc_t)(void*);

struct dl_handle {
    void *ptr;
    int  open;
    int  enable_close;
};


struct cfunc_data {
    void *ptr;
    char *name;
    int  type;
    ID   calltype;
};
extern ID rbdl_id_cdecl;
extern ID rbdl_id_stdcall;
#define CFUNC_CDECL   (rbdl_id_cdecl)
#define CFUNC_STDCALL (rbdl_id_stdcall)

struct ptr_data {
    void *ptr;
    long size;
    freefunc_t free;
};

#define RDL_HANDLE(obj) ((struct dl_handle *)(DATA_PTR(obj)))
#define RCFUNC_DATA(obj) ((struct cfunc_data *)(DATA_PTR(obj)))
#define RPTR_DATA(obj) ((struct ptr_data *)(DATA_PTR(obj)))

VALUE rb_dlcfunc_new(void (*func)(), int dltype, const char * name, ID calltype);
VALUE rb_dlptr_new(void *ptr, long size, freefunc_t func);
VALUE rb_dlptr_new2(VALUE klass, void *ptr, long size, freefunc_t func);
VALUE rb_dlptr_malloc(long size, freefunc_t func);

#endif