numtree1.sh revision 3e14f97f673e8a630f076077de35afdd43dc1587
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# CDDL HEADER START
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# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# See the License for the specific language governing permissions
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# and limitations under the License.
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# CDDL HEADER END
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# numtree1 - basic compound variable tree demo+benchmark
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# 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 Mainz typeset nodepath # full name of compound variable
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz # first built an array containing the names of each path element
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz # (e.g. "135" results in an array containing "( 1 3 5 )")
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner # 10#<number> is used to prevent leading zeros being interpreted
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner for (( len=${#revnums} , i=$( printf "10#%s\n" "${revnums}" ) ; len > 0 ; len--, i=i/10 )) ; do
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz # walk path described via the "pe" array and build nodes if
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner # [[ -v ]] does not work for arrays because [[ -v ar ]]
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner # is equal to [[ -v ar[0] ]]. In this case we can
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ "${ typeset +p x.nodes ;}" == "" ]] && compound -a x.nodes
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ "${ typeset +p node.elements ;}" == "" ]] && integer -a node.elements
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ "${!node.elements[*]}" != "" ]] || fatal_error "assertion $LINENO FAILED"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ "${ typeset +p node.elements ;}" == *-a* ]] || fatal_error "assertion $LINENO FAILED"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ "${ typeset +p node.elements ;}" == *-i* ]] || fatal_error "assertion $LINENO FAILED"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ -v node ]] || fatal_error "assertion $LINENO FAILED"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ -R node ]] || fatal_error "assertion $LINENO FAILED"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ "${ typeset +p ${!node} ;}" == *-C* ]] || fatal_error "assertion $LINENO FAILED"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ "${!x.nodes[*]}" != "" ]] || fatal_error "assertion $LINENO FAILED"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ "${ typeset +p x.nodes ;}" == *-a* ]] || fatal_error "assertion $LINENO FAILED"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ "${ typeset +p x.nodes ;}" == *-C* ]] || fatal_error "assertion $LINENO FAILED"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# floating-point version of "seq"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -u2 -f "%s: Illegal number of arguments %d\n" "$0" $#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz getopts -a "${progname}" "${numtree1_usage}" OPT '-?'
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner[-?\n@(#)\$Id: numtree1 (Roland Mainz) 2010-03-27 \$\n]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[-author?Roland Mainz <roland.mainz@nrubsig.org>]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[+NAME?numtree1 - generate sorted variable tree containing numbers]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[+DESCRIPTION?\bnumtree1\b is a simple variable tree generator
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sorts a given set of numbers into a ksh compound variable tree).
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz the application supports two different modes: \'seq\' takes
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz 1-3 arguments to specify the set of numbers via seq(1) and
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz \'stdin\' reads the numbers from stdin (one per line)]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzmethod [ arguments ]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[+SEE ALSO?\bksh93\b(1), \bseq\b(1)]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzwhile getopts -a "${progname}" "${numtree1_usage}" OPT ; do
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Read numbers from stdin outside benchmark loop
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz stdin_numbers="$( cat /dev/stdin )" || fatal_error "stdin read error"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz for i in 1 32 33 34 34 38 90 ; do
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz for (( i=1000000000 ; i < 1000000000+10 ; i++ )) ; do
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzprint -u2 -f "# time used: %f\n" $((bench.stop - bench.start))