From 16be80b7b49ee02019eeaf8710028d90be8d368e Mon Sep 17 00:00:00 2001
From: Brad King <brad.king@kitware.com>
Date: Thu, 19 Apr 2007 11:31:55 -0400
Subject: ENH: Added support for Watcom compiler.  Added TODO comment about
 calling conventions.

---
 Source/kwsys/DynamicLoader.cxx | 34 ++++++++++++++++++++++++++++++----
 1 file changed, 30 insertions(+), 4 deletions(-)

diff --git a/Source/kwsys/DynamicLoader.cxx b/Source/kwsys/DynamicLoader.cxx
index f4aa064..9d2c6ea 100644
--- a/Source/kwsys/DynamicLoader.cxx
+++ b/Source/kwsys/DynamicLoader.cxx
@@ -251,13 +251,35 @@ int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib)
 DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
   DynamicLoader::LibraryHandle lib, const char* sym)
 {
+  // TODO: The calling convention affects the name of the symbol.  We
+  // should have a tool to help get the symbol with the desired
+  // calling convention.  Currently we assume cdecl.
+  //
+  // Borland:
+  //   __cdecl    = "_func" (default)
+  //   __fastcall = "@_func"
+  //   __stdcall  = "func"
+  //
+  // Watcom:
+  //   __cdecl    = "_func"
+  //   __fastcall = "@_func@X"
+  //   __stdcall  = "_func@X"
+  //   __watcall  = "func_" (default)
+  //
+  // MSVC:
+  //   __cdecl    = "func" (default)
+  //   __fastcall = "@_func@X"
+  //   __stdcall  = "_func@X"
+  //
+  // Note that the "@X" part of the name above is the total size (in
+  // bytes) of the arguments on the stack.
   void *result;
-#ifdef __BORLANDC__
-  // Need to prepend symbols with '_' on borland compilers
+#if defined(__BORLANDC__) || defined(__WATCOMC__)
+  // Need to prepend symbols with '_'
   size_t len = strlen(sym);
   char *rsym = new char[len + 1 + 1];
   strcpy(rsym, "_");
-  strcat(rsym+1, sym);
+  strcat(rsym, sym);
 #else
   const char *rsym = sym;
 #endif
@@ -268,11 +290,15 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
 #else
   result = (void*)GetProcAddress(lib, rsym);
 #endif
-#ifdef __BORLANDC__
+#if defined(__BORLANDC__) || defined(__WATCOMC__)
   delete[] rsym;
 #endif
   // Hack to cast pointer-to-data to pointer-to-function.
+#ifdef __WATCOMC__
+  return *(DynamicLoader::SymbolPointer*)(&result);
+#else
   return *reinterpret_cast<DynamicLoader::SymbolPointer*>(&result);
+#endif
 }
 
 //----------------------------------------------------------------------------
-- 
cgit v0.12