1 package winapi_function;
6 use util qw(&normalize_set);
7 use winapi qw($win16api $win32api @winapis);
9 ########################################################################
15 my $class = ref($proto) || $proto;
17 bless ($self, $class);
22 ########################################################################
28 my $internal_name = $self->internal_name;
30 return $win16api->function_external_name($internal_name);
33 sub external_names16 {
35 my $external_name16 = $self->external_name16;
37 if(defined($external_name16)) {
38 return split(/\s*&\s*/, $external_name16);
46 my $internal_name = $self->internal_name;
48 return $win32api->function_external_name($internal_name);
51 sub external_names32 {
53 my $external_name32 = $self->external_name32;
55 if(defined($external_name32)) {
56 return split(/\s*&\s*/, $external_name32);
66 push @external_names, $self->external_names16;
67 push @external_names, $self->external_names32;
69 return @external_names;
74 my $internal_name = $self->internal_name;
76 return $win16api->function_internal_module($internal_name);
81 my $module16 = $self->module16;
83 if(defined($module16)) {
84 return split(/\s*&\s*/, $module16);
92 my $internal_name = $self->internal_name;
94 return $win32api->function_internal_module($internal_name);
99 my $module32 = $self->module32;
101 if(defined($module32)) {
102 return split(/\s*&\s*/, $module32);
110 my $module16 = $self->module16;
111 my $module32 = $self->module32;
114 if(defined($module16) && defined($module32)) {
115 $module = "$module16 & $module32";
116 } elsif(defined($module16)) {
118 } elsif(defined($module32)) {
129 push @modules, $self->modules16;
130 push @modules, $self->modules32;
137 my $module16 = $self->module16;
138 my $module32 = $self->module32;
140 my $return_type = $self->return_type;
141 my $internal_name = $self->internal_name;
142 my $calling_convention = $self->calling_convention;
143 my @argument_types = @{$self->argument_types};
145 if($#argument_types < 0) {
146 @argument_types = ("void");
150 if(defined($module16) && !defined($module32)) {
151 $prefix .= normalize_set($module16) . ": ";
152 } elsif(!defined($module16) && defined($module32)) {
153 $prefix .= normalize_set($module32) . ": ";
154 } elsif(defined($module16) && defined($module32)) {
155 $prefix .= normalize_set($module16) . " & " . normalize_set($module32) . ": ";
159 $prefix .= "$return_type ";
160 $prefix .= "$calling_convention " if $calling_convention;
161 $prefix .= "$internal_name(" . join(",", @argument_types) . "): ";
166 sub calling_convention16 {
168 my $return_kind16 = $self->return_kind16;
171 if(!defined($return_kind16)) {
173 } elsif($return_kind16 =~ /^(?:void|s_word|word)$/) {
175 } elsif($return_kind16 =~ /^(?:long|ptr|segptr|segstr|str|wstr)$/) {
181 local $_ = $self->calling_convention;
184 } elsif(/^VFWAPIV|WINAPIV$/) {
185 if(!defined($suffix)) { return undef; }
186 return "pascal$suffix"; # FIXME: Is this correct?
187 } elsif(/^__stdcall|VFWAPI|WINAPI|CALLBACK$/) {
188 if(!defined($suffix)) { return undef; }
189 return "pascal$suffix";
197 sub calling_convention32 {
200 local $_ = $self->calling_convention;
203 } elsif(/^VFWAPIV|WINAPIV$/) {
205 } elsif(/^__stdcall|VFWAPI|WINAPI|CALLBACK$/) {
214 sub get_all_module_ordinal16 {
216 my $internal_name = $self->internal_name;
218 return winapi::get_all_module_internal_ordinal16($internal_name);
221 sub get_all_module_ordinal32 {
223 my $internal_name = $self->internal_name;
225 return winapi::get_all_module_internal_ordinal32($internal_name);
228 sub get_all_module_ordinal {
230 my $internal_name = $self->internal_name;
232 return winapi::get_all_module_internal_ordinal($internal_name);
238 my $return_type = $self->return_type;
240 return $winapi->translate_argument($return_type);
244 my $self = shift; return $self->_return_kind($win16api, @_);
248 my $self = shift; return $self->_return_kind($win32api, @_);
251 sub _argument_kinds {
254 my @argument_types = @{$self->argument_types};
257 foreach my $argument_type (@argument_types) {
258 my $argument_kind = $winapi->translate_argument($argument_type);
260 if(defined($argument_kind) && $argument_kind eq "longlong") {
261 push @argument_kinds, ("long", "long");
263 push @argument_kinds, $argument_kind;
267 return [@argument_kinds];
270 sub argument_kinds16 {
271 my $self = shift; return $self->_argument_kinds($win16api, @_);
274 sub argument_kinds32 {
275 my $self = shift; return $self->_argument_kinds($win32api, @_);
278 ##############################################################################
282 sub function_called {
284 my $called_function_names = \%{$self->{CALLED_FUNCTION_NAMES}};
288 $$called_function_names{$name}++;
291 sub function_called_by {
293 my $called_by_function_names = \%{$self->{CALLED_BY_FUNCTION_NAMES}};
297 $$called_by_function_names{$name}++;
300 sub called_function_names {
302 my $called_function_names = \%{$self->{CALLED_FUNCTION_NAMES}};
304 return sort(keys(%$called_function_names));
307 sub called_by_function_names {
309 my $called_by_function_names = \%{$self->{CALLED_BY_FUNCTION_NAMES}};
311 return sort(keys(%$called_by_function_names));