xref: /titanic_51/usr/src/cmd/ast/libshell/common/scripts/simplefiletree1.sh (revision b4dd7d09880f14016feece03929a224eca1cf39a)
1*b4dd7d09SAndy Fiddaman#!/usr/bin/ksh93
2*b4dd7d09SAndy Fiddaman
3*b4dd7d09SAndy Fiddaman#
4*b4dd7d09SAndy Fiddaman# CDDL HEADER START
5*b4dd7d09SAndy Fiddaman#
6*b4dd7d09SAndy Fiddaman# The contents of this file are subject to the terms of the
7*b4dd7d09SAndy Fiddaman# Common Development and Distribution License (the "License").
8*b4dd7d09SAndy Fiddaman# You may not use this file except in compliance with the License.
9*b4dd7d09SAndy Fiddaman#
10*b4dd7d09SAndy Fiddaman# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
11*b4dd7d09SAndy Fiddaman# or http://www.opensolaris.org/os/licensing.
12*b4dd7d09SAndy Fiddaman# See the License for the specific language governing permissions
13*b4dd7d09SAndy Fiddaman# and limitations under the License.
14*b4dd7d09SAndy Fiddaman#
15*b4dd7d09SAndy Fiddaman# When distributing Covered Code, include this CDDL HEADER in each
16*b4dd7d09SAndy Fiddaman# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
17*b4dd7d09SAndy Fiddaman# If applicable, add the following below this CDDL HEADER, with the
18*b4dd7d09SAndy Fiddaman# fields enclosed by brackets "[]" replaced with your own identifying
19*b4dd7d09SAndy Fiddaman# information: Portions Copyright [yyyy] [name of copyright owner]
20*b4dd7d09SAndy Fiddaman#
21*b4dd7d09SAndy Fiddaman# CDDL HEADER END
22*b4dd7d09SAndy Fiddaman#
23*b4dd7d09SAndy Fiddaman
24*b4dd7d09SAndy Fiddaman#
25*b4dd7d09SAndy Fiddaman# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
26*b4dd7d09SAndy Fiddaman#
27*b4dd7d09SAndy Fiddaman
28*b4dd7d09SAndy Fiddaman#
29*b4dd7d09SAndy Fiddaman# simplefiletree1 - build a simple file tree
30*b4dd7d09SAndy Fiddaman#
31*b4dd7d09SAndy Fiddaman
32*b4dd7d09SAndy Fiddaman# Solaris needs /usr/xpg6/bin:/usr/xpg4/bin because the tools in /usr/bin are not POSIX-conformant
33*b4dd7d09SAndy Fiddamanexport PATH=/usr/xpg6/bin:/usr/xpg4/bin:/bin:/usr/bin
34*b4dd7d09SAndy Fiddaman
35*b4dd7d09SAndy Fiddaman# Make sure all math stuff runs in the "C" locale to avoid problems
36*b4dd7d09SAndy Fiddaman# with alternative # radix point representations (e.g. ',' instead of
37*b4dd7d09SAndy Fiddaman# '.' in de_DE.*-locales). This needs to be set _before_ any
38*b4dd7d09SAndy Fiddaman# floating-point constants are defined in this script).
39*b4dd7d09SAndy Fiddamanif [[ "${LC_ALL}" != "" ]] ; then
40*b4dd7d09SAndy Fiddaman    export \
41*b4dd7d09SAndy Fiddaman        LC_MONETARY="${LC_ALL}" \
42*b4dd7d09SAndy Fiddaman        LC_MESSAGES="${LC_ALL}" \
43*b4dd7d09SAndy Fiddaman        LC_COLLATE="${LC_ALL}" \
44*b4dd7d09SAndy Fiddaman        LC_CTYPE="${LC_ALL}"
45*b4dd7d09SAndy Fiddaman        unset LC_ALL
46*b4dd7d09SAndy Fiddamanfi
47*b4dd7d09SAndy Fiddamanexport LC_NUMERIC=C
48*b4dd7d09SAndy Fiddaman
49*b4dd7d09SAndy Fiddaman
50*b4dd7d09SAndy Fiddamanfunction add_file_to_tree
51*b4dd7d09SAndy Fiddaman{
52*b4dd7d09SAndy Fiddaman	typeset treename=$1
53*b4dd7d09SAndy Fiddaman	typeset filename=$2
54*b4dd7d09SAndy Fiddaman	integer i
55*b4dd7d09SAndy Fiddaman	typeset nodepath # full name of compound variable
56*b4dd7d09SAndy Fiddaman	typeset -a pe # path elements
57*b4dd7d09SAndy Fiddaman
58*b4dd7d09SAndy Fiddaman	# first built an array containing the names of each path element
59*b4dd7d09SAndy Fiddaman	# (e.g. "foo/var/baz"" results in an array containing "( 'foo' 'bar' 'baz' )")
60*b4dd7d09SAndy Fiddaman	typeset IFS='/'
61*b4dd7d09SAndy Fiddaman	pe+=( ${filename} )
62*b4dd7d09SAndy Fiddaman
63*b4dd7d09SAndy Fiddaman	[[ ${pe[0]} == '' ]] && pe[0]='/'
64*b4dd7d09SAndy Fiddaman
65*b4dd7d09SAndy Fiddaman	# walk path described via the "pe" array and build nodes if
66*b4dd7d09SAndy Fiddaman	# there aren't any nodes yet
67*b4dd7d09SAndy Fiddaman	nodepath="${treename}"
68*b4dd7d09SAndy Fiddaman	for (( i=0 ; i < (${#pe[@]}-1) ; i++ )) ; do
69*b4dd7d09SAndy Fiddaman		nameref x="${nodepath}"
70*b4dd7d09SAndy Fiddaman
71*b4dd7d09SAndy Fiddaman		# [[ -v ]] does not work for arrays because [[ -v ar ]]
72*b4dd7d09SAndy Fiddaman		# is equal to [[ -v ar[0] ]]. In this case we can
73*b4dd7d09SAndy Fiddaman		# use the output of typeset +p x.nodes
74*b4dd7d09SAndy Fiddaman		[[ "${ typeset +p x.nodes ; }" == "" ]] && compound -A x.nodes
75*b4dd7d09SAndy Fiddaman
76*b4dd7d09SAndy Fiddaman		nodepath+=".nodes[${pe[i]}]"
77*b4dd7d09SAndy Fiddaman	done
78*b4dd7d09SAndy Fiddaman
79*b4dd7d09SAndy Fiddaman	# insert element
80*b4dd7d09SAndy Fiddaman	nameref node="${nodepath}"
81*b4dd7d09SAndy Fiddaman	[[ "${ typeset +p node.elements ; }" == "" ]] && typeset -a node.elements
82*b4dd7d09SAndy Fiddaman	node.elements+=( "${pe[i]}" )
83*b4dd7d09SAndy Fiddaman
84*b4dd7d09SAndy Fiddaman	return 0
85*b4dd7d09SAndy Fiddaman}
86*b4dd7d09SAndy Fiddaman
87*b4dd7d09SAndy Fiddaman# main
88*b4dd7d09SAndy Fiddamanbuiltin rev
89*b4dd7d09SAndy Fiddaman
90*b4dd7d09SAndy Fiddaman# tree base
91*b4dd7d09SAndy Fiddamancompound filetree
92*b4dd7d09SAndy Fiddaman
93*b4dd7d09SAndy Fiddaman# benchmark data
94*b4dd7d09SAndy Fiddamancompound bench=(
95*b4dd7d09SAndy Fiddaman	float start
96*b4dd7d09SAndy Fiddaman	float stop
97*b4dd7d09SAndy Fiddaman)
98*b4dd7d09SAndy Fiddaman
99*b4dd7d09SAndy Fiddamantypeset i
100*b4dd7d09SAndy Fiddaman
101*b4dd7d09SAndy Fiddaman# argument prechecks
102*b4dd7d09SAndy Fiddamanif (( $# == 0 )) ; then
103*b4dd7d09SAndy Fiddaman	print -u2 -f "%s: Missing <path> argument." "$0"
104*b4dd7d09SAndy Fiddaman	exit 1
105*b4dd7d09SAndy Fiddamanfi
106*b4dd7d09SAndy Fiddaman
107*b4dd7d09SAndy Fiddamanprint -u2 "# reading file names"
108*b4dd7d09SAndy Fiddamanwhile (( $# > 0 )) ; do
109*b4dd7d09SAndy Fiddaman	IFS=$'\n' ; typeset -a filenames=( $(find "$1" -type f) ) ; IFS=$' \t\n'
110*b4dd7d09SAndy Fiddaman	shift
111*b4dd7d09SAndy Fiddamandone
112*b4dd7d09SAndy Fiddamanprint -u2 "# building tree..."
113*b4dd7d09SAndy Fiddaman
114*b4dd7d09SAndy Fiddaman(( bench.start=SECONDS ))
115*b4dd7d09SAndy Fiddaman
116*b4dd7d09SAndy Fiddamanfor ((i=0 ; i < ${#filenames[@]} ; i++ )) ; do
117*b4dd7d09SAndy Fiddaman	add_file_to_tree filetree "${filenames[i]}"
118*b4dd7d09SAndy Fiddamandone
119*b4dd7d09SAndy Fiddaman
120*b4dd7d09SAndy Fiddaman(( bench.stop=SECONDS ))
121*b4dd7d09SAndy Fiddaman
122*b4dd7d09SAndy Fiddaman# print benchmark data
123*b4dd7d09SAndy Fiddamanprint -u2 -f "# time used: %f\n" $((bench.stop - bench.start))
124*b4dd7d09SAndy Fiddaman
125*b4dd7d09SAndy Fiddaman# print tree
126*b4dd7d09SAndy Fiddamanprint -v filetree
127*b4dd7d09SAndy Fiddaman
128*b4dd7d09SAndy Fiddamanexit 0
129*b4dd7d09SAndy Fiddaman# EOF.
130