1*a76b9a7fSPedro Giffuni /************************************************************************* 2*a76b9a7fSPedro Giffuni 3*a76b9a7fSPedro Giffuni Copyright 2011 Yuri Dario <mc6530@mclink.it> 4*a76b9a7fSPedro Giffuni 5*a76b9a7fSPedro Giffuni Licensed under the Apache License, Version 2.0 (the "License"); 6*a76b9a7fSPedro Giffuni you may not use this file except in compliance with the License. 7*a76b9a7fSPedro Giffuni You may obtain a copy of the License at 8*a76b9a7fSPedro Giffuni 9*a76b9a7fSPedro Giffuni http://www.apache.org/licenses/LICENSE-2.0 10*a76b9a7fSPedro Giffuni 11*a76b9a7fSPedro Giffuni Unless required by applicable law or agreed to in writing, software 12*a76b9a7fSPedro Giffuni distributed under the License is distributed on an "AS IS" BASIS, 13*a76b9a7fSPedro Giffuni WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*a76b9a7fSPedro Giffuni See the License for the specific language governing permissions and 15*a76b9a7fSPedro Giffuni limitations under the License. 16*a76b9a7fSPedro Giffuni 17*a76b9a7fSPedro Giffuni ************************************************************************/ 18*a76b9a7fSPedro Giffuni 19*a76b9a7fSPedro Giffuni #define INCL_DOS 20*a76b9a7fSPedro Giffuni #ifdef OS2 21*a76b9a7fSPedro Giffuni #include <svpm.h> 22*a76b9a7fSPedro Giffuni #else 23*a76b9a7fSPedro Giffuni #include <os2.h> 24*a76b9a7fSPedro Giffuni #endif 25*a76b9a7fSPedro Giffuni #include <dlfcn.h> 26*a76b9a7fSPedro Giffuni #include <stdarg.h> 27*a76b9a7fSPedro Giffuni #include <stdlib.h> 28*a76b9a7fSPedro Giffuni #ifdef TESTME 29*a76b9a7fSPedro Giffuni #include <stdio.h> 30*a76b9a7fSPedro Giffuni #endif 31*a76b9a7fSPedro Giffuni 32*a76b9a7fSPedro Giffuni typedef APIRET _PMPRINTF(const char*, ...); 33*a76b9a7fSPedro Giffuni typedef _PMPRINTF* PMPRINTF; 34*a76b9a7fSPedro Giffuni 35*a76b9a7fSPedro Giffuni static void* hmodPmPrintf = NULL; 36*a76b9a7fSPedro Giffuni static PMPRINTF pfnPmPrintf = NULL; 37*a76b9a7fSPedro Giffuni 38*a76b9a7fSPedro Giffuni int _Export debug_printf( const char* format, ...) 39*a76b9a7fSPedro Giffuni { 40*a76b9a7fSPedro Giffuni va_list args; 41*a76b9a7fSPedro Giffuni int cnt; 42*a76b9a7fSPedro Giffuni 43*a76b9a7fSPedro Giffuni if (hmodPmPrintf == NULL) { 44*a76b9a7fSPedro Giffuni // try dll loading 45*a76b9a7fSPedro Giffuni hmodPmPrintf = dlopen( "PMPRINTF", 0); 46*a76b9a7fSPedro Giffuni if (hmodPmPrintf == NULL) 47*a76b9a7fSPedro Giffuni return -1; 48*a76b9a7fSPedro Giffuni 49*a76b9a7fSPedro Giffuni // search function 50*a76b9a7fSPedro Giffuni pfnPmPrintf = dlsym(hmodPmPrintf, "PmPrintfVa"); 51*a76b9a7fSPedro Giffuni if (!pfnPmPrintf) 52*a76b9a7fSPedro Giffuni return -1; 53*a76b9a7fSPedro Giffuni 54*a76b9a7fSPedro Giffuni } 55*a76b9a7fSPedro Giffuni 56*a76b9a7fSPedro Giffuni // function loaded, print data 57*a76b9a7fSPedro Giffuni va_start(args, format); 58*a76b9a7fSPedro Giffuni cnt = pfnPmPrintf(format, args); 59*a76b9a7fSPedro Giffuni va_end(args); 60*a76b9a7fSPedro Giffuni 61*a76b9a7fSPedro Giffuni return cnt; 62*a76b9a7fSPedro Giffuni } 63*a76b9a7fSPedro Giffuni 64*a76b9a7fSPedro Giffuni 65*a76b9a7fSPedro Giffuni #ifdef TESTME 66*a76b9a7fSPedro Giffuni int main( void) 67*a76b9a7fSPedro Giffuni { 68*a76b9a7fSPedro Giffuni printf( "Test PMPRINTF.DLL output, check PM window.\n"); 69*a76b9a7fSPedro Giffuni debug_printf( "Test PMPRINTF.DLL output, check PM window."); 70*a76b9a7fSPedro Giffuni debug_printf( "Test PMPRINTF.DLL output: integer %d", 12345); 71*a76b9a7fSPedro Giffuni debug_printf( "Test PMPRINTF.DLL output: float %f", 123.45); 72*a76b9a7fSPedro Giffuni debug_printf( "Test PMPRINTF.DLL output: string '%s'", "Hello World"); 73*a76b9a7fSPedro Giffuni exit(0); 74*a76b9a7fSPedro Giffuni } 75*a76b9a7fSPedro Giffuni #endif // TESTME 76