Various cosmetic changes.
[wine] / dlls / msvcrt / main.c
1 /*
2  * msvcrt.dll initialisation functions
3  *
4  * Copyright 2000 Jon Griffiths
5  */
6 #include "msvcrt.h"
7
8 #include "msvcrt/locale.h"
9 #include "msvcrt/stdio.h"
10
11 #include "wine/debug.h"
12
13 WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
14
15 /* Index to TLS */
16 DWORD MSVCRT_tls_index;
17
18 static inline BOOL msvcrt_init_tls(void);
19 static inline BOOL msvcrt_free_tls(void);
20 const char* msvcrt_get_reason(DWORD reason) WINE_UNUSED;
21
22 void msvcrt_init_io(void);
23 void msvcrt_init_console(void);
24 void msvcrt_free_console(void);
25 void msvcrt_init_args(void);
26 void msvcrt_free_args(void);
27 void msvcrt_init_vtables(void);
28
29 typedef void* (*MSVCRT_malloc_func)(unsigned int);
30 typedef void (*MSVCRT_free_func)(void*);
31
32 /*********************************************************************
33  *                  Init
34  */
35 BOOL WINAPI MSVCRT_Init(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
36 {
37   MSVCRT_thread_data *tls;
38
39   TRACE("(0x%08x, %s, %p) pid(%ld), tid(%ld), tls(%ld)\n",
40         hinstDLL, msvcrt_get_reason(fdwReason), lpvReserved,
41         (long)GetCurrentProcessId(), (long)GetCurrentThreadId(),
42         (long)MSVCRT_tls_index);
43
44   switch (fdwReason)
45   {
46   case DLL_PROCESS_ATTACH:
47     if (!msvcrt_init_tls())
48       return FALSE;
49     msvcrt_init_mt_locks();
50     msvcrt_init_vtables();
51     msvcrt_init_io();
52     msvcrt_init_console();
53     msvcrt_init_args();
54     MSVCRT_setlocale(0, "C");
55     TRACE("finished process init\n");
56     /* FALL THROUGH for Initial TLS allocation!! */
57   case DLL_THREAD_ATTACH:
58     TRACE("starting thread init\n");
59     /* Create TLS */
60     tls = (MSVCRT_thread_data*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
61                                           sizeof(MSVCRT_thread_data));
62     if (!tls || !TlsSetValue(MSVCRT_tls_index, tls))
63     {
64       ERR("TLS init failed! error = %ld\n", GetLastError());
65       return FALSE;
66     }
67     TRACE("finished thread init\n");
68     break;
69   case DLL_PROCESS_DETACH:
70     msvcrt_free_mt_locks();
71     _fcloseall();
72     msvcrt_free_console();
73     msvcrt_free_args();
74     if (!msvcrt_free_tls())
75       return FALSE;
76     TRACE("finished process free\n");
77     break;
78   case DLL_THREAD_DETACH:
79     /* Free TLS */
80     tls = TlsGetValue(MSVCRT_tls_index);
81
82     if (!tls)
83     {
84       ERR("TLS free failed! error = %ld\n", GetLastError());
85       return FALSE;
86     }
87     HeapFree(GetProcessHeap(), 0, tls);
88     TRACE("finished thread free\n");
89     break;
90   }
91   return TRUE;
92 }
93
94 static inline BOOL msvcrt_init_tls(void)
95 {
96   MSVCRT_tls_index = TlsAlloc();
97
98   if (MSVCRT_tls_index == TLS_OUT_OF_INDEXES)
99   {
100     ERR("TlsAlloc() failed!\n");
101     return FALSE;
102   }
103   return TRUE;
104 }
105
106 static inline BOOL msvcrt_free_tls(void)
107 {
108   if (!TlsFree(MSVCRT_tls_index))
109   {
110     ERR("TlsFree() failed!\n");
111     return FALSE;
112   }
113   return TRUE;
114 }
115
116 const char* msvcrt_get_reason(DWORD reason)
117 {
118   switch (reason)
119   {
120   case DLL_PROCESS_ATTACH: return "DLL_PROCESS_ATTACH";
121   case DLL_PROCESS_DETACH: return "DLL_PROCESS_DETACH";
122   case DLL_THREAD_ATTACH:  return "DLL_THREAD_ATTACH";
123   case DLL_THREAD_DETACH:  return "DLL_THREAD_DETACH";
124   }
125   return "UNKNOWN";
126 }
127
128
129 /*********************************************************************
130  *              $I10_OUTPUT (MSVCRT.@)
131  * Function not really understood but needed to make the DLL work
132  */
133 void MSVCRT_I10_OUTPUT(void)
134 {
135   /* FIXME: This is probably data, not a function */
136 }
137
138
139 /*********************************************************************
140  *              __unDName (MSVCRT.@)
141  * Function not really understood but needed to make the DLL work
142  */
143 char* MSVCRT___unDName(int unknown, const char* mangled,
144                        MSVCRT_malloc_func memget,
145                        MSVCRT_free_func memfree,
146                        unsigned int flags)
147 {
148   char* ret;
149
150   FIXME("(%d,%s,%p,%p,%x) stub!\n", unknown, mangled, memget, memfree, flags);
151
152   /* Experimentation reveals the following flag meanings when set:
153    * 0x0001 - Dont show __ in calling convention
154    * 0x0002 - Dont show calling convention at all
155    * 0x0004 - Dont show function/method return value
156    * 0x0010 - Same as 0x1
157    * 0x0080 - Dont show access specifier (public/protected/private)
158    * 0x0200 - Dont show static specifier
159    * 0x1000 - Only report the variable/class name
160    */
161   /* Duplicate the mangled name; for comparisons it doesn't matter anyway */
162   ret = memget(strlen(mangled) + 1);
163   strcpy(ret, mangled);
164   return ret;
165 }
166
167
168 /*********************************************************************
169  *              __unDNameEx (MSVCRT.@)
170  * Function not really understood but needed to make the DLL work
171  */
172 char* MSVCRT___unDNameEx(void)
173 {
174    return NULL;
175 }