- Fixed the long long problem.
- Added configure include consistancy checking.
- Added progress indicator.
- Began splitting up the win16api.dat and win32api.dat files.
- Added various minor checks.
- Minor fixes.
diff --git a/tools/winapi_check/preprocessor.pm b/tools/winapi_check/preprocessor.pm
new file mode 100644
index 0000000..dd9fbd4
--- /dev/null
+++ b/tools/winapi_check/preprocessor.pm
@@ -0,0 +1,175 @@
+package preprocessor;
+
+use strict;
+
+sub new {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = {};
+ bless ($self, $class);
+
+ my $state = \%{$self->{STATE}};
+ my $stack = \@{$self->{STACK}};
+ my $include_found = \${$self->{INCLUDE_FOUND}};
+ my $conditional_found = \${$self->{CONDITIONAL_FOUND}};
+
+ $$include_found = shift;
+ $$conditional_found = shift;
+
+ return $self;
+}
+
+sub include {
+ my $self = shift;
+ my $include_found = \${$self->{INCLUDE_FOUND}};
+
+ my $argument = shift;
+
+ &$$include_found($argument);
+}
+
+sub define {
+ my $self = shift;
+ my $state = \%{$self->{STATE}};
+ my $conditional_found = \${$self->{CONDITIONAL_FOUND}};
+
+ my $name = shift;
+
+ $$state{$name} = "def";
+
+ &$$conditional_found($name);
+}
+
+sub undefine {
+ my $self = shift;
+ my $state = \%{$self->{STATE}};
+ my $conditional_found = \${$self->{CONDITIONAL_FOUND}};
+
+ my $name = shift;
+
+ $$state{$name} = "undef";
+
+ &$$conditional_found($name);
+}
+
+sub begin_if {
+ my $self = shift;
+ my $state = \%{$self->{STATE}};
+ my $stack = \@{$self->{STACK}};
+
+ my $directive = shift;
+ local $_ = shift;
+
+ while(!/^$/) {
+ if(/^0\s*\&\&/) {
+ $_ = "0";
+ } elsif(/^1\s*\|\|/) {
+ $_ = "1";
+ }
+
+ if(/^(!)?defined\s*\(\s*(.+?)\s*\)\s*((\&\&|\|\|)\s*)?/){
+ $_ = $';
+ if(defined($1) && $1 eq "!") {
+ $self->undefine($2);
+ push @$stack, $2;
+ } else {
+ $self->define($2);
+ push @$stack, $2;
+ }
+ } elsif(/^(\w+)\s*(<|<=|==|!=|>=|>)\s*(\w+)\s*((\&\&|\|\|)\s*)?/) {
+ $_ = $';
+ } elsif(/^(\w+)\s*$/) {
+ $_ = $';
+ } elsif(/^\(|\)/) {
+ $_ = $';
+ } else {
+ print "*** Can't parse '#$directive $_' ***\n";
+ $_ = "";
+ }
+ }
+}
+
+sub else_if {
+ my $self = shift;
+ my $state = \%{$self->{STATE}};
+ my $stack = \@{$self->{STACK}};
+
+ my $argument = shift;
+
+ $self->end_if;
+
+ if(defined($argument)) {
+ $self->begin_if("elif", $argument);
+ }
+}
+
+sub end_if {
+ my $self = shift;
+ my $state = \%{$self->{STATE}};
+ my $stack = \@{$self->{STACK}};
+
+ my $macro = pop @$stack;
+ delete $$state{$macro} if defined($macro);
+}
+
+sub directive {
+ my $self = shift;
+ my $state = \%{$self->{STATE}};
+ my $stack = \@{$self->{STACK}};
+
+ my $directive = shift;
+ my $argument = shift;
+
+ local $_ = $directive;
+ if(/^if$/) {
+ $self->begin_if("if",$argument);
+ } elsif(/^ifdef$/) {
+ $self->begin_if("if", "defined($argument)");
+ } elsif(/^ifndef$/) {
+ $self->begin_if("if", "!defined($argument)");
+ push @$stack, $argument;
+ } elsif(/^elif$/) {
+ $self->else_if($argument);
+ } elsif(/^else$/) {
+ $self->else_if;
+ } elsif(/^endif$/) {
+ $self->end_if;
+ } elsif(/^include/) {
+ $self->include($argument);
+ }
+}
+
+sub is_def {
+ my $self = shift;
+ my $state = \%{$self->{STATE}};
+
+ my $name = shift;
+
+ my $status = $$state{$name};
+
+ return defined($status) && $status eq "def";
+}
+
+sub is_undef {
+ my $self = shift;
+ my $state = \%{$self->{STATE}};
+
+ my $name = shift;
+
+ my $status = $$state{$name};
+
+ return defined($status) && $status eq "undef";
+}
+
+sub is_unknown {
+ my $self = shift;
+ my $state = \%{$self->{STATE}};
+
+ my $name = shift;
+
+ my $status = $$state{$name};
+
+ return !defined($status);
+}
+
+1;