#!/usr/bin/perl

# RPM and it's source code are covered under two separate licenses. 

# The entire code base may be distributed under the terms of the GNU
# General Public License (GPL), which appears immediately below.
# Alternatively, all of the source code in the lib subdirectory of the
# RPM source code distribution as well as any code derived from that
# code may instead be distributed under the GNU Library General Public
# License (LGPL), at the choice of the distributor. The complete text
# of the LGPL appears at the bottom of this file.

# This alternatively is allowed to enable applications to be linked
# against the RPM library (commonly called librpm) without forcing
# such applications to be distributed under the GPL.

# Any questions regarding the licensing of RPM should be addressed to
# marc@redhat.com and ewt@redhat.com.


# sql.prov - a simple script to print the proper name for sql from
# both the sepecification and body files.


# by Ken Estes Mail.com kestes@staff.mail.com

if ("@ARGV") {
  foreach (@ARGV) {
    process_file($_);
  }
} else {

  # notice we are passed a list of filenames NOT as common in unix the
  # contents of the file.

  foreach (<>) {
    process_file($_);
  }
}



foreach $module (sort keys %require) {
  print "sql($module)\n";
}

exit 0;



sub process_file {

  my ($filename) = @_;
  chomp $filename;
  
  open(FILE, "<$filename")||
    die("$0: Could not open file: '$filename' : $!\n");

  my ($package, $version) = ();

  my (@file) = <FILE>;
  
  my ($file) = "@file";

  close(FILE)||
    die("$0: Could not close file: '$file' : $!\n");

  # skip the comments

  $file =~ s!/\*(.*?)\*/!!gs;
  $file =~ s!\s*--(.*?)\n!\n!gm;

  @file = split(/\n/, $file);

  foreach (@file) {

    # remove strings

    s!\'[^\']*\'!!g;


    # not everyone puts the package name of the file as the first
    # package name so we report all namespaces as if they were
    # provided packages (really ugly).

    if (m/\bpackage\s+(body\s*)?(\S+)\s+[ia]s/i) {
      $package=$2;
      $package=lc($package);
      $require{$package}=1;
    }

    if (m/((procedure)|(function))\s+(\S+)\s*\(/i) {
      my $func = $4;
      $func = lc($func);
      if ($package) {
	$require{"$package.$func"}=1;
      } else {
	$require{$func}=1;
      }
    }

    # Each keyword can appear multiple times.  Don't
    #  bother with datastructures to store these strings,
    #  if we need to print it print it now.
	
    if ( m/^\s*\$RPM_Provides\s*:=\s*["'](.*)['"]/i) {
      foreach $_ (spit(/\s+/, $1)) {
        print "$_\n";
      }
    }

  }

  return ;
}
