# Copyright (c) 2017 The NetBSD Foundation, Inc. # All rights reserved. # # This code is derived from software contributed to The NetBSD Foundation # by Johnny C. Lam. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # NAME # echo.subr -- write to standard output through a buffer # # SYNOPSIS # task_echo [-bcn] ... # # DESCRIPTION # The task_echo function provides a buffered output facility. It # write the contents of the shared buffer to the standard output, then # writes the operands, separated by a single blank character and # followed by a newline character, to the standard output. # # The options are as follows: # # -b Write the operands into a shared buffer instead of to the # standard output. # # -c Clear the contents of the shared buffer before writing the # operands. # # -n Do not write the trailing newline character. # # RETURN VALUES # Returns 0 on success, and >0 if an error occurs. # # ENVIRONMENT # The following variables are used if they are set: # # TASK_LOGFILE # The location of the log file for appending a duplicate of # the output. If this variable is unset or empty, then no log # output is written. # # EXAMPLES # task_echo -bcn "Only write this if there is at least one argument:" # for arg; do # task_echo " $arg" # done # __task_echo__="yes" task_load tee task_echo() { : ${TASK_LOGFILE:=} local action="echo" local newline=" " local arg local OPTIND=1 while getopts ":bcn" arg "$@"; do case $arg in b) action="buffer" ;; c) __task_echo_buffer__= ;; n) newline= ;; *) echo 1>&2 "${0##*/}: task_echo: unknown option \`$arg'" ;; esac done shift $(( ${OPTIND} - 1 )) case $action in buffer) case $newline in "") __task_echo_buffer__="$__task_echo_buffer__""$@" ;; *) __task_echo_buffer__="$__task_echo_buffer__""$@""$newline" ;; esac ;; echo) case ${TASK_LOGFILE} in "") case $newline in "") echo -n "$__task_echo_buffer__""$@" ;; *) echo "$__task_echo_buffer__""$@" ;; esac ;; *) case $newline in "") echo -n "$__task_echo_buffer__""$@" ;; *) echo "$__task_echo_buffer__""$@" ;; esac | task_tee -a "${TASK_LOGFILE}" ;; esac __task_echo_buffer__= ;; esac return 0 } # Static variable to hold the buffered output. __task_echo_buffer__=