bug-gnulib
[Top][All Lists]
Advanced

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

[PATCH 1/4] gnulib-tool: cache module metainformation.


From: Ralf Wildenhues
Subject: [PATCH 1/4] gnulib-tool: cache module metainformation.
Date: Sun, 28 Dec 2008 11:18:46 +0100
User-agent: Mutt/1.5.18 (2008-05-17)

* gnulib-tool (sed_extract_prog): Match newline before each
header, and rewrite header to a shell variable suffix.
(func_cache_var, func_cache_lookup_module): New functions,
to turn a module name into a cache variable prefix, and to
look up and cache module metainformation.
(func_get_description, func_get_status)
(func_get_notice, func_get_filelist, func_get_dependencies)
(func_get_autoconf_early_snippet, func_get_autoconf_snippet)
(func_get_automake_snippet): Use func_cache_lookup_module.
---
 gnulib-tool |  169 +++++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 124 insertions(+), 45 deletions(-)

diff --git a/gnulib-tool b/gnulib-tool
index bc3effb..d5eb9df 100755
--- a/gnulib-tool
+++ b/gnulib-tool
@@ -1263,34 +1263,112 @@ func_verify_tests_module ()
   esac
 }
 
-sed_extract_prog=':[    ]*$/ {
-  :a
-    n
-    s/^Description:[    ]*$//
-    s/^Status:[         ]*$//
-    s/^Notice:[         ]*$//
-    s/^Files:[  ]*$//
-    s/^Depends-on:[     ]*$//
-    s/^configure\.ac-early:[    ]*$//
-    s/^configure\.ac:[  ]*$//
-    s/^Makefile\.am:[   ]*$//
-    s/^Include:[        ]*$//
-    s/^Link:[   ]*$//
-    s/^License:[        ]*$//
-    s/^Maintainer:[     ]*$//
-    tb
-    p
-    ba
-  :b
-}'
+# func_cache_var file
+#
+# return the cache variable name corresponding to $file.
+# Output:
+# - cachevar
+if test -n "$BASH_VERSION"; then
+  func_cache_var ()
+  {
+    cachevar=c_${1//[!a-zA-Z0-9_]/_}
+  }
+else
+  func_cache_var ()
+  {
+    case $1 in
+      *[!a-zA-Z0-9_]*)
+        cachevar=c_`echo "$1" | LC_ALL=C sed 's/[^a-zA-Z0-9_]/_/g'` ;;
+      *)
+        cachevar=c_$1 ;;
+    esac
+  }
+fi
+
+# Extract headers from module descriptions.
+# The pattern space will contain an embedded newline before the header.
+sed_extract_prog="
+  s/\nDescription:[     ]*$/\\${nl}desc/
+  s/\nStatus:[  ]*$/\\${nl}status/
+  s/\nNotice:[  ]*$/\\${nl}notice/
+  s/\nFiles:[   ]*$/\\${nl}files/
+  s/\nDepends-on:[      ]*$/\\${nl}deps/
+  s/\nconfigure\.ac-early:[     ]*$/\\${nl}config_early/
+  s/\nconfigure\.ac:[   ]*$/\\${nl}config/
+  s/\nMakefile\.am:[    ]*$/\\${nl}makefile/
+  s/\nInclude:[         ]*$/\\${nl}include/
+  s/\nLink:[    ]*$/\\${nl}link/
+  s/\nLicense:[         ]*$/\\${nl}license/
+  s/\nMaintainer:[      ]*$/\\${nl}maint/"
+
+# func_cache_lookup_module file
+#
+# look up a module, like 'func_lookup_file modules/$file', and store all of its
+# relevant data in a cache.  If already cached, do not look it up again.
+# Input:
+# - file
+# Output:
+# - cachevar
+# - ${cachevar}_cached
+# - ${cachevar}_desc
+# - ${cachevar}_status
+# - ...
+func_cache_lookup_module ()
+{
+  func_cache_var "$1"
+  if eval "test -z \"\$${cachevar}_cached\""; then
+    func_lookup_file "modules/$1"
+    # Parse the module file:
+    # - match a known header
+    # - if the first found header, then accumulate lines
+    #   until we have all its contents, plus the next header or EOF
+    # - remember the next header for later, cut it off, then modify
+    #   the current header and value into a shell variable assignment,
+    #   after removing trailing white space from the value.
+    # - finally, restore the next header, rinse and repeat.
+    # - setting ${cachevar}_cached at the beginning helps simplify
+    #   the script.
+    sed_cache_module='
+      s/^/cached\'"$nl"'yes\'"$nl"'/
+      :match
+      t match
+      '"$sed_extract_prog"'
+      t hdr
+      :more
+      $b ws
+      N
+      b match
+
+      :hdr
+      h
+      s/\(.*\)\n.*/\1/
+      :ws
+      t ws
+      s/\n[     ]*$//
+      t ws
+      s/'\''/&"'\''"&/g
+      s/^\([a-zA-Z0-9_]\{1,\}\)/'${cachevar}_'\1='\''/
+      s/\n//
+      s/$/'\''/
+      p
+      $d
+
+      x
+      s/.*\n//
+      b more
+      '
+    cache_script=`sed -n "$sed_cache_module" < "$lookedup_file"`
+    eval "$cache_script"
+  fi
+}
 
 # func_get_description module
 # Input:
 # - local_gnulib_dir  from --local-dir
 func_get_description ()
 {
-  func_lookup_file "modules/$1"
-  sed -n -e "/^Description$sed_extract_prog" < "$lookedup_file"
+  func_cache_lookup_module "$1"
+  eval "echo \"\$${cachevar}_desc\""
 }
 
 # func_get_status module
