Commit | Line | Data |
---|---|---|
ed344e4f IZ |
1 | #include "EXTERN.h" |
2 | #include "perl.h" | |
3 | #include "XSUB.h" | |
4 | ||
5 | #define INCL_BASE | |
6 | #define INCL_REXXSAA | |
7 | #include <os2emx.h> | |
8 | ||
9 | static RXSTRING * strs; | |
10 | static int nstrs; | |
11 | static char * trace; | |
12 | ||
13 | static void | |
14 | needstrs(int n) | |
15 | { | |
16 | if (n > nstrs) { | |
17 | if (strs) | |
18 | free(strs); | |
19 | nstrs = 2 * n; | |
20 | strs = malloc(nstrs * sizeof(RXSTRING)); | |
21 | } | |
22 | } | |
23 | ||
18729d3e JH |
24 | typedef ULONG (*fptr_UL_20)(ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG); |
25 | typedef __attribute__((regparm(3))) ULONG (*fptr_UL_20_rp3)(ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG); | |
26 | ||
27 | static inline unsigned long | |
28 | call20_p(unsigned long fp, char* str) | |
29 | { | |
30 | ULONG *argv = (ULONG*)str; | |
31 | fptr_UL_20 f = (fptr_UL_20)fp; | |
32 | ||
33 | return f(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15], argv[16], argv[17], argv[18], argv[19]); | |
34 | } | |
35 | ||
36 | static inline unsigned long | |
37 | call20(unsigned long fp, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5, unsigned long arg6, unsigned long arg7, unsigned long arg8, unsigned long arg9, unsigned long arg10, unsigned long arg11, unsigned long arg12, unsigned long arg13, unsigned long arg14, unsigned long arg15, unsigned long arg16, unsigned long arg17, unsigned long arg18, unsigned long arg19) | |
38 | { | |
39 | fptr_UL_20 f = (fptr_UL_20)fp; | |
40 | ||
41 | return f(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); | |
42 | } | |
43 | ||
44 | static inline unsigned long | |
45 | call20_rp3_p(unsigned long fp, char* str) | |
46 | { | |
47 | ULONG *argv = (ULONG*)str; | |
48 | fptr_UL_20_rp3 f = (fptr_UL_20_rp3)fp; | |
49 | ||
50 | return f(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15], argv[16], argv[17], argv[18], argv[19]); | |
51 | } | |
52 | ||
53 | static inline unsigned long | |
54 | call20_rp3(unsigned long fp, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5, unsigned long arg6, unsigned long arg7, unsigned long arg8, unsigned long arg9, unsigned long arg10, unsigned long arg11, unsigned long arg12, unsigned long arg13, unsigned long arg14, unsigned long arg15, unsigned long arg16, unsigned long arg17, unsigned long arg18, unsigned long arg19) | |
55 | { | |
56 | fptr_UL_20_rp3 f = (fptr_UL_20_rp3)fp; | |
57 | ||
58 | return f(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); | |
59 | } | |
60 | ||
61 | static inline void | |
62 | call20_Dos(char *msg, unsigned long fp, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5, unsigned long arg6, unsigned long arg7, unsigned long arg8, unsigned long arg9, unsigned long arg10, unsigned long arg11, unsigned long arg12, unsigned long arg13, unsigned long arg14, unsigned long arg15, unsigned long arg16, unsigned long arg17, unsigned long arg18, unsigned long arg19) | |
63 | { | |
64 | fptr_UL_20 f = (fptr_UL_20)fp; | |
65 | ULONG rc; | |
66 | ||
67 | if (CheckOSError(f(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19))) | |
68 | croak_with_os2error(msg); | |
69 | } | |
70 | ||
71 | static inline unsigned long | |
72 | call20_Win(char *msg, unsigned long fp, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5, unsigned long arg6, unsigned long arg7, unsigned long arg8, unsigned long arg9, unsigned long arg10, unsigned long arg11, unsigned long arg12, unsigned long arg13, unsigned long arg14, unsigned long arg15, unsigned long arg16, unsigned long arg17, unsigned long arg18, unsigned long arg19) | |
73 | { | |
74 | fptr_UL_20 f = (fptr_UL_20)fp; | |
75 | ||
76 | if (CheckWinError(f(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19))) | |
77 | croak_with_os2error(msg); | |
78 | } | |
79 | ||
80 | static inline unsigned long | |
81 | call20_Win_0OK(char *msg, unsigned long fp, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5, unsigned long arg6, unsigned long arg7, unsigned long arg8, unsigned long arg9, unsigned long arg10, unsigned long arg11, unsigned long arg12, unsigned long arg13, unsigned long arg14, unsigned long arg15, unsigned long arg16, unsigned long arg17, unsigned long arg18, unsigned long arg19) | |
82 | { | |
83 | fptr_UL_20 f = (fptr_UL_20)fp; | |
84 | ||
85 | ResetWinError(); | |
86 | return SaveCroakWinError(f(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19), | |
87 | 1 /* Die on error */, /* No prefix */, msg); | |
88 | } | |
89 | ||
90 | static inline unsigned long | |
91 | call20_Win_0OK_survive(unsigned long fp, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5, unsigned long arg6, unsigned long arg7, unsigned long arg8, unsigned long arg9, unsigned long arg10, unsigned long arg11, unsigned long arg12, unsigned long arg13, unsigned long arg14, unsigned long arg15, unsigned long arg16, unsigned long arg17, unsigned long arg18, unsigned long arg19) | |
92 | { | |
93 | fptr_UL_20 f = (fptr_UL_20)fp; | |
94 | ||
95 | ResetWinError(); | |
96 | return SaveCroakWinError(f(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19), | |
97 | 0 /* No die on error */, /* No prefix */, "N/A"); | |
98 | } | |
99 | ||
ed344e4f IZ |
100 | MODULE = OS2::DLL PACKAGE = OS2::DLL |
101 | ||
102 | BOOT: | |
103 | needstrs(8); | |
104 | trace = getenv("PERL_REXX_DEBUG"); | |
105 | ||
18729d3e JH |
106 | unsigned long |
107 | call20_p(unsigned long fp, char* argv) | |
108 | ||
109 | unsigned long | |
110 | call20(unsigned long fp, unsigned long arg0 = 0, unsigned long arg1 = 0, unsigned long arg2 = 0, unsigned long arg3 = 0, unsigned long arg4 = 0, unsigned long arg5 = 0, unsigned long arg6 = 0, unsigned long arg7 = 0, unsigned long arg8 = 0, unsigned long arg9 = 0, unsigned long arg10 = 0, unsigned long arg11 = 0, unsigned long arg12 = 0, unsigned long arg13 = 0, unsigned long arg14 = 0, unsigned long arg15 = 0, unsigned long arg16 = 0, unsigned long arg17 = 0, unsigned long arg18 = 0, unsigned long arg19 = 0) | |
111 | ||
112 | void | |
113 | call20_Dos(char* msg, unsigned long fp, unsigned long arg0 = 0, unsigned long arg1 = 0, unsigned long arg2 = 0, unsigned long arg3 = 0, unsigned long arg4 = 0, unsigned long arg5 = 0, unsigned long arg6 = 0, unsigned long arg7 = 0, unsigned long arg8 = 0, unsigned long arg9 = 0, unsigned long arg10 = 0, unsigned long arg11 = 0, unsigned long arg12 = 0, unsigned long arg13 = 0, unsigned long arg14 = 0, unsigned long arg15 = 0, unsigned long arg16 = 0, unsigned long arg17 = 0, unsigned long arg18 = 0, unsigned long arg19 = 0) | |
114 | ||
115 | unsigned long | |
116 | call20_Win(char *msg, unsigned long fp, unsigned long arg0 = 0, unsigned long arg1 = 0, unsigned long arg2 = 0, unsigned long arg3 = 0, unsigned long arg4 = 0, unsigned long arg5 = 0, unsigned long arg6 = 0, unsigned long arg7 = 0, unsigned long arg8 = 0, unsigned long arg9 = 0, unsigned long arg10 = 0, unsigned long arg11 = 0, unsigned long arg12 = 0, unsigned long arg13 = 0, unsigned long arg14 = 0, unsigned long arg15 = 0, unsigned long arg16 = 0, unsigned long arg17 = 0, unsigned long arg18 = 0, unsigned long arg19 = 0) | |
117 | ||
118 | unsigned long | |
119 | call20_Win_0OK(char *msg, unsigned long fp, unsigned long arg0 = 0, unsigned long arg1 = 0, unsigned long arg2 = 0, unsigned long arg3 = 0, unsigned long arg4 = 0, unsigned long arg5 = 0, unsigned long arg6 = 0, unsigned long arg7 = 0, unsigned long arg8 = 0, unsigned long arg9 = 0, unsigned long arg10 = 0, unsigned long arg11 = 0, unsigned long arg12 = 0, unsigned long arg13 = 0, unsigned long arg14 = 0, unsigned long arg15 = 0, unsigned long arg16 = 0, unsigned long arg17 = 0, unsigned long arg18 = 0, unsigned long arg19 = 0) | |
120 | ||
121 | unsigned long | |
122 | call20_Win_0OK_survive(unsigned long fp, unsigned long arg0 = 0, unsigned long arg1 = 0, unsigned long arg2 = 0, unsigned long arg3 = 0, unsigned long arg4 = 0, unsigned long arg5 = 0, unsigned long arg6 = 0, unsigned long arg7 = 0, unsigned long arg8 = 0, unsigned long arg9 = 0, unsigned long arg10 = 0, unsigned long arg11 = 0, unsigned long arg12 = 0, unsigned long arg13 = 0, unsigned long arg14 = 0, unsigned long arg15 = 0, unsigned long arg16 = 0, unsigned long arg17 = 0, unsigned long arg18 = 0, unsigned long arg19 = 0) | |
123 | ||
124 | unsigned long | |
125 | call20_rp3_p(unsigned long fp, char* argv) | |
126 | ||
127 | unsigned long | |
128 | call20_rp3(unsigned long fp, unsigned long arg0 = 0, unsigned long arg1 = 0, unsigned long arg2 = 0, unsigned long arg3 = 0, unsigned long arg4 = 0, unsigned long arg5 = 0, unsigned long arg6 = 0, unsigned long arg7 = 0, unsigned long arg8 = 0, unsigned long arg9 = 0, unsigned long arg10 = 0, unsigned long arg11 = 0, unsigned long arg12 = 0, unsigned long arg13 = 0, unsigned long arg14 = 0, unsigned long arg15 = 0, unsigned long arg16 = 0, unsigned long arg17 = 0, unsigned long arg18 = 0, unsigned long arg19 = 0) | |
129 | ||
ed344e4f IZ |
130 | SV * |
131 | _call(name, address, queue="SESSION", ...) | |
132 | char * name | |
133 | void * address | |
134 | char * queue | |
135 | CODE: | |
136 | { | |
137 | ULONG rc; | |
138 | int argc, i; | |
139 | RXSTRING result; | |
140 | UCHAR resbuf[256]; | |
141 | RexxFunctionHandler *fcn = address; | |
142 | argc = items-3; | |
143 | needstrs(argc); | |
144 | if (trace) | |
145 | fprintf(stderr, "REXXCALL::_call name: '%s' args:", name); | |
146 | for (i = 0; i < argc; ++i) { | |
147 | STRLEN len; | |
148 | char *ptr = SvPV(ST(3+i), len); | |
149 | MAKERXSTRING(strs[i], ptr, len); | |
150 | if (trace) | |
151 | fprintf(stderr, " '%.*s'", len, ptr); | |
152 | } | |
153 | if (!*queue) | |
154 | queue = "SESSION"; | |
155 | if (trace) | |
156 | fprintf(stderr, "\n"); | |
157 | MAKERXSTRING(result, resbuf, sizeof resbuf); | |
158 | rc = fcn(name, argc, strs, queue, &result); | |
159 | if (trace) | |
160 | fprintf(stderr, " rc=%X, result='%.*s'\n", rc, | |
161 | result.strlength, result.strptr); | |
162 | ST(0) = sv_newmortal(); | |
163 | if (rc == 0) { | |
164 | if (result.strptr) | |
165 | sv_setpvn(ST(0), result.strptr, result.strlength); | |
166 | else | |
167 | sv_setpvn(ST(0), "", 0); | |
168 | } | |
169 | if (result.strptr && result.strptr != resbuf) | |
170 | DosFreeMem(result.strptr); | |
171 | } | |
172 |