Scanner::Swig - makepp scanner for SWIG's .i files


makepp documentation Contained in the makepp distribution.

Index


Code Index:

NAME

Top

Scanner::Swig - makepp scanner for SWIG's .i files

DESCRIPTION

Top

Scans a .i file for additional dependencies. The only thing of interest is the %include directive and #include directives if -includeall is specified on the swigcommand line.


makepp documentation Contained in the makepp distribution.

use strict;
use Scanner::C;
package Scanner::Swig;

use Scanner;
our @ISA = qw/Scanner::C/;

#
# Override Scanner::C::get_directive.  We need to do the following:
# 1) Ignore everything between %{ and %}.  We
# 2) Ignore #include unless -includeall is present.
# 3) Handle swig's additional directives.
#
# However, we want to use the rest of xscan_file's mechanism to
# handle preprocessing directives.
#
sub get_directive {
  my $self = $_[0];
  if ($self->{IN_VERBATIM_BLOCK}) {
    if (s/^\s*\%\}\s*//) {      # End of verbatim block?
      $self->{IN_VERBATIM_BLOCK} = 0;
    }

    return undef;               # Don't let xscan_file process anything in a
                                # verbatim block.
  }

  if (s/^\s*\%\{//) {           # Start of verbatim block?
    $self->{IN_VERBATIM_BLOCK} = 1;
    return;
  }

  if(s/^\s*\#\s*(\w+)\s*//) {   # Ordinary C preprocessing statement?
    if ($1 eq 'include' &&
        !$self->{INCLUDEALL}) {
      return undef;             # Don't let xscan_file process #include
                                # statements unless -includeall was specified
                                # on the command line.
    }
    return $1;                  # Return the directive.
  }
  elsif (s/^\s*\%\s*(\w+)\s*//) { # Swig preprocessing statement?
    return "%$1";
  }
  return;
}

#
# Overrides Scanner::C:other_directive.
# Return 0 if not interested, or undef to abort.
# This handles %include, %import, and magic around #include.
# Everything else gets handled by Scanner::C:xscan_file.
#
sub other_directive {
  my ($self, $cp, $finfo, $conditional, $directive) = @_;

  if ($directive eq '%include' || $directive eq '%import' ||
      ($directive eq 'include' && $self->{INCLUDEALL})) {
    # Copied from xscan_file's handling for #include:
    $_ = $self->expand_macros($_) if $conditional;
    if(s/^\<([^>]*)\>//) {
      local $_; # Preserve $_ for later
      $self->include($cp, 'sys', $1, $finfo)
        or return undef;
    }
    elsif(s/^\"([^"]*)\"// ||
          s/(\S+)//) {          # Swig doesn't actually require quotes at all.
      local $_; # Preserve $_ for later
      $self->include($cp, 'user', $1, $finfo)
        or return undef;
    }
    return 1;                   # We handled this directive.
  }

  return 0;                     # Let xscan_file handle this directive.
}

1;