1999-09-23 17:14:20 +02:00
|
|
|
package nativeapi;
|
|
|
|
|
|
|
|
use strict;
|
|
|
|
|
|
|
|
sub new {
|
|
|
|
my $proto = shift;
|
|
|
|
my $class = ref($proto) || $proto;
|
|
|
|
my $self = {};
|
|
|
|
bless ($self, $class);
|
|
|
|
|
1999-10-31 03:08:38 +01:00
|
|
|
my $output = \${$self->{OUTPUT}};
|
1999-09-23 17:14:20 +02:00
|
|
|
my $functions = \%{$self->{FUNCTIONS}};
|
1999-10-24 23:45:39 +02:00
|
|
|
my $conditionals = \%{$self->{CONDITIONALS}};
|
|
|
|
my $conditional_headers = \%{$self->{CONDITIONAL_HEADERS}};
|
1999-10-31 03:08:38 +01:00
|
|
|
my $conditional_functions = \%{$self->{CONDITIONAL_FUNCTIONS}};
|
1999-09-23 17:14:20 +02:00
|
|
|
|
1999-10-31 03:08:38 +01:00
|
|
|
$$output = shift;
|
1999-10-24 23:45:39 +02:00
|
|
|
my $api_file = shift;
|
|
|
|
my $configure_in_file = shift;
|
|
|
|
my $config_h_in_file = shift;
|
1999-09-23 17:14:20 +02:00
|
|
|
|
1999-11-08 00:35:03 +01:00
|
|
|
$api_file =~ s/^\.\///;
|
|
|
|
$configure_in_file =~ s/^\.\///;
|
|
|
|
$config_h_in_file =~ s/^\.\///;
|
|
|
|
|
1999-10-31 03:08:38 +01:00
|
|
|
$$output->progress("$api_file");
|
|
|
|
|
1999-10-24 23:45:39 +02:00
|
|
|
open(IN, "< $api_file");
|
1999-09-23 17:14:20 +02:00
|
|
|
$/ = "\n";
|
|
|
|
while(<IN>) {
|
|
|
|
s/^\s*?(.*?)\s*$/$1/; # remove whitespace at begin and end of line
|
|
|
|
s/^(.*?)\s*#.*$/$1/; # remove comments
|
|
|
|
/^$/ && next; # skip empty lines
|
|
|
|
|
1999-10-24 23:45:39 +02:00
|
|
|
$$functions{$_}++;
|
|
|
|
}
|
|
|
|
close(IN);
|
|
|
|
|
1999-10-31 03:08:38 +01:00
|
|
|
$$output->progress("$configure_in_file");
|
|
|
|
|
1999-10-24 23:45:39 +02:00
|
|
|
my $again = 0;
|
1999-10-31 03:08:38 +01:00
|
|
|
open(IN, "< $configure_in_file");
|
1999-10-24 23:45:39 +02:00
|
|
|
local $/ = "\n";
|
|
|
|
while($again || (defined($_ = <IN>))) {
|
|
|
|
$again = 0;
|
|
|
|
chomp;
|
|
|
|
if(/(.*)\\$/) {
|
|
|
|
my $line = <IN>;
|
|
|
|
if(defined($line)) {
|
|
|
|
$_ = $1 . " " . $line;
|
|
|
|
$again = 1;
|
|
|
|
next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
# remove leading and trailing whitespace
|
|
|
|
s/^\s*(.*?)\s*$/$1/;
|
|
|
|
|
|
|
|
if(/^AC_CHECK_HEADERS\(\s*(.*?)\)\s*$/) {
|
|
|
|
my @arguments = split(/,/,$1);
|
1999-10-31 03:08:38 +01:00
|
|
|
foreach my $name (split(/\s+/, $arguments[0])) {
|
|
|
|
$$conditional_headers{$name}++;
|
|
|
|
}
|
|
|
|
} elsif(/^AC_CHECK_FUNCS\(\s*(.*?)\)\s*$/) {
|
|
|
|
my @arguments = split(/,/,$1);
|
|
|
|
foreach my $name (split(/\s+/, $arguments[0])) {
|
|
|
|
$$conditional_functions{$name}++;
|
1999-10-24 23:45:39 +02:00
|
|
|
}
|
|
|
|
} elsif(/^AC_FUNC_ALLOCA/) {
|
|
|
|
$$conditional_headers{"alloca.h"}++;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
close(IN);
|
|
|
|
|
1999-10-31 03:08:38 +01:00
|
|
|
$$output->progress("$config_h_in_file");
|
|
|
|
|
1999-10-24 23:45:39 +02:00
|
|
|
open(IN, "< $config_h_in_file");
|
|
|
|
local $/ = "\n";
|
|
|
|
while(<IN>) {
|
1999-10-31 03:08:38 +01:00
|
|
|
if(/^\#undef\s+(\S+)$/) {
|
1999-10-24 23:45:39 +02:00
|
|
|
$$conditionals{$1}++;
|
|
|
|
}
|
1999-09-23 17:14:20 +02:00
|
|
|
}
|
|
|
|
close(IN);
|
|
|
|
|
|
|
|
return $self;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub is_function {
|
|
|
|
my $self = shift;
|
|
|
|
my $functions = \%{$self->{FUNCTIONS}};
|
|
|
|
|
|
|
|
my $name = shift;
|
|
|
|
|
|
|
|
return $$functions{$name};
|
|
|
|
}
|
|
|
|
|
1999-10-24 23:45:39 +02:00
|
|
|
sub is_conditional {
|
|
|
|
my $self = shift;
|
|
|
|
my $conditionals = \%{$self->{CONDITIONALS}};
|
|
|
|
|
|
|
|
my $name = shift;
|
|
|
|
|
|
|
|
return $$conditionals{$name};
|
|
|
|
}
|
|
|
|
|
|
|
|
sub is_conditional_header {
|
|
|
|
my $self = shift;
|
|
|
|
my $conditional_headers = \%{$self->{CONDITIONAL_HEADERS}};
|
|
|
|
|
|
|
|
my $name = shift;
|
|
|
|
|
|
|
|
return $$conditional_headers{$name};
|
|
|
|
}
|
|
|
|
|
1999-10-31 03:08:38 +01:00
|
|
|
sub is_conditional_function {
|
|
|
|
my $self = shift;
|
|
|
|
my $conditional_functions = \%{$self->{CONDITIONAL_FUNCTIONS}};
|
|
|
|
|
|
|
|
my $name = shift;
|
|
|
|
|
|
|
|
return $$conditional_functions{$name};
|
|
|
|
}
|
|
|
|
|
1999-09-23 17:14:20 +02:00
|
|
|
1;
|