Moved ts_xlib.c into x11drv and removed libwine_tsx11.
[wine] / dlls / msvcrt / main.c
1 /*
2  * msvcrt.dll initialisation functions
3  *
4  * Copyright 2000 Jon Griffiths
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20 #include "msvcrt.h"
21
22 #include "msvcrt/locale.h"
23 #include "msvcrt/stdio.h"
24
25 #include "wine/debug.h"
26
27 WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
28
29 /* Index to TLS */
30 DWORD MSVCRT_tls_index;
31
32 static inline BOOL msvcrt_init_tls(void);
33 static inline BOOL msvcrt_free_tls(void);
34 const char* msvcrt_get_reason(DWORD reason) WINE_UNUSED;
35
36 typedef void* (*MSVCRT_malloc_func)(unsigned int);
37 typedef void (*MSVCRT_free_func)(void*);
38
39 /*********************************************************************
40  *                  Init
41  */
42 BOOL WINAPI MSVCRT_Init(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
43 {
44   MSVCRT_thread_data *tls;
45
46   TRACE("(0x%08x, %s, %p) pid(%ld), tid(%ld), tls(%ld)\n",
47         hinstDLL, msvcrt_get_reason(fdwReason), lpvReserved,
48         (long)GetCurrentProcessId(), (long)GetCurrentThreadId(),
49         (long)MSVCRT_tls_index);
50
51   switch (fdwReason)
52   {
53   case DLL_PROCESS_ATTACH:
54     if (!msvcrt_init_tls())
55       return FALSE;
56     msvcrt_init_mt_locks();
57     msvcrt_init_vtables();
58     msvcrt_init_io();
59     msvcrt_init_console();
60     msvcrt_init_args();
61     MSVCRT_setlocale(0, "C");
62     TRACE("finished process init\n");
63     break;
64   case DLL_THREAD_ATTACH:
65     break;
66   case DLL_PROCESS_DETACH:
67     msvcrt_free_mt_locks();
68     msvcrt_free_io();
69     msvcrt_free_console();
70     msvcrt_free_args();
71     if (!msvcrt_free_tls())
72       return FALSE;
73     TRACE("finished process free\n");
74     break;
75   case DLL_THREAD_DETACH:
76     /* Free TLS */
77     tls = TlsGetValue(MSVCRT_tls_index);
78     if (tls) HeapFree(GetProcessHeap(), 0, tls);
79     TRACE("finished thread free\n");
80     break;
81   }
82   return TRUE;
83 }
84
85 static inline BOOL msvcrt_init_tls(void)
86 {
87   MSVCRT_tls_index = TlsAlloc();
88
89   if (MSVCRT_tls_index == TLS_OUT_OF_INDEXES)
90   {
91     ERR("TlsAlloc() failed!\n");
92     return FALSE;
93   }
94   return TRUE;
95 }
96
97 static inline BOOL msvcrt_free_tls(void)
98 {
99   if (!TlsFree(MSVCRT_tls_index))
100   {
101     ERR("TlsFree() failed!\n");
102     return FALSE;
103   }
104   return TRUE;
105 }
106
107 const char* msvcrt_get_reason(DWORD reason)
108 {
109   switch (reason)
110   {
111   case DLL_PROCESS_ATTACH: return "DLL_PROCESS_ATTACH";
112   case DLL_PROCESS_DETACH: return "DLL_PROCESS_DETACH";
113   case DLL_THREAD_ATTACH:  return "DLL_THREAD_ATTACH";
114   case DLL_THREAD_DETACH:  return "DLL_THREAD_DETACH";
115   }
116   return "UNKNOWN";
117 }
118
119
120 /*********************************************************************
121  *              $I10_OUTPUT (MSVCRT.@)
122  * Function not really understood but needed to make the DLL work
123  */
124 void MSVCRT_I10_OUTPUT(void)
125 {
126   /* FIXME: This is probably data, not a function */
127 }
128
129
130 /*********************************************************************
131  *              __unDName (MSVCRT.@)
132  * Function not really understood but needed to make the DLL work
133  */
134 char* MSVCRT___unDName(int unknown, const char* mangled,
135                        MSVCRT_malloc_func memget,
136                        MSVCRT_free_func memfree,
137                        unsigned int flags)
138 {
139   char* ret;
140
141   FIXME("(%d,%s,%p,%p,%x) stub!\n", unknown, mangled, memget, memfree, flags);
142
143   /* Experimentation reveals the following flag meanings when set:
144    * 0x0001 - Dont show __ in calling convention
145    * 0x0002 - Dont show calling convention at all
146    * 0x0004 - Dont show function/method return value
147    * 0x0010 - Same as 0x1
148    * 0x0080 - Dont show access specifier (public/protected/private)
149    * 0x0200 - Dont show static specifier
150    * 0x1000 - Only report the variable/class name
151    */
152   /* Duplicate the mangled name; for comparisons it doesn't matter anyway */
153   ret = memget(strlen(mangled) + 1);
154   strcpy(ret, mangled);
155   return ret;
156 }
157
158
159 /*********************************************************************
160  *              __unDNameEx (MSVCRT.@)
161  * Function not really understood but needed to make the DLL work
162  */
163 char* MSVCRT___unDNameEx(void)
164 {
165    return NULL;
166 }