xref: /titanic_41/usr/src/lib/libshell/common/scripts/simplefiletree1.sh (revision 3e14f97f673e8a630f076077de35afdd43dc1587)
134f9b3eeSRoland Mainz#!/usr/bin/ksh93
234f9b3eeSRoland Mainz
334f9b3eeSRoland Mainz#
434f9b3eeSRoland Mainz# CDDL HEADER START
534f9b3eeSRoland Mainz#
634f9b3eeSRoland Mainz# The contents of this file are subject to the terms of the
734f9b3eeSRoland Mainz# Common Development and Distribution License (the "License").
834f9b3eeSRoland Mainz# You may not use this file except in compliance with the License.
934f9b3eeSRoland Mainz#
1034f9b3eeSRoland Mainz# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1134f9b3eeSRoland Mainz# or http://www.opensolaris.org/os/licensing.
1234f9b3eeSRoland Mainz# See the License for the specific language governing permissions
1334f9b3eeSRoland Mainz# and limitations under the License.
1434f9b3eeSRoland Mainz#
1534f9b3eeSRoland Mainz# When distributing Covered Code, include this CDDL HEADER in each
1634f9b3eeSRoland Mainz# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1734f9b3eeSRoland Mainz# If applicable, add the following below this CDDL HEADER, with the
1834f9b3eeSRoland Mainz# fields enclosed by brackets "[]" replaced with your own identifying
1934f9b3eeSRoland Mainz# information: Portions Copyright [yyyy] [name of copyright owner]
2034f9b3eeSRoland Mainz#
2134f9b3eeSRoland Mainz# CDDL HEADER END
2234f9b3eeSRoland Mainz#
2334f9b3eeSRoland Mainz
2434f9b3eeSRoland Mainz#
25*3e14f97fSRoger A. Faulkner# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
2634f9b3eeSRoland Mainz#
2734f9b3eeSRoland Mainz
2834f9b3eeSRoland Mainz#
2934f9b3eeSRoland Mainz# simplefiletree1 - build a simple file tree
3034f9b3eeSRoland Mainz#
3134f9b3eeSRoland Mainz
3234f9b3eeSRoland Mainz# Solaris needs /usr/xpg6/bin:/usr/xpg4/bin because the tools in /usr/bin are not POSIX-conformant
3334f9b3eeSRoland Mainzexport PATH=/usr/xpg6/bin:/usr/xpg4/bin:/bin:/usr/bin
3434f9b3eeSRoland Mainz
3534f9b3eeSRoland Mainz# Make sure all math stuff runs in the "C" locale to avoid problems
3634f9b3eeSRoland Mainz# with alternative # radix point representations (e.g. ',' instead of
3734f9b3eeSRoland Mainz# '.' in de_DE.*-locales). This needs to be set _before_ any
3834f9b3eeSRoland Mainz# floating-point constants are defined in this script).
3934f9b3eeSRoland Mainzif [[ "${LC_ALL}" != "" ]] ; then
4034f9b3eeSRoland Mainz    export \
4134f9b3eeSRoland Mainz        LC_MONETARY="${LC_ALL}" \
4234f9b3eeSRoland Mainz        LC_MESSAGES="${LC_ALL}" \
4334f9b3eeSRoland Mainz        LC_COLLATE="${LC_ALL}" \
4434f9b3eeSRoland Mainz        LC_CTYPE="${LC_ALL}"
4534f9b3eeSRoland Mainz        unset LC_ALL
4634f9b3eeSRoland Mainzfi
4734f9b3eeSRoland Mainzexport LC_NUMERIC=C
4834f9b3eeSRoland Mainz
4934f9b3eeSRoland Mainz
5034f9b3eeSRoland Mainzfunction add_file_to_tree
5134f9b3eeSRoland Mainz{
5234f9b3eeSRoland Mainz	typeset treename=$1
5334f9b3eeSRoland Mainz	typeset filename=$2
5434f9b3eeSRoland Mainz	integer i
5534f9b3eeSRoland Mainz	typeset nodepath # full name of compound variable
5634f9b3eeSRoland Mainz	typeset -a pe # path elements
5734f9b3eeSRoland Mainz
5834f9b3eeSRoland Mainz	# first built an array containing the names of each path element
5934f9b3eeSRoland Mainz	# (e.g. "foo/var/baz"" results in an array containing "( 'foo' 'bar' 'baz' )")
6034f9b3eeSRoland Mainz	typeset IFS='/'
6134f9b3eeSRoland Mainz	pe+=( ${filename} )
6234f9b3eeSRoland Mainz
6334f9b3eeSRoland Mainz	[[ ${pe[0]} == '' ]] && pe[0]='/'
6434f9b3eeSRoland Mainz
6534f9b3eeSRoland Mainz	# walk path described via the "pe" array and build nodes if
6634f9b3eeSRoland Mainz	# there aren't any nodes yet
6734f9b3eeSRoland Mainz	nodepath="${treename}"
6834f9b3eeSRoland Mainz	for (( i=0 ; i < (${#pe[@]}-1) ; i++ )) ; do
6934f9b3eeSRoland Mainz		nameref x="${nodepath}"
70*3e14f97fSRoger A. Faulkner
71*3e14f97fSRoger A. Faulkner		# [[ -v ]] does not work for arrays because [[ -v ar ]]
72*3e14f97fSRoger A. Faulkner		# is equal to [[ -v ar[0] ]]. In this case we can
73*3e14f97fSRoger A. Faulkner		# use the output of typeset +p x.nodes
74*3e14f97fSRoger A. Faulkner		[[ "${ typeset +p x.nodes ; }" == "" ]] && compound -A x.nodes
7534f9b3eeSRoland Mainz
7634f9b3eeSRoland Mainz		nodepath+=".nodes[${pe[i]}]"
7734f9b3eeSRoland Mainz	done
7834f9b3eeSRoland Mainz
7934f9b3eeSRoland Mainz	# insert element
8034f9b3eeSRoland Mainz	nameref node="${nodepath}"
81*3e14f97fSRoger A. Faulkner	[[ "${ typeset +p node.elements ; }" == "" ]] && typeset -a node.elements
8234f9b3eeSRoland Mainz	node.elements+=( "${pe[i]}" )
8334f9b3eeSRoland Mainz
8434f9b3eeSRoland Mainz	return 0
8534f9b3eeSRoland Mainz}
8634f9b3eeSRoland Mainz
8734f9b3eeSRoland Mainz# main
8834f9b3eeSRoland Mainzbuiltin rev
8934f9b3eeSRoland Mainz
9034f9b3eeSRoland Mainz# tree base
9134f9b3eeSRoland Mainzcompound filetree
9234f9b3eeSRoland Mainz
9334f9b3eeSRoland Mainz# benchmark data
9434f9b3eeSRoland Mainzcompound bench=(
9534f9b3eeSRoland Mainz	float start
9634f9b3eeSRoland Mainz	float stop
9734f9b3eeSRoland Mainz)
9834f9b3eeSRoland Mainz
9934f9b3eeSRoland Mainztypeset i
10034f9b3eeSRoland Mainz
10134f9b3eeSRoland Mainz# argument prechecks
10234f9b3eeSRoland Mainzif (( $# == 0 )) ; then
10334f9b3eeSRoland Mainz	print -u2 -f "%s: Missing <path> argument." "$0"
10434f9b3eeSRoland Mainz	exit 1
10534f9b3eeSRoland Mainzfi
10634f9b3eeSRoland Mainz
10734f9b3eeSRoland Mainzprint -u2 "# reading file names"
10834f9b3eeSRoland Mainzwhile (( $# > 0 )) ; do
10934f9b3eeSRoland Mainz	IFS=$'\n' ; typeset -a filenames=( $(find "$1" -type f) ) ; IFS=$' \t\n'
11034f9b3eeSRoland Mainz	shift
11134f9b3eeSRoland Mainzdone
11234f9b3eeSRoland Mainzprint -u2 "# building tree..."
11334f9b3eeSRoland Mainz
11434f9b3eeSRoland Mainz(( bench.start=SECONDS ))
11534f9b3eeSRoland Mainz
11634f9b3eeSRoland Mainzfor ((i=0 ; i < ${#filenames[@]} ; i++ )) ; do
11734f9b3eeSRoland Mainz	add_file_to_tree filetree "${filenames[i]}"
11834f9b3eeSRoland Mainzdone
11934f9b3eeSRoland Mainz
12034f9b3eeSRoland Mainz(( bench.stop=SECONDS ))
12134f9b3eeSRoland Mainz
12234f9b3eeSRoland Mainz# print benchmark data
12334f9b3eeSRoland Mainzprint -u2 -f "# time used: %f\n" $((bench.stop - bench.start))
12434f9b3eeSRoland Mainz
12534f9b3eeSRoland Mainz# print tree
12634f9b3eeSRoland Mainzprint -v filetree
12734f9b3eeSRoland Mainz
12834f9b3eeSRoland Mainzexit 0
12934f9b3eeSRoland Mainz# EOF.
130