diff options
Diffstat (limited to 'usr/src/cmd/ast/libshell/common/scripts/cpvprint.sh')
-rw-r--r-- | usr/src/cmd/ast/libshell/common/scripts/cpvprint.sh | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/usr/src/cmd/ast/libshell/common/scripts/cpvprint.sh b/usr/src/cmd/ast/libshell/common/scripts/cpvprint.sh new file mode 100644 index 0000000000..5c8c706579 --- /dev/null +++ b/usr/src/cmd/ast/libshell/common/scripts/cpvprint.sh @@ -0,0 +1,184 @@ +#!/usr/bin/ksh93 + +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# + +# +# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. +# + +# +# cpvprint - compound variable pretty printer +# + +# Solaris needs /usr/xpg6/bin:/usr/xpg4/bin because the tools in /usr/bin are not POSIX-conformant +export PATH=/usr/xpg6/bin:/usr/xpg4/bin:/bin:/usr/bin + +# Make sure all math stuff runs in the "C" locale to avoid problems +# with alternative # radix point representations (e.g. ',' instead of +# '.' in de_DE.*-locales). This needs to be set _before_ any +# floating-point constants are defined in this script). +if [[ "${LC_ALL}" != "" ]] ; then + export \ + LC_MONETARY="${LC_ALL}" \ + LC_MESSAGES="${LC_ALL}" \ + LC_COLLATE="${LC_ALL}" \ + LC_CTYPE="${LC_ALL}" + unset LC_ALL +fi +export LC_NUMERIC=C + +function fatal_error +{ + print -u2 "${progname}: $*" + exit 1 +} + +function prettyprint_compoundvar +{ + nameref var=$1 + + # print tree + str="${ print -v var ; }" + # do some "pretty-printing" for human users (the output is still a + # valid compound variable value) + # (note: This does not scale well with large files) + str="${str//$'\t'typeset -l -E /$'\t'float }" + str="${str//$'\t'typeset -l -i /$'\t'integer }" + str="${str//$'\t'typeset -C /$'\t'compound }" + print -r -- "${str}" + + return 0 +} + +function usage +{ + OPTIND=0 + getopts -a "${progname}" "${cpvprint_usage}" OPT '-?' + exit 2 +} + +# HTML constants +compound -r hc=( + compound -r doctype=( + compound -r xhtml=( + typeset -r transitional=$'<!DOCTYPE html\n\tPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\n\t"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n' + ) + ) + compound -r namespace=( + typeset -r xhtml=$'http://www.w3.org/1999/xhtml' + ) + typeset -r xml_head=$'<?xml version="1.0" encoding="UTF-8"?>\n' +) + +# main +builtin basename + +set -o noglob +set -o errexit +set -o nounset + +# tree variable +compound tree + +typeset progname="${ basename "${0}" ; }" + +typeset -r cpvprint_usage=$'+ +[-?\n@(#)\$Id: cpvprint (Roland Mainz) 2009-06-15 \$\n] +[-author?Roland Mainz <roland.mainz@nrubsig.org>] +[+NAME?cpvprint - render compound variable trees in various formats] +[+DESCRIPTION?\bcpvprint\b is converter which reads a ksh compound + variable and prints it on a different format. Supported + formats are \'default\', \'altdefault\', + \'tree\', \'alttree\', + \'pretty\', \'pretty.html\', \'list\' and \'fulllist\'] + +format [ arguments ] + +[+SEE ALSO?\bksh93\b(1), \bcpvlint\b(1)] +' + +while getopts -a "${progname}" "${cpvprint_usage}" OPT ; do +# printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|" + case ${OPT} in + *) usage ;; + esac +done +shift $((OPTIND-1)) + +# prechecks +(( $# > 0 )) || usage + +printformat="$1" +shift + +# read variable +case $# in + 0) + read -C tree || fatal_error $"Read error." + ;; + 1) + integer fd + + redirect {fd}<> "$1" || fatal_error $"Cannot open file." + read -u${fd} -C tree || fatal_error $"Read error." + redirect {fd}<&- || fatal_error $"Close error." + ;; + 2) + print -u2 -f $"%s: Unsupported number of arguments.\n" "$0" + exit 1 + ;; +esac + +# print variable +case ${printformat} in + 'default' | 'tree') + print -v tree + ;; + 'altdefault' | 'alttree') + print -C tree + ;; + 'pretty') + # print variable tree (same as $ print -v filetree # except that it "looks better") + prettyprint_compoundvar tree + ;; + 'pretty.html') + printf '%s%s<html xmlns="%s" xml:lang="en" lang="en">\n<head><meta name="generator" content="%H" /><title>%H</title></head>\n<body><pre>%H\n</pre></body></html>\n' \ + "${hc.xml_head}" \ + "${hc.doctype.xhtml.transitional}" \ + "${hc.namespace.xhtml}" \ + "ksh Compound Variable Pretty Printer (cpvprint)" \ + "" \ + "$(prettyprint_compoundvar tree)" | iconv -f "UTF-8" - - + ;; + 'list') + set | egrep '^tree.' | sed 's/^tree\.//' | egrep -v '^[[:alnum:]]+(\.([[:alnum:]\.]+)(\[.*\])*)*=\(' + ;; + 'fulllist') + set | egrep "^tree." + ;; + *) + fatal_error $"Unsupported format." + ;; +esac + +exit 0 +# EOF. |