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 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 100 MODULE = OS2::DLL PACKAGE = OS2::DLL 101 102 BOOT: 103 needstrs(8); 104 trace = getenv("PERL_REXX_DEBUG"); 105 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 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 173