comparison MODULES.html.sh @ 7656:50308a13df4d

* 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, func_tmpdir): ... these new functions, from gnulib-tool. Analogously, install traps for cleanup.
author Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
date Tue, 14 Nov 2006 22:01:14 +0000
parents e856370de785
children 1757949a7c72
comparison
equal deleted inserted replaced
7655:3360eb5824e9 7656:50308a13df4d
1241 y1 1241 y1
1242 yn 1242 yn
1243 ' | sed -e "$sed_alt1" | tr -d "$trnl" | sed -e "$sed_alt2" -e "$sed_alt3"` 1243 ' | sed -e "$sed_alt1" | tr -d "$trnl" | sed -e "$sed_alt2" -e "$sed_alt3"`
1244 1244
1245 indent="" 1245 indent=""
1246 missed_modules=`gnulib-tool --list` 1246 seen_modules=
1247 missed_files=`ls -d lib/* m4/* | sed -e /CVS/d -e /README/d -e /ChangeLog/d -e /Makefile/d -e /TODO/d -e '/~$/d'` 1247 seen_files=
1248
1249 # func_exit STATUS
1250 # exit with status
1251 func_exit ()
1252 {
1253 (exit $1); exit $1
1254 }
1255
1256 # func_tmpdir
1257 # creates a temporary directory.
1258 # Sets variable
1259 # - tmp pathname of freshly created temporary directory
1260 func_tmpdir ()
1261 {
1262 # Use the environment variable TMPDIR, falling back to /tmp. This allows
1263 # users to specify a different temporary directory, for example, if their
1264 # /tmp is filled up or too small.
1265 : ${TMPDIR=/tmp}
1266 {
1267 # Use the mktemp program if available. If not available, hide the error
1268 # message.
1269 tmp=`(umask 077 && mktemp -d "$TMPDIR/MDXXXXXX") 2>/dev/null` &&
1270 test -n "$tmp" && test -d "$tmp"
1271 } ||
1272 {
1273 # Use a simple mkdir command. It is guaranteed to fail if the directory
1274 # already exists. $RANDOM is bash specific and expands to empty in shells
1275 # other than bash, ksh and zsh. Its use does not increase security;
1276 # rather, it minimizes the probability of failure in a very cluttered /tmp
1277 # directory.
1278 tmp=$TMPDIR/MD$$-$RANDOM
1279 (umask 077 && mkdir "$tmp")
1280 } ||
1281 {
1282 echo "$0: cannot create a temporary directory in $TMPDIR" >&2
1283 func_exit 1
1284 }
1285 }
1286
1287 # func_append var value
1288 # appends the given value to the shell variable var.
1289 if ( foo=bar; foo+=baz && test "$foo" = barbaz ) >/dev/null 2>&1; then
1290 # Use bash's += operator. It reduces complexity of appending repeatedly to
1291 # a single variable from O(n^2) to O(n).
1292 func_append ()
1293 {
1294 eval "$1+=\"\$2\""
1295 }
1296 else
1297 func_append ()
1298 {
1299 eval "$1=\"\$$1\$2\""
1300 }
1301 fi
1248 1302
1249 # func_echo line 1303 # func_echo line
1250 # outputs line with indentation. 1304 # outputs line with indentation.
1251 func_echo () 1305 func_echo ()
1252 { 1306 {
1337 element='<A HREF="#module='$1'">'$1'</A>' 1391 element='<A HREF="#module='$1'">'$1'</A>'
1338 func_echo "<TD ALIGN=LEFT VALIGN=TOP WIDTH=\"20%\">$element" 1392 func_echo "<TD ALIGN=LEFT VALIGN=TOP WIDTH=\"20%\">$element"
1339 1393
1340 element=`gnulib-tool --extract-description $1 \ 1394 element=`gnulib-tool --extract-description $1 \
1341 | sed -e "$sed_lt" -e "$sed_gt" -e "$sed_remove_trailing_empty_line" \ 1395 | sed -e "$sed_lt" -e "$sed_gt" -e "$sed_remove_trailing_empty_line" \
1342 | sed -e 's,^, ,' \ 1396 -e 's,^, ,' \
1343 | sed -e 's,\([^a-zA-Z]\)'"${posix_functions}"'(),\1<A HREF="'"$POSIX2001_URL"'xsh/\2.html">\2</A>(),g' \ 1397 -e 's,\([^a-zA-Z]\)'"${posix_functions}"'(),\1<A HREF="'"$POSIX2001_URL"'xsh/\2.html">\2</A>(),g' \
1344 | sed -e 's,^ ,,'` 1398 -e 's,^ ,,'`
1345 func_echo "<TD ALIGN=LEFT VALIGN=TOP WIDTH=\"80%\">$element" 1399 func_echo "<TD ALIGN=LEFT VALIGN=TOP WIDTH=\"80%\">$element"
1346 1400
1347 func_end TR 1401 func_end TR
1348 1402
1349 else 1403 else
1351 func_begin TR 1405 func_begin TR
1352 1406
1353 element='<A NAME="module='$1'"></A><A HREF="modules/'$1'">'$1'</A>' 1407 element='<A NAME="module='$1'"></A><A HREF="modules/'$1'">'$1'</A>'
1354 func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element" 1408 func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element"
1355 1409
1356 element=`gnulib-tool --extract-include-directive $1 \ 1410 includes=`gnulib-tool --extract-include-directive $1`
1411 files=`gnulib-tool --extract-filelist $1`
1412 element=`echo "$includes" \
1357 | sed -e "$sed_lt" -e "$sed_gt" -e "$sed_remove_trailing_empty_line" \ 1413 | sed -e "$sed_lt" -e "$sed_gt" -e "$sed_remove_trailing_empty_line" \
1358 | sed -e 's,^#include "\(.*\)"$,#include "<A HREF="lib/\1">\1</A>",' \ 1414 -e 's,^#include "\(.*\)"$,#include "<A HREF="lib/\1">\1</A>",' \
1359 -e 's,^#include &lt;'"${posix_headers}"'\.h&gt;$,#include \&lt;<A HREF="'"$POSIX2001_URL"'xbd/\1.h.html">\1.h</A>\&gt;,' \ 1415 -e 's,^#include &lt;'"${posix_headers}"'\.h&gt;$,#include \&lt;<A HREF="'"$POSIX2001_URL"'xbd/\1.h.html">\1.h</A>\&gt;,' \
1360 | sed -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'` 1416 -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'`
1361 test -n "$element" || element='---' 1417 test -n "$element" || element='---'
1362 func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element" 1418 func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element"
1363 1419
1364 sed_choose_unconditional_nonstandard_include='s,^#include "\(.*\)"$,\1,p' 1420 sed_choose_unconditional_nonstandard_include='s,^#include "\(.*\)"$,\1,p'
1365 includefile=`gnulib-tool --extract-include-directive $1 \ 1421 includefile=`echo "$includes" \
1366 | sed -n -e "$sed_choose_unconditional_nonstandard_include" \ 1422 | sed -n -e "$sed_choose_unconditional_nonstandard_include" \
1367 | sed -e "$sed_escape_dot" | tr -d "$trnl"` 1423 | sed -e "$sed_escape_dot" | tr -d "$trnl"`
1368 sed_choose_lib_files='s,^lib/\(.*\)$,\1,p' 1424 sed_choose_lib_files='s,^lib/\(.*\)$,\1,p'
1369 element=`gnulib-tool --extract-filelist $1 \ 1425 element=`echo "$files" \
1370 | sed -e '/^$/d' \ 1426 | sed -e '/^$/d' \
1371 | sed -n -e "$sed_choose_lib_files" \ 1427 | sed -n -e "$sed_choose_lib_files" \
1372 | sed -e '/^'"${includefile}"'$/d' \ 1428 | sed -e '/^'"${includefile}"'$/d' \
1373 | sed -e 's,^\(.*\)$,<A HREF="lib/\1">\1</A>,' \ 1429 -e 's,^\(.*\)$,<A HREF="lib/\1">\1</A>,' \
1374 | sed -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'` 1430 -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'`
1375 test -n "$element" || element='---' 1431 test -n "$element" || element='---'
1376 func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element" 1432 func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element"
1377 1433
1378 sed_choose_m4_files='s,^m4/\(.*\)$,\1,p' 1434 sed_choose_m4_files='s,^m4/\(.*\)$,\1,p'
1379 element=`(gnulib-tool --extract-filelist $1 \ 1435 element=`(echo "$files" \
1380 | sed -e "$sed_remove_trailing_empty_line" \ 1436 | sed -e "$sed_remove_trailing_empty_line" \
1381 | sed -n -e "$sed_choose_m4_files" \ 1437 | sed -n -e "$sed_choose_m4_files" \
1382 | sed -e '/^onceonly/d' \ 1438 | sed -e '/^onceonly/d' \
1383 | sed -e 's,^\(.*\)$,<A HREF="m4/\1">\1</A>,'; \ 1439 -e 's,^\(.*\)$,<A HREF="m4/\1">\1</A>,'; \
1384 gnulib-tool --extract-autoconf-snippet $1 \ 1440 gnulib-tool --extract-autoconf-snippet $1 \
1385 | sed -e "$sed_remove_trailing_empty_line") \ 1441 | sed -e "$sed_remove_trailing_empty_line") \
1386 | sed -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'` 1442 | sed -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'`
1387 test -n "$element" || element='---' 1443 test -n "$element" || element='---'
1388 func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element" 1444 func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element"
1389 1445
1390 element=`gnulib-tool --extract-dependencies $1 \ 1446 element=`gnulib-tool --extract-dependencies $1 \
1391 | sed -e "$sed_remove_trailing_empty_line" \ 1447 | sed -e "$sed_remove_trailing_empty_line" \
1392 | sed -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'` 1448 -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'`
1393 test -n "$element" || element='---' 1449 test -n "$element" || element='---'
1394 func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element" 1450 func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element"
1395 1451
1396 func_end TR 1452 func_end TR
1397 1453
1398 missed_modules=`echo "$missed_modules" | sed -e '/^'"$1"'$/d'` 1454 func_append seen_modules " $1"
1399 1455 func_append seen_files " $files"
1400 files=`gnulib-tool --extract-filelist $1`
1401 sed_removal_prefix='s,^,/^,'
1402 sed_removal_suffix='s,$,\$/d,'
1403 sed_remove_files=`echo '{'; \
1404 for file in $files; do \
1405 echo $file \
1406 | sed -e "$sed_escape_dot" -e "$sed_escape_slash" \
1407 | sed -e "$sed_removal_prefix" -e "$sed_removal_suffix"; \
1408 done; \
1409 echo '}'`
1410 missed_files=`echo "$missed_files" | sed -e "$sed_remove_files"`
1411
1412 fi 1456 fi
1413 } 1457 }
1414 1458
1415 # func_end_table 1459 # func_end_table
1416 func_end_table () 1460 func_end_table ()
2191 func_module host-os 2235 func_module host-os
2192 func_module perl 2236 func_module perl
2193 func_module uptime 2237 func_module uptime
2194 func_end_table 2238 func_end_table
2195 } 2239 }
2196 2240
2241
2242 func_tmpdir
2243 trap 'exit_status=$?
2244 if test "$signal" != 0; then
2245 echo "caught signal $signal" >&2
2246 fi
2247 rm -rf "$tmp"
2248 exit $exit_status' 0
2249 for signal in 1 2 3 13 15; do
2250 trap '{ signal='$signal'; func_exit 1; }' $signal
2251 done
2252 signal=0
2197 2253
2198 echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">' 2254 echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">'
2199 func_begin HTML 2255 func_begin HTML
2200 2256
2201 func_begin HEAD 2257 func_begin HEAD
2222 func_all_modules 2278 func_all_modules
2223 2279
2224 in_toc= 2280 in_toc=
2225 func_all_modules 2281 func_all_modules
2226 2282
2283
2284 gnulib-tool --list > "$tmp/all-modules"
2285 missed_modules=`for module in $seen_modules; do echo $module; done \
2286 | LC_ALL=C sort -u \
2287 | LC_ALL=C join -v 2 - "$tmp/all-modules"`
2288
2227 if test -n "$missed_modules"; then 2289 if test -n "$missed_modules"; then
2228 2290
2229 element="Unclassified modules - please update MODULES.html.sh" 2291 element="Unclassified modules - please update MODULES.html.sh"
2230 element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"` 2292 element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
2231 func_wrap H2 2293 func_wrap H2
2236 func_module $module 2298 func_module $module
2237 done 2299 done
2238 func_end_table 2300 func_end_table
2239 2301
2240 fi 2302 fi
2303
2304 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' > "$tmp/all-files"
2305 missed_files=`for file in $seen_files; do echo $file; done \
2306 | LC_ALL=C sort -u \
2307 | LC_ALL=C join -v 2 - "$tmp/all-files"`
2241 2308
2242 if test -n "$missed_files"; then 2309 if test -n "$missed_files"; then
2243 2310
2244 element="Lone files - please create new modules containing them" 2311 element="Lone files - please create new modules containing them"
2245 element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"` 2312 element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
2272 func_echo 'Generated from <CODE>MODULES.html.sh</CODE> on '`LC_ALL=C date +"%e %B %Y"`. 2339 func_echo 'Generated from <CODE>MODULES.html.sh</CODE> on '`LC_ALL=C date +"%e %B %Y"`.
2273 2340
2274 func_end BODY 2341 func_end BODY
2275 2342
2276 func_end HTML 2343 func_end HTML
2344
2345 rm -rf "$tmp"
2346 # Undo the effect of the previous 'trap' command.
2347 trap '' 0
2348 trap 'func_exit $?' 1 2 3 13 15
2349
2350 exit 0