cvsuser     04/11/07 09:23:52

  Modified:    .        MANIFEST
  Added:       tools/dev parrot_api.pl
  Log:
  A new toy for Dan.
  
  Revision  Changes    Path
  1.765     +1 -0      parrot/MANIFEST
  
  Index: MANIFEST
  ===================================================================
  RCS file: /cvs/public/parrot/MANIFEST,v
  retrieving revision 1.764
  retrieving revision 1.765
  diff -u -r1.764 -r1.765
  --- MANIFEST  4 Nov 2004 18:01:22 -0000       1.764
  +++ MANIFEST  7 Nov 2004 17:23:50 -0000       1.765
  @@ -2885,6 +2885,7 @@
   tools/dev/mk_native_pbc                           [devel]
   tools/dev/nm.pl                                   [devel]
   tools/dev/parrot.supp                             [devel]
  +tools/dev/parrot_api.pl                           [devel]
   tools/dev/parrot_coverage.pl                      [devel]
   tools/dev/parrotbench.pl                          [devel]
   tools/dev/pbc_header.pl                           [devel]
  
  
  
  1.1                  parrot/tools/dev/parrot_api.pl
  
  Index: parrot_api.pl
  ===================================================================
  #!/usr/bin/perl -w
  # Copyright: 2004 The Perl Foundation.  All Rights Reserved.
  # $Id: parrot_api.pl,v 1.1 2004/11/07 17:23:52 jhi Exp $
  
  use strict;
  
  my $Obj;
  
  $Obj = shift(@ARGV) unless defined $Obj;
  $Obj = 'blib/lib/libparrot.a' unless defined $Obj;
  die "$0: '$Obj': No such file\n" unless -f $Obj;
  
  my %ParrotAPI;
  
  $| = 1;
  
  my $H = "include/parrot/embed.h";
  if (open(H, $H)) {
      while (<H>) {
        if (/^\w+\s+(Parrot_\w+)/) {
            $ParrotAPI{$1}++;
        }
      }
      close(H);
  } else {
      die "$0: Header '$H': $!\n";
  }
  
  die "$0: No API found in '$H'\n" unless keys %ParrotAPI;
  
  printf "$H: %d interfaces\n", scalar keys %ParrotAPI;
  
  my %Code;
  my %DataB;
  my %DataD;
  my %DataR;
  my %Undef;
  my %API;
  
  print "$Obj: ";
  if (open(NM, "perl tools/dev/nm.pl -BDo '$Obj' |")) {
      while (<NM>) {
        my ($o, $s, $v) = split;
        $API{$s} = $o;
        if ($v eq 'T') {
            $Code{$s} = $o;
        } elsif ($v =~ /[BDR]/) {
            if ($v eq 'B') {
                $DataB{$s} = $o;
            } elsif ($v eq 'D') {
                $DataD{$s} = $o;
            } elsif ($v eq 'R') {
                $DataR{$s} = $o;
            }
        } elsif ($v eq 'U') {
            $Undef{$s} = $o;
        }
      }
      close(NM);
  } else {
      die "$0: nm.pl -Bgo '$Obj': $!\n";
  }
  for my $api (keys %API) {
      delete $API{$api} unless exists $Code{$api}; # Not ours.
  }
  printf "%d interfaces\n", scalar keys %API;
  
  my @API = sort keys %API;
  
  my @NoParrotAPI = grep { !exists $API{$_} } sort keys %ParrotAPI;
  my @NoParrotPrefix;
  my @UnParrotAPI;
  
  for my $api (@API) {
      unless ($api =~ /^Parrot_/) {
        push @NoParrotPrefix, $api;
      }
      unless (exists $ParrotAPI{$api}) {
        push @UnParrotAPI, $api;
      }
  }
  
  if (@NoParrotAPI) {
      printf "=== Missing Parrot API: %d ===\n", scalar @NoParrotAPI;
      for my $api (@NoParrotAPI) {
        printf "%s\n", $api;
      }
  }
  
  if (@NoParrotPrefix) {
      printf "=== No Parrot prefix: %d ===\n", scalar @NoParrotPrefix;
      for my $api (@NoParrotPrefix) {
        printf "%s\t%s\n", $api, $API{$api};
      }
  }
  
  if (@UnParrotAPI) {
      printf "=== No Parrot API: %d ===\n", scalar @UnParrotAPI;
      for my $api (@UnParrotAPI) {
        printf "%s\t%s\n", $api, $API{$api};
      }
  }
  
  if (keys %DataB) {
      printf "=== Uninitialized Modifiable Data: %d ===\n", scalar keys %DataB;
      for my $api (sort keys %DataB) {
        printf "%s\t%s\n", $api, $DataB{$api};
      }
  }
  
  if (keys %DataD) {
      printf "=== Initialized Modifiable Data: %d ===\n", scalar keys %DataD;
      for my $api (sort keys %DataD) {
        printf "%s\t%s\n", $api, $DataD{$api};
      }
  }
  
  exit(0);
  
  
  

Reply via email to