shell32/tests: Fix remaining failures on WinMe.
[wine] / dlls / msvcrt / main.c
index 93290b1..b42b64a 100644 (file)
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 #include "msvcrt.h"
 
-#include "msvcrt/locale.h"
-#include "msvcrt/stdio.h"
-
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
 
 /* Index to TLS */
-DWORD MSVCRT_tls_index;
+DWORD msvcrt_tls_index;
 
-static inline BOOL msvcrt_init_tls(void);
-static inline BOOL msvcrt_free_tls(void);
-const char* msvcrt_get_reason(DWORD reason) WINE_UNUSED;
+static const char* msvcrt_get_reason(DWORD reason)
+{
+  switch (reason)
+  {
+  case DLL_PROCESS_ATTACH: return "DLL_PROCESS_ATTACH";
+  case DLL_PROCESS_DETACH: return "DLL_PROCESS_DETACH";
+  case DLL_THREAD_ATTACH:  return "DLL_THREAD_ATTACH";
+  case DLL_THREAD_DETACH:  return "DLL_THREAD_DETACH";
+  }
+  return "UNKNOWN";
+}
+
+static inline BOOL msvcrt_init_tls(void)
+{
+  msvcrt_tls_index = TlsAlloc();
+
+  if (msvcrt_tls_index == TLS_OUT_OF_INDEXES)
+  {
+    ERR("TlsAlloc() failed!\n");
+    return FALSE;
+  }
+  return TRUE;
+}
 
-typedef void* (*MSVCRT_malloc_func)(unsigned int);
-typedef void (*MSVCRT_free_func)(void*);
+static inline BOOL msvcrt_free_tls(void)
+{
+  if (!TlsFree(msvcrt_tls_index))
+  {
+    ERR("TlsFree() failed!\n");
+    return FALSE;
+  }
+  return TRUE;
+}
 
 /*********************************************************************
  *                  Init
  */
-BOOL WINAPI MSVCRT_Init(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
 {
-  MSVCRT_thread_data *tls;
+  thread_data_t *tls;
 
-  TRACE("(%p, %s, %p) pid(%ld), tid(%ld), tls(%ld)\n",
+  TRACE("(%p, %s, %p) pid(%x), tid(%x), tls(%u)\n",
         hinstDLL, msvcrt_get_reason(fdwReason), lpvReserved,
-        (long)GetCurrentProcessId(), (long)GetCurrentThreadId(),
-        (long)MSVCRT_tls_index);
+        GetCurrentProcessId(), GetCurrentThreadId(),
+        msvcrt_tls_index);
 
   switch (fdwReason)
   {
@@ -54,11 +78,12 @@ BOOL WINAPI MSVCRT_Init(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
     if (!msvcrt_init_tls())
       return FALSE;
     msvcrt_init_mt_locks();
-    msvcrt_init_vtables();
     msvcrt_init_io();
     msvcrt_init_console();
     msvcrt_init_args();
+    msvcrt_init_signals();
     MSVCRT_setlocale(0, "C");
+    _setmbcp(_MB_CP_LOCALE);
     TRACE("finished process init\n");
     break;
   case DLL_THREAD_ATTACH:
@@ -68,99 +93,36 @@ BOOL WINAPI MSVCRT_Init(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
     msvcrt_free_io();
     msvcrt_free_console();
     msvcrt_free_args();
+    msvcrt_free_signals();
     if (!msvcrt_free_tls())
       return FALSE;
     TRACE("finished process free\n");
     break;
   case DLL_THREAD_DETACH:
     /* Free TLS */
-    tls = TlsGetValue(MSVCRT_tls_index);
-    if (tls) HeapFree(GetProcessHeap(), 0, tls);
+    tls = TlsGetValue(msvcrt_tls_index);
+    if (tls)
+    {
+       HeapFree(GetProcessHeap(),0,tls->efcvt_buffer);
+       HeapFree(GetProcessHeap(),0,tls->asctime_buffer);
+       HeapFree(GetProcessHeap(),0,tls->wasctime_buffer);
+       HeapFree(GetProcessHeap(),0,tls->strerror_buffer);
+    }
+    HeapFree(GetProcessHeap(), 0, tls);
     TRACE("finished thread free\n");
     break;
   }
   return TRUE;
 }
 
-static inline BOOL msvcrt_init_tls(void)
-{
-  MSVCRT_tls_index = TlsAlloc();
-
-  if (MSVCRT_tls_index == TLS_OUT_OF_INDEXES)
-  {
-    ERR("TlsAlloc() failed!\n");
-    return FALSE;
-  }
-  return TRUE;
-}
-
-static inline BOOL msvcrt_free_tls(void)
-{
-  if (!TlsFree(MSVCRT_tls_index))
-  {
-    ERR("TlsFree() failed!\n");
-    return FALSE;
-  }
-  return TRUE;
-}
-
-const char* msvcrt_get_reason(DWORD reason)
-{
-  switch (reason)
-  {
-  case DLL_PROCESS_ATTACH: return "DLL_PROCESS_ATTACH";
-  case DLL_PROCESS_DETACH: return "DLL_PROCESS_DETACH";
-  case DLL_THREAD_ATTACH:  return "DLL_THREAD_ATTACH";
-  case DLL_THREAD_DETACH:  return "DLL_THREAD_DETACH";
-  }
-  return "UNKNOWN";
-}
-
-
 /*********************************************************************
  *             $I10_OUTPUT (MSVCRT.@)
  * Function not really understood but needed to make the DLL work
  */
-void MSVCRT_I10_OUTPUT(void)
+void CDECL MSVCRT_I10_OUTPUT(void)
 {
   /* FIXME: This is probably data, not a function */
-}
-
-
-/*********************************************************************
- *             __unDName (MSVCRT.@)
- * Function not really understood but needed to make the DLL work
- */
-char* MSVCRT___unDName(int unknown, const char* mangled,
-                       MSVCRT_malloc_func memget,
-                       MSVCRT_free_func memfree,
-                       unsigned int flags)
-{
-  char* ret;
-
-  FIXME("(%d,%s,%p,%p,%x) stub!\n", unknown, mangled, memget, memfree, flags);
-
-  /* Experimentation reveals the following flag meanings when set:
-   * 0x0001 - Dont show __ in calling convention
-   * 0x0002 - Dont show calling convention at all
-   * 0x0004 - Dont show function/method return value
-   * 0x0010 - Same as 0x1
-   * 0x0080 - Dont show access specifier (public/protected/private)
-   * 0x0200 - Dont show static specifier
-   * 0x1000 - Only report the variable/class name
-   */
-  /* Duplicate the mangled name; for comparisons it doesn't matter anyway */
-  ret = memget(strlen(mangled) + 1);
-  strcpy(ret, mangled);
-  return ret;
-}
-
-
-/*********************************************************************
- *             __unDNameEx (MSVCRT.@)
- * Function not really understood but needed to make the DLL work
- */
-char* MSVCRT___unDNameEx(void)
-{
-   return NULL;
+  /* no it is a function. I10 is an Int of 10 bytes */
+  /* also known as 80 bit floating point (long double */
+  /* for some compilers, not MSVC) */
 }