summaryrefslogtreecommitdiff
path: root/wince/dl_win32.xs
diff options
context:
space:
mode:
authorJarkko Hietaniemi <jhi@iki.fi>2001-08-02 13:25:43 +0000
committerJarkko Hietaniemi <jhi@iki.fi>2001-08-02 13:25:43 +0000
commite1caacb4fdb62cb28dc825ca0115faf95e569339 (patch)
tree82b5eb0dc32a568bebeaf78d402b2441de840112 /wince/dl_win32.xs
parent6f2ad931e2b0390c895341c3cd8e3fad2616118f (diff)
downloadperl-e1caacb4fdb62cb28dc825ca0115faf95e569339.tar.gz
Integrate the PerlCE (WinCE Perl) port;
kindly supplied by Rainer Keuchel <rkeuc@allgeier.com>. p4raw-id: //depot/perl@11549
Diffstat (limited to 'wince/dl_win32.xs')
-rw-r--r--wince/dl_win32.xs168
1 files changed, 168 insertions, 0 deletions
diff --git a/wince/dl_win32.xs b/wince/dl_win32.xs
new file mode 100644
index 0000000000..15962a6772
--- /dev/null
+++ b/wince/dl_win32.xs
@@ -0,0 +1,168 @@
+/* dl_win32.xs
+ *
+ * Platform: Win32 (Windows NT/Windows 95)
+ * Author: Wei-Yuen Tan (wyt@hip.com)
+ * Created: A warm day in June, 1995
+ *
+ * Modified:
+ * August 23rd 1995 - rewritten after losing everything when I
+ * wiped off my NT partition (eek!)
+ */
+
+/* Porting notes:
+
+I merely took Paul's dl_dlopen.xs, took out extraneous stuff and
+replaced the appropriate SunOS calls with the corresponding Win32
+calls.
+
+*/
+
+#define WIN32_LEAN_AND_MEAN
+#ifdef __GNUC__
+#define Win32_Winsock
+#endif
+#include <windows.h>
+#include <string.h>
+
+#define PERL_NO_GET_CONTEXT
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "win32.h"
+
+#ifdef PERL_OBJECT
+#define NO_XSLOCKS
+#endif /* PERL_OBJECT */
+
+#include "XSUB.h"
+
+static SV *error_sv;
+
+static char *
+OS_Error_String(pTHXo)
+{
+ DWORD err = GetLastError();
+ STRLEN len;
+ if (!error_sv)
+ error_sv = newSVpvn("",0);
+ PerlProc_GetOSError(error_sv,err);
+ return SvPV(error_sv,len);
+}
+
+#include "dlutils.c" /* SaveError() etc */
+
+static void
+dl_private_init(pTHXo)
+{
+ (void)dl_generic_private_init(aTHXo);
+}
+
+/*
+ This function assumes the list staticlinkmodules
+ will be formed from package names with '::' replaced
+ with '/'. Thus Win32::OLE is in the list as Win32/OLE
+*/
+static int
+dl_static_linked(char *filename)
+{
+ char **p;
+ char* ptr;
+ static char subStr[] = "/auto/";
+ char szBuffer[MAX_PATH];
+
+ /* change all the '\\' to '/' */
+ strcpy(szBuffer, filename);
+ for(ptr = szBuffer; ptr = strchr(ptr, '\\'); ++ptr)
+ *ptr = '/';
+
+ /* delete the file name */
+ ptr = strrchr(szBuffer, '/');
+ if(ptr != NULL)
+ *ptr = '\0';
+
+ /* remove leading lib path */
+ ptr = strstr(szBuffer, subStr);
+ if(ptr != NULL)
+ ptr += sizeof(subStr)-1;
+ else
+ ptr = szBuffer;
+
+ for (p = staticlinkmodules; *p;p++) {
+ if (strstr(ptr, *p)) return 1;
+ };
+ return 0;
+}
+
+MODULE = DynaLoader PACKAGE = DynaLoader
+
+BOOT:
+ (void)dl_private_init(aTHXo);
+
+void *
+dl_load_file(filename,flags=0)
+ char * filename
+ int flags
+ PREINIT:
+ CODE:
+ {
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log,"dl_load_file(%s):\n", filename));
+ if (dl_static_linked(filename) == 0) {
+ RETVAL = PerlProc_DynaLoad(filename);
+ }
+ else
+ RETVAL = (void*) XCEGetModuleHandleA(NULL);
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log," libref=%x\n", RETVAL));
+ ST(0) = sv_newmortal() ;
+ if (RETVAL == NULL)
+ SaveError(aTHXo_ "load_file:%s",
+ OS_Error_String(aTHXo)) ;
+ else
+ sv_setiv( ST(0), (IV)RETVAL);
+ }
+
+void *
+dl_find_symbol(libhandle, symbolname)
+ void * libhandle
+ char * symbolname
+ CODE:
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log,"dl_find_symbol(handle=%x, symbol=%s)\n",
+ libhandle, symbolname));
+ RETVAL = (void*) XCEGetProcAddressA((HINSTANCE) libhandle, symbolname);
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log," symbolref = %x\n", RETVAL));
+ ST(0) = sv_newmortal() ;
+ if (RETVAL == NULL)
+ SaveError(aTHXo_ "find_symbol:%s",
+ OS_Error_String(aTHXo)) ;
+ else
+ sv_setiv( ST(0), (IV)RETVAL);
+
+
+void
+dl_undef_symbols()
+ PPCODE:
+
+
+
+# These functions should not need changing on any platform:
+
+void
+dl_install_xsub(perl_name, symref, filename="$Package")
+ char * perl_name
+ void * symref
+ char * filename
+ CODE:
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log,"dl_install_xsub(name=%s, symref=%x)\n",
+ perl_name, symref));
+ ST(0) = sv_2mortal(newRV((SV*)newXS(perl_name,
+ (void(*)(pTHXo_ CV *))symref,
+ filename)));
+
+
+char *
+dl_error()
+ CODE:
+ RETVAL = LastError ;
+ OUTPUT:
+ RETVAL
+
+# end.