Something went wrong on our end
-
Arne Babenhauserheide authoredArne Babenhauserheide authored
go_readrc 3.93 KiB
#! /bin/sh
# --- init ---
# leave on error
set -e
# --- external ---
basename='/bin/basename'
test ! -x ${basename} && basename='/usr/bin/basename'
egrep='/bin/egrep'
test ! -x ${egrep} && egrep='/usr/bin/egrep'
less='/bin/less'
test ! -x ${less} && less='/usr/bin/less'
test ! -x ${less} && less='/usr/local/bin/less'
sed='/bin/sed'
test ! -x ${sed} && sed='/usr/bin/sed'
# --- definitions ---
prog=`${basename} $0`
# --- help ---
DisplayHelp ()
{
${xPAGER:-${less}} << EOF
$prog General Objects
NAME
$prog - read data value from a resource file
SYNOPSIS
go_readrc <rcfile> <key> [<default>]
go_readrc -h|--help
DESCRIPTION
A recourcefile is a text file with key/data pairs, usefull
to initialize programs (scripts, Fortran, etc).
The format of the <rcfile> is chosen close to the standard X resources:
* Comment lines start with '!'
* A key/data pair has the format:
<key> : <value>
where the white space (space or tabs) is optional.
The <key> consists of letters, numbers, '_', and '.' .
Example of a valid rcfile:
! Specify an output directory:
output.path : d/
Given a text <key>, the <rcfile> is scanned for a line starting
with this key; all text behind the ':' is written to the standard output.
Example of usage in sh script:
output_root=\`go_readrc test.rc output.path\`
If the <key> is not found, an error message is issued,
unless a <default> is supplied which is then written to standard output.
The <default> might be an empty string, e.g. '' .
PREPROCESSING
The rcfile might be preprocessed by go_pprc,
to expand environment variables.
EXIT STATUS
Non zero in case of any error.
SEE ALSO
X, go_pprc
AUTHOR
Arjo Segers
EOF
exit 0
}
ErrorMessage ()
{
echo "ERROR in $prog: $1" 1>&2
echo " Use '$prog -h' for information." 1>&2
exit 1
}
# --- arguments ---
rcfile=''
rckey=''
with_default=''
while [ $# -gt 0 ]; do
case "$1" in
-h | --help )
DisplayHelp
;;
-* )
ErrorMessage "unknown option '$1' ..."
;;
* )
if [ -z "${rcfile}" ]; then
rcfile="$1"
elif [ -z "${rckey}" ]; then
rckey="$1"
elif [ -z "${with_default}" ]; then
default="$1"
with_default='true'
else
ErrorMessage "unknown argument '$1'"
fi
;;
esac
shift
done
if [ -z "${rcfile}" -o -z "${rckey}" ]; then
ErrorMessage "missing arguments"
fi
# --- begin ---
# does the rcfile exist?
if [ ! -f ${rcfile} ]; then
ErrorMessage "rcfile '${rcfile}' does not exist ..."
fi
# replace '.' in the rckey by '\.'
rckeydots=`echo ${rckey} | ${sed} -e 's/\./\\\\./g'`
# 10 Apr 06: Andy Jacobson
# [[:space:]] indicates a space or tab character
#wspace='[[:space:]]*'
#
# 26 Apr 06: Arjo Segers
# The egrep on SGI system does not support the '[:space:]' ;
# use a real tab character instead ...
tab=' '
wspace="[ ${tab}]*"
# A key-data line has the following synopsis:
#
# <begin-of-line><key>[<wspace>]:[<wspace>]<data>
#
# where <wspace> denote tabs or spaces.
# Set regular expression for such a line except the <data> part;
# this expression is used to search for a key and to extract
# the data part:
#
re="^${rckeydots}${wspace}:${wspace}"
# set grep command to select matching lines:
selectlinecmd="${egrep} '${re}' ${rcfile}"
# count number of hits; should be exactely 1 ...
nfound=`eval "${selectlinecmd}" | /usr/bin/wc -l`
if [ ${nfound} -eq 0 ]; then
if [ -z "${with_default}" ]; then
ErrorMessage "key '${rckey}' not found in ${rcfile} and no default specified ..."
else
echo "${default}"
exit 0
fi
elif [ ${nfound} -gt 1 ]; then
ErrorMessage "key '${rckey}' found ${nfound} times in $rcfile ..."
fi
# extract the data part for this key;
# substitute an empty string for the 'key : ' part;
# remove trailing blanks;
# output is written to standard output:
eval "${selectlinecmd}" | ${sed} -e "s/${re}//" -e "s/${wspace}$//"