From 2fc3bd4d5d981eb2e5b4e7f31047c8f24b877c9e Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Fri, 19 Mar 2010 20:51:22 +0100 Subject: [PATCH] Add getconf_lines and getconf_words functions. These functions allow reading a multivalued configuration variables, either split into lines or further split into words. --- lib/tools.in | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/lib/tools.in b/lib/tools.in index eeec590..c14e4a2 100644 --- a/lib/tools.in +++ b/lib/tools.in @@ -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 +} -- 2.30.2