34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#!/usr/bin/ksh93
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# CDDL HEADER START
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# The contents of this file are subject to the terms of the
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Common Development and Distribution License (the "License").
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# You may not use this file except in compliance with the License.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# or http://www.opensolaris.org/os/licensing.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# See the License for the specific language governing permissions
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# and limitations under the License.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# When distributing Covered Code, include this CDDL HEADER in each
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# If applicable, add the following below this CDDL HEADER, with the
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# fields enclosed by brackets "[]" replaced with your own identifying
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# information: Portions Copyright [yyyy] [name of copyright owner]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# CDDL HEADER END
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# cpvprint - compound variable pretty printer
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Solaris needs /usr/xpg6/bin:/usr/xpg4/bin because the tools in /usr/bin are not POSIX-conformant
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexport PATH=/usr/xpg6/bin:/usr/xpg4/bin:/bin:/usr/bin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Make sure all math stuff runs in the "C" locale to avoid problems
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# with alternative # radix point representations (e.g. ',' instead of
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# '.' in de_DE.*-locales). This needs to be set _before_ any
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# floating-point constants are defined in this script).
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif [[ "${LC_ALL}" != "" ]] ; then
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz export \
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz LC_MONETARY="${LC_ALL}" \
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz LC_MESSAGES="${LC_ALL}" \
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz LC_COLLATE="${LC_ALL}" \
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz LC_CTYPE="${LC_ALL}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz unset LC_ALL
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexport LC_NUMERIC=C
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfunction fatal_error
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -u2 "${progname}: $*"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz exit 1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfunction prettyprint_compoundvar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz nameref var=$1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz # print tree
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz str="${ print -v var ; }"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz # do some "pretty-printing" for human users (the output is still a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz # valid compound variable value)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz # (note: This does not scale well with large files)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz str="${str//$'\t'typeset -l -E /$'\t'float }"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz str="${str//$'\t'typeset -l -i /$'\t'integer }"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz str="${str//$'\t'typeset -C /$'\t'compound }"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -r -- "${str}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return 0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfunction usage
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz OPTIND=0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz getopts -a "${progname}" "${cpvprint_usage}" OPT '-?'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz exit 2
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# HTML constants
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcompound -r hc=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz compound -r doctype=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz compound -r xhtml=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz 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'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz compound -r namespace=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset -r xhtml=$'http://www.w3.org/1999/xhtml'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset -r xml_head=$'<?xml version="1.0" encoding="UTF-8"?>\n'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# main
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzbuiltin basename
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzset -o noglob
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzset -o errexit
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzset -o nounset
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# tree variable
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcompound tree
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztypeset progname="${ basename "${0}" ; }"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztypeset -r cpvprint_usage=$'+
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[-?\n@(#)\$Id: cpvprint (Roland Mainz) 2009-06-15 \$\n]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[-author?Roland Mainz <roland.mainz@nrubsig.org>]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[+NAME?cpvprint - render compound variable trees in various formats]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[+DESCRIPTION?\bcpvprint\b is converter which reads a ksh compound
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz variable and prints it on a different format. Supported
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz formats are \'default\', \'altdefault\',
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz \'tree\', \'alttree\',
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz \'pretty\', \'pretty.html\', \'list\' and \'fulllist\']
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzformat [ arguments ]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[+SEE ALSO?\bksh93\b(1), \bcpvlint\b(1)]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzwhile getopts -a "${progname}" "${cpvprint_usage}" OPT ; do
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case ${OPT} in
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *) usage ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz esac
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdone
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzshift $((OPTIND-1))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# prechecks
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz(( $# > 0 )) || usage
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzprintformat="$1"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzshift
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# read variable
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcase $# in
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz 0)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz read -C tree || fatal_error $"Read error."
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz 1)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz integer fd
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz redirect {fd}<> "$1" || fatal_error $"Cannot open file."
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz read -u${fd} -C tree || fatal_error $"Read error."
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz redirect {fd}<&- || fatal_error $"Close error."
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz 2)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -u2 -f $"%s: Unsupported number of arguments.\n" "$0"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz exit 1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzesac
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# print variable
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcase ${printformat} in
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz 'default' | 'tree')
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -v tree
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz 'altdefault' | 'alttree')
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -C tree
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz 'pretty')
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz # print variable tree (same as $ print -v filetree # except that it "looks better")
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz prettyprint_compoundvar tree
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz 'pretty.html')
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz 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' \
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "${hc.xml_head}" \
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "${hc.doctype.xhtml.transitional}" \
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "${hc.namespace.xhtml}" \
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "ksh Compound Variable Pretty Printer (cpvprint)" \
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "" \
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "$(prettyprint_compoundvar tree)" | iconv -f "UTF-8" - -
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz 'list')
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz set | egrep '^tree.' | sed 's/^tree\.//' | egrep -v '^[[:alnum:]]+(\.([[:alnum:]\.]+)(\[.*\])*)*=\('
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz 'fulllist')
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz set | egrep "^tree."
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz fatal_error $"Unsupported format."
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzesac
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexit 0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# EOF.