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