Add getconf_lines and getconf_words functions.
authorMatthijs Kooijman <matthijs@stdin.nl>
Fri, 19 Mar 2010 19:51:22 +0000 (20:51 +0100)
committerMatthijs Kooijman <matthijs@stdin.nl>
Fri, 19 Mar 2010 20:40:15 +0000 (21:40 +0100)
These functions allow reading a multivalued configuration variables,
either split into lines or further split into words.

lib/tools.in

index eeec590..c14e4a2 100644 (file)
@@ -31,6 +31,8 @@ function setsection() {
 # file and section and echoes its value. If it is empty or not found, $2
 # is used.
 function printconf() {
+   # Be careful! This function might be called with an empty IFS
+
    local CURRENT_PARAM=$1
    local ret=`@AWK@ -f $libdirectory/parseini S=$CURRENT_SECTION P=$CURRENT_PARAM $CURRENT_CONF_FILE`
    # if nothing is returned, set the default
@@ -48,6 +50,8 @@ function printconf() {
 # same name. If it is empty or not found, $2 is used.
 #
 function getconf() {
+   # Be careful! This function might be called with an empty IFS
+
    local ret=`printconf "$1" "$2"`
 
    # We use escape the $ in $ret to delay expansion of $ret, so when $1
@@ -56,3 +60,55 @@ function getconf() {
    # whatever is in ret and be subject to all kinds of expansion.
    eval $1=\$ret
 }
+
+# Reads the variable denoted by $1 from the current configuration file
+# and section into the array variable pointed to by $1. Each line in the
+# configuration file is returned as a separate element in the resulting
+# array. For example, the following ini fragment results in an array
+# with three values: "one", "two" and "three"
+#   [section]
+#   variable=one\
+#   two
+#   variable=three
+# $2, $3, etc. are used as the default value (e.g., each of the
+# arguments are elements in the resulting array)
+function getconf_lines() {
+   # Run getconf_words with an empty IFS, so the read in there does not
+   # do any word splitting. This shouldn't affect any other splitting
+   # (since IFS is only used to split expanded parameters, not the
+   # spaces that are in this file directly).
+   IFS='' getconf_words "$@"
+}
+
+# Reads the variable denoted by $1 from the current configuration file
+# and section into the array variable pointed to by $1. Each word in
+# each line in the configuration file is returned as a separate element
+# in the resulting array. Whitespace can be escaped using backslashes. For
+# example, the following ini fragment results in an array with three
+# values: "one one", "two" and "three"
+#   [section]
+#   variable=one\ one two
+#   variable=three
+# $2 is used as the default value (which should be just a string, which
+# will be split on newlines and whitespace)
+function getconf_words() {
+   # Be careful! This function might be called with an empty IFS
+
+   # Get the variable name, so $@ only contains the default elements
+   local varname="$1"
+   shift
+   # Get the value from the config
+   local value=`printconf $varname ""`
+   # Init the result variable to an empty array
+   eval "$varname=()"
+   if [ -z "$value" ]; then
+      # Use the default value, i.e., copy $@ into the result
+      append "$varname" "$@"
+   else
+      local tmp
+      # Read every line and append it to our result
+      while read -a tmp; do
+         append "$varname" "${tmp[@]}"
+      done <<< "$value"
+   fi
+}