@@ -1298,8 +1376,8 @@ func_get_description ()
 # - local_gnulib_dir  from --local-dir
 func_get_status ()
 {
-  func_lookup_file "modules/$1"
-  sed -n -e "/^Status$sed_extract_prog" < "$lookedup_file"
+  func_cache_lookup_module "$1"
+  eval "echo \"\$${cachevar}_status\""
 }
 
 # func_get_notice module
@@ -1307,8 +1385,8 @@ func_get_status ()
 # - local_gnulib_dir  from --local-dir
 func_get_notice ()
 {
-  func_lookup_file "modules/$1"
-  sed -n -e "/^Notice$sed_extract_prog" < "$lookedup_file"
+  func_cache_lookup_module "$1"
+  eval "echo \"\$${cachevar}_notice\""
 }
 
 # func_get_filelist module
@@ -1316,8 +1394,8 @@ func_get_notice ()
 # - local_gnulib_dir  from --local-dir
 func_get_filelist ()
 {
-  func_lookup_file "modules/$1"
-  sed -n -e "/^Files$sed_extract_prog" < "$lookedup_file"
+  func_cache_lookup_module "$1"
+  eval "echo \"\$${cachevar}_files\""
   echo m4/gnulib-common.m4
   case "$autoconf_minversion" in
     2.59)
@@ -1334,8 +1412,8 @@ func_get_dependencies ()
   # ${module}-tests always implicitly depends on ${module}.
   echo "$1" | sed -n -e 's/-tests$//p'
   # Then the explicit dependencies listed in the module description.
-  func_lookup_file "modules/$1"
-  sed -n -e "/^Depends-on$sed_extract_prog" < "$lookedup_file"
+  func_cache_lookup_module "$1"
+  eval "echo \"\$${cachevar}_deps\""
 }
 
 # func_get_autoconf_early_snippet module
@@ -1343,8 +1421,8 @@ func_get_dependencies ()
 # - local_gnulib_dir  from --local-dir
 func_get_autoconf_early_snippet ()
 {
-  func_lookup_file "modules/$1"
-  sed -n -e "/^configure\.ac-early$sed_extract_prog" < "$lookedup_file"
+  func_cache_lookup_module "$1"
+  eval "echo \"\$${cachevar}_config_early\""
 }
 
 # func_get_autoconf_snippet module
@@ -1352,8 +1430,8 @@ func_get_autoconf_early_snippet ()
 # - local_gnulib_dir  from --local-dir
 func_get_autoconf_snippet ()
 {
-  func_lookup_file "modules/$1"
-  sed -n -e "/^configure\.ac$sed_extract_prog" < "$lookedup_file"
+  func_cache_lookup_module "$1"
+  eval "echo \"\$${cachevar}_config\""
 }
 
 # func_get_automake_snippet module
@@ -1361,8 +1439,8 @@ func_get_autoconf_snippet ()
 # - local_gnulib_dir  from --local-dir
 func_get_automake_snippet ()
 {
-  func_lookup_file "modules/$1"
-  sed -n -e "/^Makefile\.am$sed_extract_prog" < "$lookedup_file"
+  func_cache_lookup_module "$1"
+  eval "echo \"\$${cachevar}_makefile\""
   case "$1" in
     *-tests)
       # *-tests module live in tests/, not lib/.
@@ -1390,7 +1468,7 @@ func_get_automake_snippet ()
       }'
       sed_extract_mentioned_files='s/^lib_SOURCES[      ]*+=[   ]*//p'
       already_mentioned_files=` \
-        sed -n -e "/^Makefile\.am$sed_extract_prog" < "$lookedup_file" \
+        eval "echo \\"\\$${cachevar}_makefile\\"" \
         | sed -e "$sed_combine_lines" \
         | sed -n -e "$sed_extract_mentioned_files" | sed -e 's/#.*//'`
       all_files=`func_get_filelist $1`
@@ -1461,8 +1539,8 @@ func_get_automake_snippet ()
 # - local_gnulib_dir  from --local-dir
 func_get_include_directive ()
 {
-  func_lookup_file "modules/$1"
-  sed -n -e "/^Include$sed_extract_prog" < "$lookedup_file" | \
+  func_cache_lookup_module "$1"
+  eval "echo \"\$${cachevar}_include\"" | \
   sed -e 's/^\(["<]\)/#include \1/'
 }
 
@@ -1471,8 +1549,8 @@ func_get_include_directive ()
 # - local_gnulib_dir  from --local-dir
 func_get_link_directive ()
 {
-  func_lookup_file "modules/$1"
-  sed -n -e "/^Link$sed_extract_prog" < "$lookedup_file"
+  func_cache_lookup_module "$1"
+  eval "echo \"\$${cachevar}_link\""
 }
 
 # func_get_license module
@@ -1480,8 +1558,9 @@ func_get_link_directive ()
 # - local_gnulib_dir  from --local-dir
 func_get_license ()
 {
-  func_lookup_file "modules/$1"
-  { sed -n -e "/^License$sed_extract_prog" < "$lookedup_file"
+  func_cache_lookup_module "$1"
+  {
+    eval "echo \"\$${cachevar}_license\""
     # The default is GPL.
     echo "GPL"
   } | sed -e 's,^ *$,,' | sed -e 1q
@@ -1492,8 +1571,8 @@ func_get_license ()
 # - local_gnulib_dir  from --local-dir
 func_get_maintainer ()
 {
-  func_lookup_file "modules/$1"
-  sed -n -e "/^Maintainer$sed_extract_prog" < "$lookedup_file"
+  func_cache_lookup_module "$1"
+  eval "echo \"\$${cachevar}_maint\""
 }
 
 # func_get_tests_module module
-- 
1.6.1.rc3.96.g159c88





reply via email to

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