#!/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.