Blob Blame History Raw
From 9c4286543a884891a4abcf448d07927fbbc7b9e4 Mon Sep 17 00:00:00 2001
Message-Id: <9c4286543a884891a4abcf448d07927fbbc7b9e4@dist-git>
From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com>
Date: Tue, 28 Jun 2016 13:28:48 +0200
Subject: [PATCH] hvsupport: use a regex instead of XML::XPath

When generating the hvsupport.html.in file, we parse the -api.xml
files generated by apibuild.py to know in which HTML file the API
function is.

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.

Also add a note about this next to the line that generates it
in apibuild.py and do not check if XML::XPath is installed in
bootstrap since we no longer use it.

(cherry picked from commit ad9e72f5fa118d97abe60a0ea6e5dba195476fc7)

https://bugzilla.redhat.com/show_bug.cgi?id=1286679
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
---
 bootstrap.conf    |  1 -
 docs/apibuild.py  |  1 +
 docs/hvsupport.pl | 33 ++++++++++++++++++++++++++++-----
 3 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/docs/apibuild.py b/docs/apibuild.py
index f5216ea..8728b27 100755
--- a/docs/apibuild.py
+++ b/docs/apibuild.py
@@ -2267,6 +2267,7 @@ class docBuilder:
         if name == debugsym and not quiet:
             print "=>", id
 
+        # NB: this is consumed by a regex in 'getAPIFilenames' in hvsupport.pl
         output.write("    <%s name='%s' file='%s' module='%s'>\n" % (id.type,
                      name, self.modulename_file(id.header),
                      self.modulename_file(id.module)))
diff --git a/docs/hvsupport.pl b/docs/hvsupport.pl
index 7a6f1ac..7dd7c3f 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,32 @@ find({
         }
     }, no_chdir => 1}, $srcdir);
 
+# Map API functions to the header and documentation files they're in
+# so that we can generate proper hyperlinks to their documentation.
+#
+# The function names are grep'd from the XML output of apibuild.py.
+sub getAPIFilenames {
+    my $filename = shift;
+
+    my %files;
+    my $line;
+
+    open FILE, "<", $filename or die "cannot read $filename: $!";
+
+    while (defined($line = <FILE>)) {
+        if ($line =~ /function name='([^']+)' file='([^']+)'/) {
+            $files{$1} = $2;
+        }
+    }
+
+    close FILE;
+
+    if (keys %files == 0) {
+        die "No functions found in $filename. Has the apibuild.py output changed?";
+    }
+    return \%files;
+}
+
 sub parseSymsFile {
     my $apisref = shift;
     my $prefix = shift;
@@ -55,7 +79,7 @@ sub parseSymsFile {
     my $vers;
     my $prevvers;
 
-    my $apixpath = XML::XPath->new(filename => $xmlfilename);
+    my $filenames = getAPIFilenames($xmlfilename);
 
     open FILE, "<$filename"
         or die "cannot read $filename: $!";
@@ -83,10 +107,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.9.2