+
+ # a handy little method that can be used for date strings. it was getting
+ # really tiresome how many different ways the script did the date formatting.
+ function date_stringer() {
+ local sep="$1"; shift
+ if [ -z "$sep" ]; then sep='_'; fi
+ date +"%Y$sep%m$sep%d$sep%H%M$sep%S" | tr -d '/\n/'
+ }
+
+ # makes a directory of the name specified and then tries to change the
+ # current directory to that directory.
+ function mcd() {
+ if [ ! -d "$1" ]; then mkdir -p "$1"; fi
+ cd "$1"
+ }
+
+ # displays the value of a variable in bash friendly format.
+ function var() {
+ while true; do
+ local varname="$1"; shift
+ if [ -z "$varname" ]; then
+ break
+ fi
+ if [ -z "${!varname}" ]; then
+ echo "$varname undefined"
+ else
+ echo "$varname=${!varname}"
+ fi
+ done
+ }
+
+ function success_sound()
+ {
+ if [ ! -z "$CLAM_FINISH_SOUND" ]; then
+ bash $FEISTY_MEOW_SCRIPTS/multimedia/sound_play.sh "$CLAM_FINISH_SOUND"
+ fi
+ }
+
+ function error_sound()
+ {
+ if [ ! -z "$CLAM_ERROR_SOUND" ]; then
+ bash $FEISTY_MEOW_SCRIPTS/multimedia/sound_play.sh "$CLAM_ERROR_SOUND"
+ fi
+ }
+
+ # checks the result of the last command that was run, and if it failed,
+ # then this complains and exits from bash. the function parameters are
+ # used as the message to print as a complaint.
+ function check_result()
+ {
+ if [ $? -ne 0 ]; then
+ echo -e "failed on: $*"
+ error_sound
+ exit 1
+ fi
+ }
+
+ # locates a process given a search pattern to match in the process list.
+ function psfind() {
+ local -a patterns=("${@}")
+ mkdir $TEST_TEMP/grid_logs &>/dev/null
+ local PID_DUMP="$(mktemp "$TMP/zz_pidlist.XXXXXX")"
+ local -a PIDS_SOUGHT
+ if [ "$OS" == "Windows_NT" ]; then
+ # needs to be a windows format filename for 'type' to work.
+ if [ ! -d c:/tmp ]; then
+ mkdir c:/tmp
+ fi
+ # windows7 magical mystery tour lets us create a file c:\\tmp_pids.txt, but then it's not
+ # really there in the root of drive c: when we look for it later. hoping to fix that
+ # problem by using a subdir, which also might be magical thinking from windows perspective.
+ tmppid=c:\\tmp\\pids.txt
+ # we have abandoned all hope of relying on ps on windows. instead we use wmic to get full
+ # command lines for processes.
+ wmic /locale:ms_409 PROCESS get processid,commandline </dev/null >"$tmppid"
+ local flag='/c'
+ if [ ! -z "$(uname -a | grep "^MING" )" ]; then
+ flag='//c'
+ fi
+ # we 'type' the file to get rid of the unicode result from wmic.
+ cmd $flag type "$tmppid" >$PID_DUMP
+ \rm "$tmppid"
+# local CR='
+#' # embedded carriage return.
+# local appropriate_pattern="s/^.* *\([0-9][0-9]*\)[ $CR]*\$/\1/p"
+ local appropriate_pattern="s/^.* *\([0-9][0-9]*\) *\$/\1/p"
+ for i in "${patterns[@]}"; do
+ PIDS_SOUGHT+=($(cat $PID_DUMP \
+ | grep -i "$i" \
+ | sed -n -e "$appropriate_pattern"))
+ done
+ else
+ /bin/ps $extra_flags wuax >$PID_DUMP
+ # pattern to use for peeling off the process numbers.
+ local appropriate_pattern='s/^[-a-zA-Z_0-9][-a-zA-Z_0-9]* *\([0-9][0-9]*\).*$/\1/p'
+ # remove the first line of the file, search for the pattern the
+ # user wants to find, and just pluck the process ids out of the
+ # results.
+ for i in "${patterns[@]}"; do
+ PIDS_SOUGHT+=($(cat $PID_DUMP \
+ | sed -e '1d' \
+ | grep -i "$i" \
+ | sed -n -e "$appropriate_pattern"))
+ done
+ fi
+ if [ ${#PIDS_SOUGHT[*]} -ne 0 ]; then
+ local PIDS_SOUGHT2=$(printf -- '%s\n' ${PIDS_SOUGHT[@]} | sort | uniq)
+ PIDS_SOUGHT=()
+ PIDS_SOUGHT=${PIDS_SOUGHT2[*]}
+ echo ${PIDS_SOUGHT[*]}
+ fi
+ /bin/rm $PID_DUMP
+ }
+
+ # finds all processes matching the pattern specified and shows their full
+ # process listing (whereas psfind just lists process ids).
+ function psa() {
+ if [ -z "$1" ]; then
+ echo "psa finds processes by pattern, but there was no pattern on the command line."
+ return 1
+ fi
+ p=$(psfind "${@}")
+ if [ -z "$p" ]; then
+ # no matches.
+ return 0
+ fi