From db426d18a3f337f699540943e0be1dabcaddd001 Mon Sep 17 00:00:00 2001 Message-Id: From: =?UTF-8?q?J=C3=A1n=20Tomko?= Date: Tue, 28 Jun 2016 12:37:50 +0200 Subject: [PATCH] hvsupport: Introduce parseSymsFile The code for parsing the different public syms files only differs in the filenames and version prefix. Unify it to a single subroutine. (cherry picked from commit fa0b00f94e5173fc1c609e661d74ad9f2f81126c) https://bugzilla.redhat.com/show_bug.cgi?id=1286679 Signed-off-by: Jiri Denemark --- docs/hvsupport.pl | 178 +++++++++++++++++------------------------------------- 1 file changed, 55 insertions(+), 123 deletions(-) diff --git a/docs/hvsupport.pl b/docs/hvsupport.pl index 44a30ce..7a6f1ac 100755 --- a/docs/hvsupport.pl +++ b/docs/hvsupport.pl @@ -44,136 +44,66 @@ find({ push @srcs, $_ if $_ !~ /vbox_driver\.c/; } }, no_chdir => 1}, $srcdir); -my $line; -# Get the list of all public APIs and their corresponding version +sub parseSymsFile { + my $apisref = shift; + my $prefix = shift; + my $filename = shift; + my $xmlfilename = shift; + + my $line; + my $vers; + my $prevvers; + + my $apixpath = XML::XPath->new(filename => $xmlfilename); + + open FILE, "<$filename" + or die "cannot read $filename: $!"; + + while (defined($line = )) { + chomp $line; + next if $line =~ /^\s*#/; + next if $line =~ /^\s*$/; + next if $line =~ /^\s*(global|local):/; + if ($line =~ /^\s*${prefix}_(\d+\.\d+\.\d+)\s*{\s*$/) { + if (defined $vers) { + die "malformed syms file"; + } + $vers = $1; + } elsif ($line =~ /\s*}\s*;\s*$/) { + if (defined $prevvers) { + die "malformed syms file"; + } + $prevvers = $vers; + $vers = undef; + } elsif ($line =~ /\s*}\s*${prefix}_(\d+\.\d+\.\d+)\s*;\s*$/) { + if ($1 ne $prevvers) { + die "malformed syms file $1 != $vers"; + } + $prevvers = $vers; + $vers = undef; + } elsif ($line =~ /\s*(\w+)\s*;\s*$/) { + my $file = $apixpath->find("/api/symbols/function[\@name='$1']/\@file"); + $$apisref{$1} = {}; + $$apisref{$1}->{vers} = $vers; + $$apisref{$1}->{file} = $file; + } else { + die "unexpected data $line\n"; + } + } + + close FILE; +} my %apis; -open FILE, "<$symslibvirt" - or die "cannot read $symslibvirt: $!"; - -my $vers; -my $prevvers; -my $apixpath = XML::XPath->new(filename => "$srcdir/../docs/libvirt-api.xml"); -while (defined($line = )) { - chomp $line; - next if $line =~ /^\s*#/; - next if $line =~ /^\s*$/; - next if $line =~ /^\s*(global|local):/; - if ($line =~ /^\s*LIBVIRT_(\d+\.\d+\.\d+)\s*{\s*$/) { - if (defined $vers) { - die "malformed syms file"; - } - $vers = $1; - } elsif ($line =~ /\s*}\s*;\s*$/) { - if (defined $prevvers) { - die "malformed syms file"; - } - $prevvers = $vers; - $vers = undef; - } elsif ($line =~ /\s*}\s*LIBVIRT_(\d+\.\d+\.\d+)\s*;\s*$/) { - if ($1 ne $prevvers) { - die "malformed syms file $1 != $vers"; - } - $prevvers = $vers; - $vers = undef; - } elsif ($line =~ /\s*(\w+)\s*;\s*$/) { - my $file = $apixpath->find("/api/symbols/function[\@name='$1']/\@file"); - $apis{$1} = {}; - $apis{$1}->{vers} = $vers; - $apis{$1}->{file} = $file; - } else { - die "unexpected data $line\n"; - } -} - -close FILE; - +# Get the list of all public APIs and their corresponding version +parseSymsFile(\%apis, "LIBVIRT", $symslibvirt, "$srcdir/../docs/libvirt-api.xml"); # And the same for the QEMU specific APIs - -open FILE, "<$symsqemu" - or die "cannot read $symsqemu: $!"; - -$prevvers = undef; -$vers = undef; -$apixpath = XML::XPath->new(filename => "$srcdir/../docs/libvirt-qemu-api.xml"); -while (defined($line = )) { - chomp $line; - next if $line =~ /^\s*#/; - next if $line =~ /^\s*$/; - next if $line =~ /^\s*(global|local):/; - if ($line =~ /^\s*LIBVIRT_QEMU_(\d+\.\d+\.\d+)\s*{\s*$/) { - if (defined $vers) { - die "malformed syms file"; - } - $vers = $1; - } elsif ($line =~ /\s*}\s*;\s*$/) { - if (defined $prevvers) { - die "malformed syms file"; - } - $prevvers = $vers; - $vers = undef; - } elsif ($line =~ /\s*}\s*LIBVIRT_QEMU_(\d+\.\d+\.\d+)\s*;\s*$/) { - if ($1 ne $prevvers) { - die "malformed syms file $1 != $vers"; - } - $prevvers = $vers; - $vers = undef; - } elsif ($line =~ /\s*(\w+)\s*;\s*$/) { - my $file = $apixpath->find("/api/symbols/function[\@name='$1']/\@file"); - $apis{$1} = {}; - $apis{$1}->{vers} = $vers; - $apis{$1}->{file} = $file; - } else { - die "unexpected data $line\n"; - } -} - -close FILE; - +parseSymsFile(\%apis, "LIBVIRT_QEMU", $symsqemu, "$srcdir/../docs/libvirt-qemu-api.xml"); # And the same for the LXC specific APIs - -open FILE, "<$symslxc" - or die "cannot read $symslxc: $!"; - -$prevvers = undef; -$vers = undef; -$apixpath = XML::XPath->new(filename => "$srcdir/../docs/libvirt-lxc-api.xml"); -while (defined($line = )) { - chomp $line; - next if $line =~ /^\s*#/; - next if $line =~ /^\s*$/; - next if $line =~ /^\s*(global|local):/; - if ($line =~ /^\s*LIBVIRT_LXC_(\d+\.\d+\.\d+)\s*{\s*$/) { - if (defined $vers) { - die "malformed syms file"; - } - $vers = $1; - } elsif ($line =~ /\s*}\s*;\s*$/) { - if (defined $prevvers) { - die "malformed syms file"; - } - $prevvers = $vers; - $vers = undef; - } elsif ($line =~ /\s*}\s*LIBVIRT_LXC_(\d+\.\d+\.\d+)\s*;\s*$/) { - if ($1 ne $prevvers) { - die "malformed syms file $1 != $vers"; - } - $prevvers = $vers; - $vers = undef; - } elsif ($line =~ /\s*(\w+)\s*;\s*$/) { - my $file = $apixpath->find("/api/symbols/function[\@name='$1']/\@file"); - $apis{$1} = {}; - $apis{$1}->{vers} = $vers; - $apis{$1}->{file} = $file; - } else { - die "unexpected data $line\n"; - } -} - -close FILE; +parseSymsFile(\%apis, "LIBVIRT_LXC", $symslxc, "$srcdir/../docs/libvirt-lxc-api.xml"); # Some special things which aren't public APIs, @@ -206,6 +136,8 @@ $apis{virDomainMigrateConfirm3Params}->{vers} = "1.1.0"; # and driver struct fields. This lets us later match # update the driver impls with the public APis. +my $line; + # Group name -> hash of APIs { fields -> api name } my %groups; my $ingrp; -- 2.9.2