[libvirt] [PATCH 2/4] hvsupport: drop XML::XPath

Ján Tomko jtomko at redhat.com
Wed Jun 29 06:40:16 UTC 2016


Doing an XPath query for every single 'function' element in the
file is inefficient.

Since the XML file is generated by another of our build scripts
(apibuild.py, using Python's standard 'output.write' XML library),
just find the function name->file mapping by a regex upfront.
---
 bootstrap.conf    |  1 -
 docs/hvsupport.pl | 30 +++++++++++++++++++++++++-----
 2 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/bootstrap.conf b/bootstrap.conf
index 0db6b62..c7263f4 100644
--- a/bootstrap.conf
+++ b/bootstrap.conf
@@ -208,7 +208,6 @@ gzip       -
 libtool    -
 patch      -
 perl       5.5
-perl::XML::XPath -
 pkg-config -
 rpcgen     -
 tar        -
diff --git a/docs/hvsupport.pl b/docs/hvsupport.pl
index 7a6f1ac..80a6f80 100755
--- a/docs/hvsupport.pl
+++ b/docs/hvsupport.pl
@@ -4,8 +4,6 @@ use strict;
 use warnings;
 
 use File::Find;
-use XML::XPath;
-use XML::XPath::XMLParser;
 
 die "syntax: $0 SRCDIR\n" unless int(@ARGV) == 1;
 
@@ -45,6 +43,29 @@ find({
         }
     }, no_chdir => 1}, $srcdir);
 
+sub parseAPIXML {
+    my $xmlfilename = shift;
+
+    my %files;
+    my $line;
+
+    open FILE, "<", $xmlfilename or die "cannot read $xmlfilename: $!";
+
+    while (defined($line = <FILE>)) {
+        chomp $line;
+        if ($line =~ /function name='([^']+)' file='([^']+)'/) {
+            $files{$1} = $2;
+        }
+    }
+
+    close FILE;
+
+    if (keys %files == 0) {
+        die "No functions found in $xmlfilename. Has the apibuild.py output changed?";
+    }
+    return \%files;
+}
+
 sub parseSymsFile {
     my $apisref = shift;
     my $prefix = shift;
@@ -55,7 +76,7 @@ sub parseSymsFile {
     my $vers;
     my $prevvers;
 
-    my $apixpath = XML::XPath->new(filename => $xmlfilename);
+    my $filenames = parseAPIXML($xmlfilename);
 
     open FILE, "<$filename"
         or die "cannot read $filename: $!";
@@ -83,10 +104,9 @@ sub parseSymsFile {
             $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;
+            $$apisref{$1}->{file} = $$filenames{$1};
         } else {
             die "unexpected data $line\n";
         }
-- 
2.7.3




More information about the libvir-list mailing list