bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

speed up MODULES.html.sh a bit


From: Ralf Wildenhues
Subject: speed up MODULES.html.sh a bit
Date: Tue, 14 Nov 2006 20:54:50 +0100
User-agent: Mutt/1.5.13 (2006-08-11)

Hello Bruno, all,

The patch below shaves a couple of minutes off of MODULES.html.sh's
roughly 5 minutes worth of execution time.   Half of that is achieved
by not calling gnulib-tool more often than necessary, the other by
eliminating a couple of quadratic file list handlings.

As shown, the script will now use temporary files in the current
directory.  Should I rather rewrite to use func_tmpdir and a trap
for cleanup, similar to what happens in gnulib-tool?

Otherwise, OK to apply?

Cheers,
Ralf

2006-11-14  Ralf Wildenhues  <address@hidden>

        * MODULES.html.sh (seen_modules, seen_files): New variables.
        (func_module): Rewrite to use a few less gnulib-tool and sed
        invocations.  Avoid a couple of quadratic algorithms for ...
        (missed_modules, missed_files): ... these, with ...
        (func_append): ... this new function, from gnulib-tool.

--- MODULES.html.sh     2006-11-14 19:20:55.000000000 +0100
+++ MODULES.html.sh     2006-11-14 20:50:14.000000000 +0100
@@ -1243,8 +1243,24 @@
 ' | sed -e "$sed_alt1" | tr -d "$trnl" | sed -e "$sed_alt2" -e "$sed_alt3"`
 
 indent=""
-missed_modules=`gnulib-tool --list`
-missed_files=`ls -d lib/* m4/* | sed -e /CVS/d -e /README/d -e /ChangeLog/d -e 
/Makefile/d -e /TODO/d -e '/~$/d'`
+seen_modules=
+seen_files=
+
+# func_append var value
+# appends the given value to the shell variable var.
+if ( foo=bar; foo+=baz && test "$foo" = barbaz ) >/dev/null 2>&1; then
+  # Use bash's += operator. It reduces complexity of appending repeatedly to
+  # a single variable from O(n^2) to O(n).
+  func_append ()
+  {
+    eval "$1+=\"\$2\""
+  }
+else
+  func_append ()
+  {
+    eval "$1=\"\$$1\$2\""
+  }
+fi
 
 # func_echo line
 # outputs line with indentation.
@@ -1339,9 +1355,9 @@
 
     element=`gnulib-tool --extract-description $1 \
              | sed -e "$sed_lt" -e "$sed_gt" -e 
"$sed_remove_trailing_empty_line" \
-             | sed -e 's,^, ,' \
-             | sed -e 's,\([^a-zA-Z]\)'"${posix_functions}"'(),\1<A 
HREF="'"$POSIX2001_URL"'xsh/\2.html">\2</A>(),g' \
-             | sed -e 's,^ ,,'`
+                   -e 's,^, ,' \
+                   -e 's,\([^a-zA-Z]\)'"${posix_functions}"'(),\1<A 
HREF="'"$POSIX2001_URL"'xsh/\2.html">\2</A>(),g' \
+                   -e 's,^ ,,'`
     func_echo "<TD ALIGN=LEFT VALIGN=TOP WIDTH=\"80%\">$element"
 
     func_end TR
@@ -1353,34 +1369,36 @@
     element='<A NAME="module='$1'"></A><A HREF="modules/'$1'">'$1'</A>'
     func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element"
 
-    element=`gnulib-tool --extract-include-directive $1 \
+    includes=`gnulib-tool --extract-include-directive $1`
+    files=`gnulib-tool --extract-filelist $1`
+    element=`echo "$includes" \
              | sed -e "$sed_lt" -e "$sed_gt" -e 
"$sed_remove_trailing_empty_line" \
-             | sed -e 's,^#include "\(.*\)"$,#include "<A 
HREF="lib/\1">\1</A>",' \
-                    -e 's,^#include &lt;'"${posix_headers}"'\.h&gt;$,#include 
\&lt;<A HREF="'"$POSIX2001_URL"'xbd/\1.h.html">\1.h</A>\&gt;,' \
-             | sed -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'`
+                   -e 's,^#include "\(.*\)"$,#include "<A 
HREF="lib/\1">\1</A>",' \
+                   -e 's,^#include &lt;'"${posix_headers}"'\.h&gt;$,#include 
\&lt;<A HREF="'"$POSIX2001_URL"'xbd/\1.h.html">\1.h</A>\&gt;,' \
+                   -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'`
     test -n "$element" || element='---'
     func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element"
 
     sed_choose_unconditional_nonstandard_include='s,^#include "\(.*\)"$,\1,p'
