1 package winapi_module_user;
5 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
12 &get_message_result_type
13 &get_message_result_kind
14 &get_message_wparam_type
15 &get_message_wparam_kind
16 &get_message_lparam_type
17 &get_message_lparam_kind
20 use config qw($wine_dir);
21 use options qw($options);
22 use output qw($output);
26 ########################################################################
30 ########################################################################
33 sub is_user_function {
35 if($name =~ /^(?:DefWindowProc|SendMessage)[AW]?$/) {
39 ########################################################################
44 id => 0x0006, result => "void", wparam => ["", ""], lparam => "HWND" },
46 id => 0x001c, result => "void", wparam => "BOOL", lparam => "DWORD" },
47 WM_ACTIVATESHELLWINDOW => {
48 id => 0x003e, result => "", wparam => "", lparam => "" },
49 WM_ACTIVATETOPLEVEL => {
50 id => 0x036e, result => "", wparam => "", lparam => "" },
52 id => 0x0029, result => "", wparam => "", lparam => "" },
54 id => 0x8000, result => "", wparam => "", lparam => "" },
55 WM_ASKCBFORMATNAME => {
56 id => 0x030c, result => "void", wparam => "int", lparam => "LPTSTR" },
59 id => 0x022c, result => "", wparam => "", lparam => "" },
62 id => 0x001f, result => "void", wparam => "void", lparam => "void" },
64 id => 0x004b, result => "", wparam => "", lparam => "" },
65 WM_CAPTURECHANGED => {
66 id => 0x0215, result => "void", wparam => "void", lparam => "HWND" },
68 id => 0x030d, result => "void", wparam => "HWND", lparam => "HWND" },
70 id => 0x0022, result => "void", wparam => "void", lparam => "void" },
72 id => 0x0303, result => "void", wparam => "void", lparam => "void" },
74 id => 0x0102, result => "void", wparam => "TCHAR", lparam => ["", ""] },
76 id => 0x002f, result => "int", wparam => ["UINT", "UINT"], lparam => "HWND" },
78 id => 0x0010, result => "void", wparam => "void", lparam => "void" },
79 WM_COALESCE_FIRST => {
80 id => 0x0390, result => "", wparam => "", lparam => "" },
82 id => 0x039f, result => "", wparam => "", lparam => "" },
84 id => 0x0111, result => "void", wparam => ["UINT", "UINT"], lparam => "HWND" },
86 id => 0x0365, result => "", wparam => "", lparam => "" },
88 id => 0x0044, result => "void", wparam => "int", lparam => ["", ""] },
90 id => 0x007b, result => "void", wparam => "HWND", lparam => ["UINT", "UINT"] },
92 id => 0x0301, result => "void", wparam => "void", lparam => "void" },
94 id => 0x004a, result => "", wparam => "", lparam => "" },
96 id => 0x0041, result => "void", wparam => "UINT", lparam => "void" },
98 id => 0x0039, result => "int", wparam => "UINT", lparam => "const COMPAREITEMSTRUCT *" },
100 id => 0x0001, result => "BOOL", wparam => "void", lparam => "LPCREATESTRUCT" },
102 id => 0x0019, result => "", wparam => "", lparam => "" },
104 id => 0x0135, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
106 id => 0x136, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
108 id => 0x133, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
109 WM_CTLCOLORLISTBOX => {
110 id => 0x134, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
111 WM_CTLCOLORMSGBOX => {
112 id => 0x132, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
113 WM_CTLCOLORSCROLLBAR => {
114 id => 0x137, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
115 WM_CTLCOLORSTATIC => {
116 id => 0x138, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
118 id => 0x0300, result => "void", wparam => "void", lparam => "void" },
120 WM_DDE_ACK => { # FIXME: Only correct if replying to WM_DDE_INITIATE
121 id => 0x03E4, result => "void", wparam => "HWND", lparam => ["ATOM", "ATOM"] },
123 id => 0x03E0, result => "void", wparam => "HWND", lparam => ["ATOM", "ATOM"] },
125 id => 0x0103, result => "void", wparam => "TCHAR", lparam => ["", ""] },
127 id => 0x0219, result => "BOOL", wparam => "UINT", lparam => "DWORD" },
129 id => 0x002d, result => "void", wparam => "UINT", lparam => "const DELETEITEMSTRUCT *" },
130 WM_DEVMODECHANGE => {
131 id => 0x001b, result => "void", wparam => "void", lparam => "LPCTSTR" },
133 id => 0x0002, result => "void", wparam => "void", lparam => "void" },
134 WM_DESTROYCLIPBOARD => {
135 id => 0x0307, result => "void", wparam => "void", lparam => "void" },
137 id => 0x036c, result => "", wparam => "", lparam => "" },
138 WM_DISPLAYCHANGE => {
139 id => 0x007e, result => "void", wparam => "UINT", lparam => ["UINT", "UINT"] },
141 id => 0x022d, result => "", wparam => "", lparam => "" },
143 id => 0x022f, result => "", wparam => "", lparam => "" },
145 id => 0x022e, result => "", wparam => "", lparam => "" },
146 WM_DRAWCLIPBOARD => {
147 id => 0x0308, result => "void", wparam => "void", lparam => "void" },
149 id => 0x002b, result => "void", wparam => "UINT", lparam => "const DRAWITEMSTRUCT *" },
151 id => 0x0233, result => "void", wparam => "HDROP", lparam => "void" },
153 id => 0x022a, result => "", wparam => "", lparam => "" },
156 id => 0x000a, result => "void", wparam => "BOOL", lparam => "void" },
158 id => 0x0016, result => "void", wparam => "BOOL", lparam => "void" },
160 id => 0x0121, result => "void", wparam => "UINT", lparam => "HWND" },
161 WM_ENTERSIZEMOVE => {
162 id => 0x0231, result => "", wparam => "", lparam => "" },
163 WM_ENTERMENULOOP => {
164 id => 0x0211, result => "", wparam => "", lparam => "" },
166 id => 0x0014, result => "BOOL", wparam => "HDC", lparam => "void" },
168 id => 0x0367, result => "", wparam => "", lparam => "" },
170 id => 0x0212, result => "", wparam => "", lparam => "" },
172 id => 0x0232, result => "", wparam => "", lparam => "" },
174 WM_FILESYSCHANGE => {
175 id => 0x0034, result => "", wparam => "", lparam => "" },
177 id => 0x036d, result => "", wparam => "", lparam => "" },
179 id => 0x001d, result => "void", wparam => "void", lparam => "void" },
182 id => 0x0087, result => "UINT", wparam => "WPARAM", lparam => "LPMSG" },
184 id => 0x0031, result => "HFONT", wparam => "void", lparam => "void" },
186 id => 0x0033, result => "", wparam => "", lparam => "" },
188 id => 0x007f, result => "", wparam => "", lparam => "" },
189 WM_GETMINMAXINFO => {
190 id => 0x0024, result => "void", wparam => "void", lparam => "LPMINMAXINFO" },
192 id => 0x000d, result => "int", wparam => "int", lparam => "LPTSTR" },
193 WM_GETTEXTLENGTH => {
194 id => 0x000e, result => "int", wparam => "void", lparam => "void" },
197 id => 0x0053, result => "void", wparam => "void", lparam => "LPHELPINFO" },
199 id => 0x0366, result => "", wparam => "", lparam => "" },
201 id => 0x0312, result => "", wparam => "", lparam => "" },
203 id => 0x0114, result => "void", wparam => ["int", "int"], lparam => "HWND" },
204 WM_HSCROLLCLIPBOARD => {
205 id => 0x030e, result => "void", wparam => "HWND", lparam => "" },
207 WM_ICONERASEBKGND => {
208 id => 0x0027, result => "BOOL", wparam => "HDC", lparam => "void" },
210 id => 0x0286, result => "", wparam => "", lparam => "" },
211 WM_IME_COMPOSITION => {
212 id => 0x010f, result => "", wparam => "", lparam => "" },
213 WM_IME_COMPOSITIONFULL => {
214 id => 0x0284, result => "", wparam => "", lparam => "" },
216 id => 0x0283, result => "", wparam => "", lparam => "" },
217 WM_IME_ENDCOMPOSITION => {
218 id => 0x010e, result => "", wparam => "", lparam => "" },
220 id => 0x0290, result => "void", wparam => "UINT", lparam => ["int", "UINT"] },
222 id => 0x010f, result => "", wparam => "", lparam => "" },
224 id => 0x0291, result => "void", wparam => "UINT", lparam => ["int", "UINT"] },
226 id => 0x0282, result => "", wparam => "", lparam => "" },
228 id => 0x0288, result => "", wparam => "", lparam => "" },
230 id => 0x0285, result => "", wparam => "", lparam => "" },
231 WM_IME_SETCONTEXT => {
232 id => 0x0281, result => "", wparam => "", lparam => "" },
233 WM_IME_STARTCOMPOSITION => {
234 id => 0x010d, result => "", wparam => "", lparam => "" },
235 WM_IDLEUPDATECMDUI => {
236 id => 0x0363, result => "", wparam => "", lparam => "" },
238 id => 0x0110, result => "BOOL", wparam => "HWND", lparam => "LPARAM" },
239 WM_INITIALUPDATE => {
240 id => 0x0364, result => "", wparam => "", lparam => "" },
242 id => 0x0116, result => "void", wparam => "HMENU", lparam => "void" },
243 WM_INITMENUPOPUP => {
244 id => 0x0117, result => "void", wparam => "HMENU", lparam => ["UINT", "BOOL"] },
245 WM_INPUTLANGCHANGE => {
246 id => 0x0051, result => "", wparam => "", lparam => "" },
247 WM_INPUTLANGCHANGEREQUEST => {
248 id => 0x0050, result => "", wparam => "", lparam => "" },
250 id => 0x0035, result => "", wparam => "", lparam => "" },
253 id => 0x0100, result => "void", wparam => "UINT", lparam => ["int", "UINT"] },
255 id => 0x0108, result => "", wparam => "", lparam => "" },
257 id => 0x036a, result => "", wparam => "", lparam => "" },
259 id => 0x0101, result => "void", wparam => "UINT", lparam => ["", ""] },
261 id => 0x0008, result => "void", wparam => "HWND", lparam => "void" },
264 id => 0x0131, result => "", wparam => "", lparam => "" },
265 WM_LBUTTONDBLCLK => {
266 id => 0x0203, result => "void", wparam => "UINT", lparam => ["", ""] },
268 id => 0x0201, result => "void", wparam => "UINT", lparam => ["", ""] },
270 id => 0x0202, result => "void", wparam => "UINT", lparam => ["", ""] },
272 WM_MBUTTONDBLCLK => {
273 id => 0x0209, result => "void", wparam => "UINT", lparam => ["", ""] },
275 id => 0x0207, result => "void", wparam => "UINT", lparam => ["", ""] },
277 id => 0x0208, result => "void", wparam => "UINT", lparam => ["", ""] },
279 id => 0x0222, result => "void", wparam => "HWND", lparam => "HWND" },
281 id => 0x0227, result => "BOOL", wparam => "UINT", lparam => "void" },
283 id => 0x0220, result => "HWND", wparam => "void", lparam => "const LPMDICREATESTRUCT" },
285 id => 0x0221, result => "void", wparam => "HWND", lparam => "void" },
287 id => 0x0229, result => "HWND", wparam => "void", lparam => "void" },
288 WM_MDIICONARRANGE => {
289 id => 0x0228, result => "void", wparam => "void", lparam => "void" },
291 id => 0x0225, result => "void", wparam => "HWND", lparam => "void" },
293 id => 0x0224, result => "HWND", wparam => "HWND", lparam => "BOOL" },
294 WM_MDIREFRESHMENU => {
295 id => 0x0234, result => "", wparam => "", lparam => "" },
297 id => 0x0223, result => "void", wparam => "HWND", lparam => "void" },
299 id => 0x0230, result => "HMENU", wparam => "BOOL", lparam => "HMENU" },
301 id => 0x0226, result => "BOOL", wparam => "UINT", lparam => "void" },
303 id => 0x002c, result => "void", wparam => "UINT", lparam => "MEASUREITEMSTRUCT *" },
305 id => 0x011f, result => "void", wparam => ["", ""], lparam => "HMENU" },
307 id => 0x0120, result => "DWORD", wparam => ["", "WORD"], lparam => "HMENU" },
308 WM_MOUSEACTIVATE => {
309 id => 0x0021, result => "int", wparam => "HWND", lparam => ["", ""] },
311 id => 0x0200, result => "void", wparam => "UINT", lparam => ["", ""] },
313 id => 0x020a, result => "void", wparam => ["DWORD", "int"], lparam => ["UINT", "UINT"] },
315 id => 0x0003, result => "void", wparam => "void", lparam => ["", ""] },
317 id => 0x0216, result => "", wparam => "", lparam => "" },
320 id => 0x0086, result => "BOOL", wparam => "BOOL", lparam => "void" },
321 WM_NCLBUTTONDBLCLK => {
322 id => 0x00a3, result => "void", wparam => "UINT", lparam => ["", ""] },
323 WM_NCLBUTTONDOWN => {
324 id => 0x00a1, result => "void", wparam => "UINT", lparam => ["", ""] },
326 id => 0x00a2, result => "void", wparam => "UINT", lparam => ["", ""] },
328 id => 0x00a0, result => "void", wparam => "UINT", lparam => ["", ""] },
329 WM_NCMBUTTONDBLCLK => {
330 id => 0x00a9, result => "void", wparam => "UINT", lparam => ["", ""] },
331 WM_NCMBUTTONDOWN => {
332 id => 0x00a7, result => "void", wparam => "UINT", lparam => ["", ""] },
334 id => 0x00a8, result => "void", wparam => "UINT", lparam => ["", ""] },
335 WM_NCRBUTTONDBLCLK => {
336 id => 0x00a6, result => "void", wparam => "UINT", lparam => ["", ""] },
337 WM_NCRBUTTONDOWN => {
338 id => 0x00a4, result => "void", wparam => "UINT", lparam => ["", ""] },
340 id => 0x00a5, result => "void", wparam => "UINT", lparam => ["", ""] },
342 id => 0x0083, result => "UINT", wparam => "void", lparam => "NCCALCSIZE_PARAMS *" },
344 id => 0x0081, result => "BOOL", wparam => "void", lparam => "LPCREATESTRUCT" },
346 id => 0x0082, result => "void", wparam => "void", lparam => "void" },
348 id => 0x0084, result => "UINT", wparam => "void", lparam => ["int", "int"] },
350 id => 0x0085, result => "void", wparam => "HRGN", lparam => "void" },
352 id => 0x0028, result => "HWND", wparam => "HWND", lparam => "BOOL" },
354 id => 0x0213, result => "void", wparam => "UINT", lparam => "LPMDINEXTMENU" },
356 id => 0x004e, result => "LRESULT", wparam => "int", lparam => "NMHDR *" },
358 id => 0x0055, result => "", wparam => "", lparam => "" },
360 id => 0x0000, result => "", wparam => "", lparam => "" },
363 id => 0x0378, result => "", wparam => "", lparam => "" },
364 WM_OCC_LOADFROMSTORAGE => {
365 id => 0x0377, result => "", wparam => "", lparam => "" },
366 WM_OCC_LOADFROMSTORAGE_EX => {
367 id => 0x037b, result => "", wparam => "", lparam => "" },
368 WM_OCC_LOADFROMSTREAM => {
369 id => 0x0376, result => "", wparam => "", lparam => "" },
370 WM_OCC_LOADFROMSTREAM_EX => {
371 id => 0x037a, result => "", wparam => "", lparam => "" },
372 WM_OTHERWINDOWCREATED => {
373 id => 0x003c, result => "", wparam => "", lparam => "" },
374 WM_OTHERWINDOWDESTROYED => {
375 id => 0x003d, result => "", wparam => "", lparam => "" },
378 id => 0x000f, result => "void", wparam => "void", lparam => "void" },
379 WM_PAINTCLIPBOARD => {
380 id => 0x0309, result => "void", wparam => "HWND", lparam => "const LPPAINTSTRUCT" },
382 id => 0x0026, result => "", wparam => "", lparam => "" },
383 WM_PALETTEISCHANGING => {
384 id => 0x0310, result => "void", wparam => "HWND", lparam => "void" },
385 WM_PALETTECHANGED => {
386 id => 0x0311, result => "void", wparam => "HWND", lparam => "void" },
388 id => 0x0210, result => "void", wparam => ["UINT", "int"], lparam => "HWND" },
390 id => 0x0302, result => "void", wparam => "void", lparam => "void" },
392 id => 0x0380, result => "", wparam => "", lparam => "" },
394 id => 0x038f, result => "", wparam => "", lparam => "" },
395 WM_POPMESSAGESTRING => {
396 id => 0x0375, result => "", wparam => "", lparam => "" },
398 id => 0x0048, result => "void", wparam => "int", lparam => "void" },
399 WM_POWERBROADCAST => {
400 id => 0x0218, result => "", wparam => "", lparam => "" },
402 id => 0x0317, result => "", wparam => "", lparam => "" },
404 id => 0x0318, result => "void", wparam => "HDC", lparam => "DWORD" },
406 WM_QUERY3DCONTROLS => {
407 id => 0x036f, result => "", wparam => "", lparam => "" },
408 WM_QUERYAFXWNDPROC => {
409 id => 0x0360, result => "", wparam => "", lparam => "" },
410 WM_QUERYCENTERWND => {
411 id => 0x036b, result => "", wparam => "", lparam => "" },
412 WM_QUERYDRAGICON => {
413 id => 0x0037, result => "HICON", wparam => "void", lparam => "void" },
414 WM_QUERYDROPOBJECT => {
415 id => 0x022b, result => "", wparam => "", lparam => "" },
416 WM_QUERYENDSESSION => {
417 id => 0x0011, result => "BOOL", wparam => "void", lparam => "void" },
418 WM_QUERYNEWPALETTE => {
419 id => 0x030f, result => "BOOL", wparam => "void", lparam => "void" },
421 id => 0x0013, result => "BOOL", wparam => "void", lparam => "void" },
422 WM_QUERYPARKICON => {
423 id => 0x0036, result => "", wparam => "", lparam => "" },
424 WM_QUERYSAVESTATE => {
425 id => 0x0038, result => "", wparam => "", lparam => "" },
427 id => 0x0023, result => "void", wparam => "void", lparam => "void" },
428 WM_QUEUE_SENTINEL => {
429 id => 0x0379, result => "", wparam => "", lparam => "" },
431 id => 0x0012, result => "void", wparam => "int", lparam => "void" },
433 WM_RBUTTONDBLCLK => {
434 id => 0x0206, result => "void", wparam => "UINT", lparam => ["", ""] },
436 id => 0x0204, result => "void", wparam => "UINT", lparam => ["", ""] },
438 id => 0x0205, result => "void", wparam => "UINT", lparam => ["", ""] },
440 id => 0x0368, result => "", wparam => "", lparam => "" },
441 WM_RENDERALLFORMATS => {
442 id => 0x0306, result => "void", wparam => "void", lparam => "void" },
444 id => 0x0305, result => "HANDLE", wparam => "UINT", lparam => "void" },
447 id => 0x0020, result => "BOOL", wparam => "HWND", lparam => ["UINT", "UINT"] },
449 id => 0x0007, result => "void", wparam => "HWND", lparam => "void" },
451 id => 0x0030, result => "void", wparam => "HFONT", lparam => "BOOL" },
453 id => 0x0032, result => "", wparam => "", lparam => "" },
455 id => 0x0080, result => "HICON", wparam => "DWORD", lparam => "HICON" },
456 WM_SETMESSAGESTRING => {
457 id => 0x0362, result => "", wparam => "", lparam => "" },
459 id => 0x000b, result => "void", wparam => "BOOL", lparam => "void" },
461 id => 0x000c, result => "void", wparam => "void", lparam => "LPCTSTR" },
463 id => 0x0009, result => "", wparam => "", lparam => "" },
465 id => 0x0018, result => "void", wparam => "BOOL", lparam => "UINT" },
467 id => 0x0005, result => "void", wparam => "UINT", lparam => ["", ""] },
469 id => 0x0369, result => "", wparam => "", lparam => "" },
470 WM_SIZECLIPBOARD => {
471 id => 0x030b, result => "void", wparam => "HWND", lparam => "const LPRECT" },
473 id => 0x0361, result => "", wparam => "", lparam => "" },
475 id => 0x0004, result => "", wparam => "", lparam => "" },
477 id => 0x0214, result => "", wparam => "", lparam => "" },
479 id => 0x0374, result => "", wparam => "", lparam => "" },
480 WM_SOCKET_NOTIFY => {
481 id => 0x0373, result => "", wparam => "", lparam => "" },
482 WM_SPOOLERSTATUS => {
483 id => 0x002a, result => "void", wparam => "UINT", lparam => ["", ""] },
485 id => 0x007d, result => "void", wparam => "DWORD", lparam => "LPSTYLESTRUCT" },
486 WM_STYLECHANGING => {
487 id => 0x007c, result => "void", wparam => "DWORD", lparam => "LPSTYLESTRUCT" },
489 id => 0x0088, result => "", wparam => "", lparam => "" },
491 id => 0x0089, result => "", wparam => "", lparam => "" },
493 id => 0x0106, result => "void", wparam => "TCHAR", lparam => ["", ""] },
494 WM_SYSCOLORCHANGE => {
495 id => 0x0015, result => "void", wparam => "void", lparam => "void" },
497 id => 0x0112, result => "void", wparam => "UINT", lparam => "int" },
499 id => 0x0107, result => "void", wparam => "TCHAR", lparam => ["", ""] },
501 id => 0x0104, result => "void", wparam => "UINT", lparam => ["", ""] },
503 id => 0x0105, result => "void", wparam => "UINT", lparam => ["", ""] },
505 id => 0x0017, result => "", wparam => "", lparam => "" },
507 id => 0x0118, result => "", wparam => "", lparam => "" },
510 id => 0x0052, result => "", wparam => "", lparam => "" },
512 id => 0x003a, result => "", wparam => "", lparam => "" },
514 id => 0x001e, result => "void", wparam => "void", lparam => "void" },
516 id => 0x0113, result => "void", wparam => "UINT", lparam => "void" },
519 id => 0x0304, result => "void", wparam => "void", lparam => "void" },
521 id => 0x0400, result => "", wparam => "", lparam => "" },
523 id => 0x0054, result => "", wparam => "", lparam => "" },
526 id => 0x002e, result => "int", wparam => ["UINT", "int"], lparam => "HWND" },
528 id => 0x0115, result => "void", wparam => ["int", "int"], lparam => "HWND" },
529 WM_VSCROLLCLIPBOARD => {
530 id => 0x030a, result => "void", wparam => "HWND", lparam => ["", ""] },
532 WM_WINDOWPOSCHANGING => {
533 id => 0x0046, result => "BOOL", wparam => "void", lparam => "LPWINDOWPOS" },
534 WM_WINDOWPOSCHANGED => {
535 id => 0x0047, result => "void", wparam => "void", lparam => "const LPWINDOWPOS" },
537 id => 0x001a, result => "void", wparam => "void", lparam => "LPCTSTR" }
540 ########################################################################
548 } elsif(/^(?:HBRUSH|HDC|HFONT|HMENU|HRGN|HWND)$/ || /\*$/ ||
557 ########################################################################
558 # get_message_result_type
560 sub get_message_result_type {
562 return $$message{$name}{result};
565 ########################################################################
566 # get_message_result_kind
568 sub get_message_result_kind {
569 return _get_kind(get_message_result_type(@_));
572 ########################################################################
573 # get_message_wparam_type
575 sub get_message_wparam_type {
577 return $$message{$name}{wparam};
580 ########################################################################
581 # get_message_wparam_kind
583 sub get_message_wparam_kind {
584 return _get_kind(get_message_wparam_type(@_));
587 ########################################################################
588 # get_message_lparam_type
590 sub get_message_lparam_type {
592 return $$message{$name}{lparam};
595 ########################################################################
596 # get_message_lparam_kind
598 sub get_message_lparam_kind {
599 return _get_kind(get_message_lparam_type(@_));
602 ########################################################################
607 my $found_preprocessor = shift;
608 my $found_comment = shift;
617 my @lines = split(/\n/, $_);
618 my $max_line = scalar(@lines);
620 my $parser = new c_parser($file);
622 $parser->set_found_preprocessor_callback($found_preprocessor);
623 $parser->set_found_comment_callback($found_comment);
625 my $found_line = sub {
629 $output->progress("$file: line $line of $max_line");
632 $parser->set_found_line_callback($found_line);
637 my $old_prefix = $output->prefix;
638 $output->progress("$file");
639 $output->prefix("$file: ");
641 if(!$parser->parse_c_file(\$_, \$line, \$column)) {
642 $output->write("can't parse file\n");
645 $output->prefix($old_prefix);
648 ########################################################################
649 # _get_tuple_arguments
651 sub _get_tuple_arguments {
654 my $parser = new c_parser;
661 my @argument_columns;
662 if(!$parser->parse_c_tuple(\$_, \$line, \$column, \@arguments, \@argument_lines, \@argument_columns)) {
669 ########################################################################
673 sub _parse_windowsx_h {
676 my $found_preprocessor = sub {
677 my $begin_line = shift;
678 my $begin_column = shift;
681 if(!s/^\#\s*define\s*// || !/^FORWARD_WM_/) {
686 if(s/^FORWARD_(\w+)\([^\)]*\)\s*(.*?)\s*$/$2/s) {
690 if($name eq "WM_SYSTEMERROR") {
695 if(s/^\(\s*(\w+)\s*\)(?:\(\s*\w+\s*\))*\(\s*\w+\s*\)//) {
701 (undef, $_, my $wparam, my $lparam) = _get_tuple_arguments($_);
706 } elsif(/^\(\w+\)\s*\?\s*(\w+)\s*:\s*(\w+)$/) {
712 local $_ = $last_comment;
713 s%^/\*\s*(.*?)\s*\*/$%$1%;
716 if(s/^(\w+)\s+\w+\s*\(\s*(.*?)\s*\)$/$2/) {
718 if($result2 eq "INT") { $result2 = "int"; }
719 if($result ne $result2) {
720 $output->write("message $name: result type mismatch '$result' != '$result2'\n");
722 foreach (split(/\s*,\s*/)) {
723 if(/^((?:const\s+)?\w+(?:\s*\*\s*|\s+)?)(\w+)$/) {
727 $type =~ s/^\s*(.*?)\s*$/$1/;
729 $arguments{$name} = $type;
734 # $output->write("$1: $_\n");
739 my $find_inner_cast = sub {
741 if(/^(?:\(\s*((?:const\s+)?\w+(?:\s*\*)?)\s*\))*\(.*?\)$/) {
752 [ \$wparam, "W", "w" ],
753 [ \$lparam, "L", "l" ]
755 foreach my $entry (@entries) {
756 (my $refparam, my $upper, my $lower) = @$entry;
758 local $_ = $$refparam;
759 if(s/^\(\s*$upper(?:)PARAM\s*\)\s*(?:\(\s*((?:const\s+)?\w+(?:\s*\*)?)\s*\))*\(\s*(.*?)\s*\)$/$2/) {
767 if(exists($arguments{$_})) {
768 $$refparam = $arguments{$_};
770 } elsif(/^\(\s*(\w+)\s*\)\s*\?\s*\(\s*(\w+)\s*\)\s*:\s*(?:\(\s*(\w+)\s*\)|0)$/) {
771 foreach ($1, $2, $3) {
772 if(exists($arguments{$_})) {
773 $$refparam = $arguments{$_};
777 } elsif(/^\(\((?:const\s+)?\w+\s*(?:\*\s*)?\)\s*(?:\(\s*\w+\s*\)|\w+)\s*\)\s*\->\s*\w+$/) {
782 } elsif(s/^(?:\(\s*$upper(?:)PARAM\s*\)\s*)?MAKE$upper(?:)PARAM\s*//) {
783 (my $low, my $high) = _get_tuple_arguments($_);
785 $low = &$find_inner_cast($low);
786 $high = &$find_inner_cast($high);
788 $$refparam = "($low,$high)";
789 } elsif(s/^\(.*?$lower(?:)Param.*?\)$//) {
790 $$refparam = $upper . "PARAM";
791 } elsif(s/^\(\s*(.*?)\s*\)$//) {
800 # $output->write("$result: '@names', '$wparam', '$lparam'\n");
802 foreach my $name (@names) {
803 my $result2 = $$message{$name}{result};
804 my $wparam2 = $$message{$name}{wparam};
805 my $lparam2 = $$message{$name}{lparam};
808 $wparam2 = "(" . join(",", @$wparam2) . ")";
812 $lparam2 = "(" . join(",", @$lparam2) . ")";
815 if($result ne $result2) {
816 $output->write("message $name: wrong result type '$result2' should be '$result'\n");
819 if($wparam ne $wparam2) {
820 # if($wparam ne "WPARAM" && $wparam ne "(,)") {
821 $output->write("message $name: wrong wparam type '$wparam2' should be '$wparam'\n");
825 if($lparam ne $lparam2) {
826 # if($lparam ne "LPARAM" && $lparam ne "(,)") {
827 $output->write("message $name: wrong lparam type '$lparam2' should be '$lparam'\n");
835 my $found_comment = sub {
836 my $begin_line = shift;
837 my $begin_column = shift;
840 $last_comment = $comment;
845 _parse_file("$wine_dir/include/windowsx.h", $found_preprocessor, $found_comment);
849 ########################################################################
852 sub _parse_winuser_h {
855 my $found_preprocessor = sub {
856 my $begin_line = shift;
857 my $begin_column = shift;
860 if(/^\#\s*define\s+(WM_\w+)\s+(0x[0-9a-fA-F]+)\s*$/) {
864 if(exists($$message{$name})) {
865 my $id2 = sprintf("0x%04x", $$message{$name}{id});
867 $output->write("message $name: wrong value ($id2) should be $id\n");
870 $output->write("message $name: exists but is not supported\n");
871 $not_found{$name} = $id;
878 _parse_file("$wine_dir/include/winuser.h", $found_preprocessor);
880 foreach my $name (sort(keys(%not_found))) {
881 my $id = $not_found{$name};
883 print " $name => {\n";
884 print "\tid => $id, result => \"\", wparam => \"\", lparam => \"\" },\n";