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 <[EMAIL PROTECTED]> * 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 <'"${posix_headers}"'\.h>$,#include \<<A HREF="'"$POSIX2001_URL"'xbd/\1.h.html">\1.h</A>\>,' \ - | sed -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'` + -e 's,^#include "\(.*\)"$,#include "<A HREF="lib/\1">\1</A>",' \ + -e 's,^#include <'"${posix_headers}"'\.h>$,#include \<<A HREF="'"$POSIX2001_URL"'xbd/\1.h.html">\1.h</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_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"