-    includefile=`gnulib-tool --extract-include-directive $1 \
+    includefile=`echo "$includes" \
                  | sed -n -e "$sed_choose_unconditional_nonstandard_include" \
                  | sed -e "$sed_escape_dot" | tr -d "$trnl"`
     sed_choose_lib_files='s,^lib/\(.*\)$,\1,p'
-    element=`gnulib-tool --extract-filelist $1 \
+    element=`echo "$files" \
              | sed -e '/^$/d' \
              | sed -n -e "$sed_choose_lib_files" \
              | sed -e '/^'"${includefile}"'$/d' \
-             | sed -e 's,^\(.*\)$,<A HREF="lib/\1">\1</A>,' \
-             | sed -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'`
+                   -e 's,^\(.*\)$,<A HREF="lib/\1">\1</A>,' \
+                   -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'`
     test -n "$element" || element='---'
     func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element"
 
     sed_choose_m4_files='s,^m4/\(.*\)$,\1,p'
-    element=`(gnulib-tool --extract-filelist $1 \
+    element=`(echo "$files" \
               | sed -e "$sed_remove_trailing_empty_line" \
               | sed -n -e "$sed_choose_m4_files" \
               | sed -e '/^onceonly/d' \
-              | sed -e 's,^\(.*\)$,<A HREF="m4/\1">\1</A>,'; \
+                    -e 's,^\(.*\)$,<A HREF="m4/\1">\1</A>,'; \
               gnulib-tool --extract-autoconf-snippet $1 \
               | sed -e "$sed_remove_trailing_empty_line") \
               | sed -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'`
@@ -1389,26 +1407,14 @@
 
     element=`gnulib-tool --extract-dependencies $1 \
              | sed -e "$sed_remove_trailing_empty_line" \
-             | sed -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'`
+                   -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'`
     test -n "$element" || element='---'
     func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element"
 
     func_end TR
 
-    missed_modules=`echo "$missed_modules" | sed -e '/^'"$1"'$/d'`
-
-    files=`gnulib-tool --extract-filelist $1`
-    sed_removal_prefix='s,^,/^,'
-    sed_removal_suffix='s,$,\$/d,'
-    sed_remove_files=`echo '{'; \
-                      for file in $files; do \
-                        echo $file \
-                        | sed -e "$sed_escape_dot" -e "$sed_escape_slash" \
-                        | sed -e "$sed_removal_prefix" -e 
"$sed_removal_suffix"; \
-                      done; \
-                      echo '}'`
-    missed_files=`echo "$missed_files" | sed -e "$sed_remove_files"`
-
+    func_append seen_modules " $1"
+    func_append seen_files " $files"
   fi
 }
 
@@ -2224,6 +2230,13 @@
 in_toc=
 func_all_modules
 
+
+gnulib-tool --list >all_modules.$$
+missed_modules=`for module in $seen_modules; do echo $module; done \
+                 | LC_ALL=C sort -u \
+                 | LC_ALL=C join -v 2 - all_modules.$$`
+rm -f all_modules.$$
+
 if test -n "$missed_modules"; then
 
   element="Unclassified modules - please update MODULES.html.sh"
@@ -2239,6 +2252,12 @@
 
 fi
 
+LC_ALL=C ls -d lib/* m4/* | sed -e /CVS/d -e /README/d -e /ChangeLog/d -e 
/Makefile/d -e /TODO/d -e '/tags$/d' -e '/TAGS$/d' -e '/~$/d' >all_files.$$
+missed_files=`for file in $seen_files; do echo $file; done \
+               | LC_ALL=C sort -u \
+               | LC_ALL=C join -v 2 - all_files.$$`
+rm -f all_files.$$
+
 if test -n "$missed_files"; then
 
   element="Lone files - please create new modules containing them"




reply via email to

[Prev in Thread] Current Thread [Next in Thread]