freebsd-skq/usr.sbin/bsdconfig/includes/includes.sh
bdrewery c5f489aa38 Rename checked-in 'includes' to 'includes.sh' to avoid colliding with share/mk
target 'make includes'.

The file is still installed to /usr/libexec/bsdconfig/includes/includes.

MFC after:	1 week
Sponsored by:	EMC / Isilon Storage Division
2015-11-19 17:57:31 +00:00

206 lines
5.5 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/sh
#-
# Copyright (c) 2013 Devin Teske
# All rights reserved.
#
# 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 AUTHOR 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 AUTHOR 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.
#
# $FreeBSD$
#
############################################################ INCLUDES
# Prevent common.subr from auto initializing debugging (this is not an inter-
# active utility that requires debugging; also `-d' has been repurposed).
#
DEBUG_SELF_INITIALIZE=NO
BSDCFG_SHARE="/usr/share/bsdconfig"
. $BSDCFG_SHARE/common.subr || exit 1
f_dprintf "%s: loading includes..." "$0"
BSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="includes"
f_include_lang $BSDCFG_LIBE/include/messages.subr
f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
f_index_menusel_keyword $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" ipgm &&
pgm="${ipgm:-$pgm}"
############################################################ GLOBALS
#
# Options
#
USE_COLOR=1
SHOW_DESC=
SHOW_FUNCS=
FUNC_PATTERN=
############################################################ FUNCTIONS
# show_functions $file
#
# Show the functions in the given include file.
#
show_include()
{
local file="${1#./}"
local pattern="${FUNC_PATTERN:-.*}"
output=$( awk \
-v use_color=${USE_COLOR:-0} \
-v re="$pattern" \
-v show_desc=${SHOW_DESC:-0} '
function _asorti(src, dest)
{
k = nitems = 0;
# Copy src indices to dest and calculate array length
for (i in src) dest[++nitems] = i
# Sort the array of indices (dest) using insertion sort method
for (i = 1; i <= nitems; k = i++)
{
idx = dest[i]
while ((k > 0) && (dest[k] > idx))
{
dest[k+1] = dest[k]
k--
}
dest[k+1] = idx
}
return nitems
}
/^$/,/^#/ {
if ($0 ~ /^# f_/) {
if (!match($2, re)) next
fn = $2
if (use_color)
syntax[fn] = sprintf("+%s%s%s\n",
substr($0, 2, RSTART),
substr($0, 2 + RSTART, RLENGTH),
substr($0, 2 + RSTART + RLENGTH))
else
syntax[fn] = "+" substr($0, 2) "\n"
if (show_desc)
print_more = 1
else
print_more = substr($0, length($0)) == "\\"
}
if (show_desc && print_more) {
getline
while ($0 ~ /^#/) {
syntax[fn] = syntax[fn] " " substr($0, 2) "\n"
getline
}
print_more = 0
} else while (print_more) {
getline
syntax[fn] = syntax[fn] " " substr($0, 2) "\n"
print_more = substr($0, length($0)) == "\\"
}
}
END {
n = _asorti(syntax, sorted_indices)
for (i = 1; i <= n; i++)
printf "%s", syntax[sorted_indices[i]]
}' "$file" )
if [ "$output" ]; then
if [ ! "$SHOW_FUNCS" ]; then
echo "$file"
return $SUCCESS
fi
if [ "$FUNC_PATTERN" ]; then
printf ">>> $msg_functions_in_matching\n" \
"$file" "$FUNC_PATTERN"
else
printf ">>> $msg_functions_in\n" "$file"
fi
echo "$output"
echo # blank line to simplify awk(1)-based reparse
fi
}
############################################################ MAIN
# Incorporate rc-file if it exists
[ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc"
# Are we in a terminal?
[ -t 1 ] || USE_COLOR=
#
# Process command-line arguments
#
while getopts adfF:hn flag; do
case "$flag" in
a) USE_COLOR=1 ;;
d) SHOW_DESC=1 SHOW_FUNCS=1 ;;
f) SHOW_FUNCS=1 ;;
F) FUNC_PATTERN="$OPTARG" ;;
n) USE_COLOR= ;;
h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm" ;;
esac
done
shift $(( $OPTIND - 1 ))
# cd(1) to `share' dir so relative paths work for find and positional args
cd $BSDCFG_SHARE || f_die # Pedantic
#
# If given an argument, operate on it specifically (implied `-f') and exit
#
[ $# -gt 0 ] && SHOW_FUNCS=1
for include in "$@"; do
# See if they've just omitted the `*.subr' suffix
[ -f "$include.subr" -a ! -f "$include" ] && include="$include.subr"
if [ ! -f "$include" ]; then
printf "$msg_no_such_file_or_directory\n" "$0" "$include"
exit $FAILURE
elif [ ! -r "$include" ]; then
printf "$msg_permission_denied\n" "$0" "$include"
exit $FAILURE
fi
show_include "$include" || f_die
done
# Exit if we processed some include arguments
[ $# -gt 0 ] && exit $SUCCESS
#
# Operate an all known include files
# NB: If we get this far, we had no include arguments
#
find -s . -type f -and -iname '*.subr' | while read file; do
if [ "$SHOW_FUNCS" -o "$FUNC_PATTERN" ]; then
show_include "$file"
else
echo "${file#./}"
fi
done
exit $SUCCESS
################################################################################
# END
################################################################################