- Continued on the new C parser.
[wine] / tools / winapi / winapi_module_user.pm
1 package winapi_module_user;
2
3 use strict;
4
5 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
6 require Exporter;
7
8 @ISA = qw(Exporter);
9 @EXPORT = qw();
10 @EXPORT_OK = qw(
11     &is_user_function
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
18 );
19
20 use config qw($wine_dir);
21 use options qw($options);
22 use output qw($output);
23
24 use c_parser;
25
26 ########################################################################
27
28 my $message;
29
30 ########################################################################
31 # is_user_function
32
33 sub is_user_function {
34     my $name = shift;
35     if($name =~ /^(?:DefWindowProc|SendMessage)[AW]?$/) {
36     }
37 }
38
39 ########################################################################
40 # $message
41
42 $message = {
43     WM_ACTIVATE => {
44         id => 0, result => "void", wparam => ["", ""], lparam => "HWND" },
45     WM_ACTIVATEAPP => {
46         id => 0, result => "void", wparam => "BOOL", lparam => "LPARAM" },
47
48     WM_BEGINDRAG => {
49         id => 0, result => "", wparam => "", lparam => "" },
50
51     WM_CANCELMODE => {
52         id => 0, result => "void", wparam => "void", lparam => "void" },
53     WM_CHAR => {
54         id => 0, result => "void", wparam => "TCHAR", lparam => ["", ""] },
55     WM_CHARTOITEM => {
56         id => 0x002f, result => "void", wparam => ["UINT", "int"], lparam => "HWND" },
57     WM_CLOSE => {
58         id => 0, result => "void", wparam => "void", lparam => "void" },
59     WM_COMMAND => {
60         id => 0, result => "void", wparam => ["int", "UINT"], lparam => "HWND" },
61     WM_COPY => {
62         id => 0x0301, result => "void", wparam => "void", lparam => "void" },
63     WM_COMPACTING => { 
64         id => 0, result => "void", wparam => "UINT", lparam => "void" },
65     WM_COMPAREITEM => { 
66         id => 0, result => "int", wparam => "UINT", lparam => "const COMPAREITEMSTRUCT *" },
67
68     WM_CREATE => {
69         id => 0, result => "BOOL", wparam => "void", lparam => "LPCREATESTRUCT" },
70     WM_CTLCOLORBTN => {
71         id => 0x0135, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
72     WM_CTLCOLORDLG => {
73         id => 0x136, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
74     WM_CTLCOLOREDIT => {
75         id => 0x133, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
76     WM_CTLCOLORLISTBOX => {
77         id => 0x134, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
78     WM_CTLCOLORMSGBOX => {
79         id => 0x132, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
80     WM_CTLCOLORSCROLLBAR => {
81         id => 0x137, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
82     WM_CTLCOLORSTATIC => {
83         id => 0x138, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
84
85     WM_CUT => {
86         id => 0, result => "void", wparam => "void", lparam => "void" },
87
88     WM_DEADCHAR => {
89         id => 0, result => "void", wparam => "TCHAR", lparam => ["", ""] },
90     WM_DELETEITEM => { 
91         id => 0, result => "void", wparam => "UINT", lparam => "const DELETEITEMSTRUCT *" },
92     WM_DEVMODECHANGE => {
93         id => 0, result => "void", wparam => "void", lparam => "LPCTSTR" },
94     WM_DESTROY => {
95         id => 0, result => "void", wparam => "void", lparam => "void" },
96     WM_DRAWITEM => {
97         id => 0, result => "void", wparam => "void", lparam => "const DRAWITEMSTRUCT *" },
98     WM_DROPFILES => {
99         id => 0, result => "void", wparam => "HDROP", lparam => "void" },
100
101     WM_ENABLE => {
102         id => 0, result => "void", wparam => "BOOL", lparam => "void" },
103     WM_ENDSESSION => {
104         id => 0, result => "void", wparam => "BOOL", lparam => "void" },
105     WM_ENTERIDLE => {
106         id => 0x0121, result => "void", wparam => "UINT", lparam => "HWND" },
107     WM_ENTERMENULOOP => {
108         id => 0x0211, result => "", wparam => "", lparam => "" },
109     WM_ERASEBKGND => {
110         id => 0, result => "BOOL", wparam => "HDC", lparam => "void" },
111     WM_EXITMENULOOP => {
112         id => 0x0212, result => "", wparam => "", lparam => "" },
113
114     WM_FONTCHANGE => {
115         id => 0, result => "void", wparam => "void", lparam => "void" },
116
117     WM_GETTEXT => {
118         id => 0, result => "int", wparam => "int", lparam => "LPTSTR" },
119     WM_GETTEXTLENGTH => {
120         id => 0, result => "int", wparam => "void", lparam => "void" },
121
122     WM_HELP => {
123         id => 0x0053, result => "", wparam => "", lparam => "" },
124     WM_HSCROLL => {
125         id => 0, result => "void", wparam => ["UINT", "int"], lparam => "HWND" },
126
127     WM_ICONERASEBKGND => {
128         id => 0, result => "BOOL", wparam => "HDC", lparam => "void" },
129     WM_INITMENU => {
130         id => 0, result => "void", wparam => "HMENU", lparam => "void" },
131     WM_INITMENUPOPUP => {
132         id => 0, result => "void", wparam => "HMENU", lparam => ["UINT", "BOOL"] },
133     WM_ISACTIVEICON => {
134         id => 0, result => "", wparam => "", lparam => "" },
135
136     WM_KEYDOWN => {
137         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
138     WM_KEYUP => {
139         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
140     WM_KILLFOCUS => {
141         id => 0, result => "void", wparam => "HWND", lparam => "void" },
142
143     WM_LBTRACKPOINT => {
144         id => 0, result => "", wparam => "", lparam => "" },
145     WM_LBUTTONDBLCLK => {
146         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
147     WM_LBUTTONDOWN => {
148         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
149     WM_LBUTTONUP => {
150         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
151
152     WM_MBUTTONDBLCLK => {
153         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
154     WM_MBUTTONDOWN => {
155         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
156     WM_MBUTTONUP => {
157         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
158     WM_MEASUREITEM => {
159         id => 0, result => "void", wparam => "UINT", lparam => "MEASUREITEMSTRUCT *" },
160     WM_MENUSELECT => {
161         id => 0, result => "void", wparam => ["", ""], lparam => "HMENU" },
162     WM_MENUCHAR => {
163         id => 0, result => "DWORD", wparam => ["", ""], lparam => "HMENU" },
164     WM_MOUSEACTIVATE => {
165         id => 0, result => "int", wparam => "HWND", lparam => ["", ""] },
166     WM_MOUSEMOVE => {
167         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
168     WM_MOVE => {
169         id => 0, result => "void", wparam => "void", lparam => ["", ""] },
170
171     WM_NCACTIVATE => {
172         id => 0, result => "BOOL", wparam => "BOOL", lparam => "void" },
173     WM_NCLBUTTONDBLCLK => {
174         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
175     WM_NCLBUTTONDOWN => {
176         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
177     WM_NCLBUTTONUP => {
178         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
179     WM_NCMOUSEMOVE => {
180         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
181     WM_NCMBUTTONDBLCLK => {
182         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
183     WM_NCMBUTTONDOWN => {
184         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
185     WM_NCMBUTTONUP => {
186         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
187     WM_NCRBUTTONDBLCLK => {
188         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
189     WM_NCRBUTTONDOWN => {
190         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
191     WM_NCRBUTTONUP => {
192         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
193     WM_NCCALCSIZE => {
194         id => 0, result => "UINT", wparam => "void", lparam => "LPARAM" },
195     WM_NCCREATE => {
196         id => 0, result => "BOOL", wparam => "void", lparam => "LPCREATESTRUCT" },
197     WM_NCDESTROY => {
198         id => 0, result => "void", wparam => "void", lparam => "void" },
199     WM_NCPAINT => {
200         id => 0, result => "void", wparam => "HRGN", lparam => "void" },
201     WM_NEXTMENU => {
202         id => 0x0213, result => "", wparam => "", lparam => "" },
203     WM_NOTIFY => {
204         id => 0x004e, result => "LRESULT", wparam => "int", lparam => "NMHDR *" },
205
206
207     WM_PALETTEISCHANGING => {
208         id => 0, result => "void", wparam => "HWND", lparam => "void" },
209     WM_PALETTECHANGED => {
210         id => 0, result => "void", wparam => "HWND", lparam => "void" },
211     WM_PAINT => {
212         id => 0, result => "void", wparam => "void", lparam => "void" },
213     WM_PASTE => {
214         id => 0x0302, result => "void", wparam => "void", lparam => "void" },
215     WM_POWER => {
216         id => 0, result => "void", wparam => "int", lparam => "void" },
217
218     WM_QUERYDRAGICON => {
219         id => 0, result => "HICON", wparam => "void", lparam => "void" },
220     WM_QUERYENDSESSION => {
221         id => 0, result => "BOOL", wparam => "void", lparam => "void" },
222     WM_QUERYNEWPALETTE => {
223         id => 0, result => "BOOL", wparam => "void", lparam => "void" },
224     WM_QUERYOPEN => {
225         id => 0, result => "BOOL", wparam => "void", lparam => "void" },
226     WM_QUIT => {
227         id => 0, result => "void", wparam => "WPARAM", lparam => "void" },
228
229     WM_RBUTTONDBLCLK => {
230         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
231     WM_RBUTTONDOWN => {
232         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
233     WM_RBUTTONUP => {
234         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
235
236     WM_SETCURSOR => {
237         id => 0x0020, result => "", wparam => "HWND", lparam => ["UINT", "UINT"] },
238     WM_SETFOCUS => {
239         id => 0, result => "void", wparam => "HWND", lparam => "void" },
240     WM_SETFONT => {
241         id => 0x0030, result => "void", wparam => "HFONT", lparam => "BOOL" },
242     WM_SETREDRAW => {
243         id => 0, result => "void", wparam => "BOOL", lparam => "void" },
244     WM_SETTEXT => {
245         id => 0, result => "void", wparam => "void", lparam => "LPCTSTR" },
246     WM_SHOWWINDOW => {
247         id => 0, result => "void", wparam => "BOOL", lparam => "UINT" },
248     WM_SIZE => {
249         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
250     WM_SPOOLERSTATUS => {
251         id => 0, result => "void", wparam => "WPARAM", lparam => ["", ""] },
252     WM_SYSCHAR => {
253         id => 0, result => "void", wparam => "TCHAR", lparam => ["", ""] },
254     WM_SYSCOLORCHANGE => {
255         id => 0, result => "void", wparam => "void", lparam => "void" },
256     WM_SYSDEADCHAR => {
257         id => 0, result => "void", wparam => "TCHAR", lparam => ["", ""] },
258     WM_SYSKEYDOWN => {
259         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
260     WM_SYSKEYUP => {
261         id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
262
263     WM_TIMECHANGE => {
264         id => 0, result => "void", wparam => "void", lparam => "void" },
265
266     WM_VKEYTOITEM => {
267         id => 0x002e, result => "void", wparam => ["UINT", "int"], lparam => "HWND" },
268     WM_VSCROLL => {
269         id => 0, result => "void", wparam => ["UINT", "int"], lparam => "HWND" },
270
271     WM_WINDOWPOSCHANGING => {
272         id => 0, result => "BOOL", wparam => "void", lparam => "LPWINDOWPOS" },
273     WM_WINDOWPOSCHANGED => {
274         id => 0, result => "void", wparam => "void", lparam => "LPARAM" },
275     WM_WININICHANGE => { 
276         id => 0, result => "void", wparam => "void", lparam => "LPCTSTR" }
277 };
278
279 ########################################################################
280 # _get_kind
281
282 sub _get_kind {
283     local $_ = shift;
284
285     if(!defined($_)) {
286         return undef;
287     } elsif(/^(?:HBRUSH|HDC|HFONT|HMENU|HRGN|HWND)$/ || /\*$/ ||
288             /^LP(?!ARAM)/)
289     {
290         return "ptr";
291     } else {
292         return "long";
293     }
294 }
295
296 ########################################################################
297 # get_message_result_type
298
299 sub get_message_result_type {
300     my $name = shift;
301     return $$message{$name}{result};
302 }
303
304 ########################################################################
305 # get_message_result_kind
306
307 sub get_message_result_kind {
308     return _get_kind(get_message_result_type(@_));
309 }
310
311 ########################################################################
312 # get_message_wparam_type
313
314 sub get_message_wparam_type {
315     my $name = shift;
316     return $$message{$name}{wparam};
317 }
318
319 ########################################################################
320 # get_message_wparam_kind
321
322 sub get_message_wparam_kind {
323     return _get_kind(get_message_wparam_type(@_));
324 }
325
326 ########################################################################
327 # get_message_lparam_type
328
329 sub get_message_lparam_type {
330     my $name = shift;
331     return $$message{$name}{lparam};
332 }
333
334 ########################################################################
335 # get_message_lparam_kind
336
337 sub get_message_lparam_kind {
338     return _get_kind(get_message_lparam_type(@_));
339 }
340
341 ########################################################################
342 # _parse_windowsx_h
343
344 sub _parse_windowsx_h {
345     my $file = "$wine_dir/include/windowsx.h";
346     {
347         open(IN, "< $file");
348         local $/ = undef;
349         $_ = <IN>;
350         close(IN);
351     }
352
353     my $parser = new c_parser($file);
354
355     my $found_preprocessor = sub {
356         my $begin_line = shift;
357         my $begin_column = shift;
358         local $_ = shift;
359
360         if(!s/^\#\s*define\s*// || !/^FORWARD_WM_/) {
361             return 1;
362         }
363         
364         my $msg;
365         if(s/^FORWARD_(\w+)\([^\)]*\)\s*(.*?)\s*$/$2/s) {
366             $msg = $1;
367         }
368
369         if($msg eq "WM_SYSTEMERROR") {
370             return 1;
371         }
372
373         my $return_type;
374         if(s/^\(\s*(\w+)\s*\)(?:\(\s*\w+\s*\))*\(\s*\w+\s*\)\(\s*(?:hwnd|\(hwnd\))\s*,\s*(.*?)\s*\)$/$2/) {
375             $return_type = $1;
376         } else {
377             die "$msg: '$_'";
378         }
379         
380         my @msgs = ();
381         if(s/^$msg\s*,\s*//) {
382             @msgs = $msg;
383         } elsif(s/^\(\w+\)\s*\?\s*(\w+)\s*:\s*(\w+)\s*,\s*//s) {
384             @msgs = ($1, $2);
385         } else {
386             die "$msg: '$_'";
387         }
388         
389         my $wparam;
390         if(s/^\(WPARAM\)(?:\(\s*(\w+)\s*\))*\((.*?)\)\s*,\s*//) {
391             if(defined($1)) {
392                 $wparam = $1;
393             } else {
394                 $wparam = "WPARAM";
395             }
396         } elsif(s/^MAKEWPARAM\(\s*(.*?)\s*,\s*(.*?)\s*\)\s*,\s*//) {
397             $wparam = "(,)"; # "($1, $2)";
398         } elsif(s/^\((.*?)\)$//) {
399             $wparam = "WPARAM";
400         } elsif(s/^0L\s*,\s*//) {
401             $wparam = "void";
402         } else {
403             die "$msg: '$_'";
404         } 
405
406         my $lparam;
407         if(s/^\(LPARAM\)(?:\(\s*(\w+)\s*\))*\((.*?)\)$//) {
408             if(defined($1)) {
409                 $lparam = $1;
410             } else {
411                 $lparam = "LPARAM";
412             }
413         } elsif(s/^MAKELPARAM\(\s*(.*?)\s*,\s*(.*?)\s*\)$//) {
414             $lparam = "(,)"; # "($1, $2)";
415         } elsif(s/^\((.*?)\)$//) {
416             $lparam = "LPARAM";
417         } elsif(s/^0L$//) {
418             $lparam = "void";
419         } else {
420             die "$msg: '$_'";
421         } 
422
423         foreach my $msg (@msgs) {
424             $output->write("$msg => { result => \"$return_type\", wparam => \"$wparam\", lparam => \"$lparam\" },\n");
425         }
426
427         return 1;
428     };
429
430     $parser->set_found_preprocessor_callback($found_preprocessor);
431
432     my $line = 1;
433     my $column = 0;
434
435     my $old_prefix = $output->prefix;
436     $output->progress("$file");
437     $output->prefix("$file: ");
438
439     if(!$parser->parse_c_file(\$_, \$line, \$column)) {
440         $output->write("can't parse file\n");
441     }
442
443     $output->prefix($old_prefix);
444 }
445