home *** CD-ROM | disk | FTP | other *** search
Text File | 2000-01-26 | 62.4 KB | 1,998 lines |
- #!/bin/sh
- ##
- ## shtool -- Portable Shell Tool
- ## Copyright (c) 1999 Ralf S. Engelschall, All Rights Reserved.
- ## Version 1.2.3 (06-May-1999)
- ##
-
- ##
- ## LICENSE
- ## =======
- ##
- ## ====================================================================
- ## Copyright (c) 1994-1999 Ralf S. Engelschall. All rights reserved.
- ##
- ## Redistribution and use in source and binary forms, with or without
- ## modification, are permitted provided that the following conditions
- ## are met:
- ##
- ## 1. Redistributions of source code must retain the above copyright
- ## notice, this list of conditions and the following disclaimer.
- ##
- ## 2. Redistributions in binary form must reproduce the above copyright
- ## notice, this list of conditions and the following disclaimer in
- ## the documentation and/or other materials provided with the
- ## distribution.
- ##
- ## 3. All advertising materials mentioning features or use of this
- ## software must display the following acknowledgment:
- ## "This product includes software developed by
- ## Ralf S. Engelschall <rse@engelschall.com>."
- ##
- ## 4. Redistributions of any form whatsoever must retain the following
- ## acknowledgment:
- ## "This product includes software developed by
- ## Ralf S. Engelschall <rse@engelschall.com>."
- ##
- ## THIS SOFTWARE IS PROVIDED BY RALF S. ENGELSCHALL ``AS IS'' AND ANY
- ## EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- ## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- ## PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RALF S. ENGELSCHALL OR
- ## ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- ## NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- ## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- ## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- ## STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ## ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- ## OF THE POSSIBILITY OF SUCH DAMAGE.
- ## ====================================================================
- ##
- ## This product includes software developed by the Apache Group
- ## for use in the Apache HTTP server project (http://www.apache.org/)
- ##
-
- ##
- ## Usage: shtool <command> [<options>] [<args>]
- ##
- ## Available commands:
- ## echo Print command with optional construct expansion
- ## table Pretty print a field-sperarated list as a table
- ## prop Display a process indication though a running propeller
- ## move Move files with simultan substitution and optimized movement
- ## install Install a program, script or datafile
- ## mkdir Make a directory
- ## mkln Extended ln(1) command which calculates relative links
- ## mkshadow Create a shadow tree
- ## fixperm Fix file permission inside a source tree
- ## guessos Simple OS/Platform guesser
- ## arx Archive (ar) wrapper command.
- ## slo Separate Linker Options by library class
- ## version Generate and maintain a version information file
- ## path Deal with $PATH variables
- ##
-
- if [ $# -eq 0 ]; then
- echo "$0:Error: Invalid command line" 1>&2
- fi
- if [ $# -eq 0 -o ".$1" = .-h ]; then
- echo "$0:Usage: shtool <command> [<options>] [<args>]"
- echo ""
- echo "Available commands are:"
- echo ""
- echo ' echo [-n] [-e] <string> [<string> ...]'
- echo ' table [-F <sep>] [-w <width>] [-c <cols>] [-s <strip>]'
- echo ' <str><sep><str><sep><str>...'
- echo ' prop [-p <prefix>]'
- echo ' move [-e] [-p] <src> <dst>'
- echo ' install [-c] [-m <mode>] [-o <owner>] [-g <group>]'
- echo ' [-s] [-S <stripflags>] [-e <extension>] <file> <dir-or-file>'
- echo ' mkdir [-f] [-p] [-m <mode>] <dir> [<dir> ...]'
- echo ' mkln [-v] [-f] [-s] <src> [<src> ...] <dst>'
- echo ' mkshadow <srcdir> <dstdir>'
- echo ' fixperm <file-or-dir> [<file-or-dir> ...]'
- echo ' guessos '
- echo ' arx [-v] <ar-prg> <ar-cmd> <archive> <file> [<file>'
- echo ' ...]'
- echo ' slo -Lxx -lxx [ -Lxx -lxx ... ]'
- echo ' version [-l <lang>] [-n <name>] [-p <prefix>] [-s'
- echo ' <version>] [-i <knob>] [-d <type>] <file>'
- echo ' path [-s] [-r] [-d] [-b] [-m] [-p <path>] <string>'
- echo ' [<string> ...]'
- echo ""
- exit 1
- fi
- if [ ".$1" = .-v ]; then
- echo "shtool 1.2.3 (06-May-1999)"
- exit 0
- fi
- util=$1
- shift
- case $util in
-
- echo )
- #
- # command line parsing
- #
- newline="\n"
- expand=no
- while [ ".$1" != . ]; do
- case $1 in
- -n ) newline=""; shift; continue ;;
- -e ) expand=yes; shift; continue ;;
- * ) break ;;
- esac
- done
- text="$*"
-
- #
- # check for broken escape sequence expansion
- #
- seo=''
- bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'`
- if [ ".$bytes" != .3 ]; then
- bytes=`echo -E '\1' | wc -c | awk '{ printf("%s", $1); }'`
- if [ ".$bytes" = .3 ]; then
- seo='-E'
- fi
- fi
-
- #
- # determine terminal bold sequence
- #
- term_bold=''
- tern_norm=''
- if [ $expand = yes -a ".`echo $text | egrep '%[Bb]'`" != . ]; then
- case $TERM in
- xterm|xterm*|vt220|vt220*)
- term_bold=`echo dummy | awk '{ printf("%c%c%c%c", 27, 91, 49, 109); }'`
- term_norm=`echo dummy | awk '{ printf("%c%c%c", 27, 91, 109); }'`
- ;;
- vt100|vt100*)
- term_bold=`echo dummy | awk '{ printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }'`
- term_norm=`echo dummy | awk '{ printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }'`
- ;;
- esac
- if [ ".$term_bold" = . -o ".$term_norm" = . ]; then
- md="`tput md 2>/dev/null`"
- me="`tput me 2>/dev/null`"
- if [ ".$md" != . -a ".$me" != . ]; then
- term_bold="$xmd"
- term_norm="$xme"
- fi
- fi
- if [ ".$term_bold" = . -o ".$term_norm" = . ]; then
- echo "$0:Warning: unable to determine terminal sequence for bold mode" 1>&2
- fi
- fi
-
- #
- # determine user name
- #
- username=''
- if [ $expand = yes -a ".`echo $text | egrep '%[uU]'`" != . ]; then
- username="$LOGNAME"
- if [ ".$username" = . ]; then
- username="$USER"
- if [ ".$username" = . ]; then
- username="`(whoami) 2>/dev/null |\
- awk '{ printf("%s", $1); }'`"
- if [ ".$username" = . ]; then
- username="`(who am i) 2>/dev/null |\
- awk '{ printf("%s", $1); }'`"
- if [ ".$username" = . ]; then
- username='unknown'
- fi
- fi
- fi
- fi
- fi
-
- #
- # determine user id
- #
- userid=''
- if [ $expand = yes -a ".`echo $text | egrep '%U'`" != . ]; then
- userid="`(id -u) 2>/dev/null`"
- if [ ".$userid" = . ]; then
- str="`(id) 2>/dev/null`"
- if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then
- userid=`echo $str | sed -e 's/^uid[ ]*=[ ]*//' -e 's/(.*//'`
- fi
- if [ ".$userid" = . ]; then
- userid=`egrep "^${username}:" /etc/passwd 2>/dev/null | \
- sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
- if [ ".$userid" = . ]; then
- userid=`(ypcat passwd) 2>/dev/null |
- egrep "^${username}:" | \
- sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
- if [ ".$userid" = . ]; then
- userid='?'
- fi
- fi
- fi
- fi
- fi
-
- #
- # determine host name
- #
- hostname=''
- if [ $expand = yes -a ".`echo $text | egrep '%h'`" != . ]; then
- hostname="`(uname -n) 2>/dev/null |\
- awk '{ printf("%s", $1); }'`"
- if [ ".$hostname" = . ]; then
- hostname="`(hostname) 2>/dev/null |\
- awk '{ printf("%s", $1); }'`"
- if [ ".$hostname" = . ]; then
- hostname='unknown'
- fi
- fi
- case $hostname in
- *.* )
- domainname=".`echo $hostname | cut -d. -f2-`"
- hostname="`echo $hostname | cut -d. -f1`"
- ;;
- esac
- fi
-
- #
- # determine domain name
- #
- domainname=''
- if [ $expand = yes -a ".`echo $text | egrep '%d'`" != . ]; then
- if [ ".$domainname" = . ]; then
- if [ -f /etc/resolv.conf ]; then
- domainname="`egrep '^[ ]*domain' /etc/resolv.conf | head -1 |\
- sed -e 's/.*domain//' \
- -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \
- -e 's/^\.//' -e 's/^/./' |\
- awk '{ printf("%s", $1); }'`"
- if [ ".$domainname" = . ]; then
- domainname="`egrep '^[ ]*search' /etc/resolv.conf | head -1 |\
- sed -e 's/.*search//' \
- -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \
- -e 's/ .*//' -e 's/ .*//' \
- -e 's/^\.//' -e 's/^/./' |\
- awk '{ printf("%s", $1); }'`"
- fi
- fi
- fi
- fi
-
- #
- # determine current time
- #
- time_day=''
- time_month=''
- time_year=''
- time_monthname=''
- if [ $expand = yes -a ".`echo $text | egrep '%[DMYm]'`" != . ]; then
- time_day="`date '+%d' | awk '{ printf("%s", $1); }'`"
- time_month="`date '+%m' | awk '{ printf("%s", $1); }'`"
- time_year="`date '+%Y' 2>/dev/null | awk '{ printf("%s", $1); }'`"
- if test ".$time_year" = .; then
- time_year="`date '+%y' | awk '{ printf("%s", $1); }'`"
- case $time_year in
- 9[0-9]*) time_year="19$time_year" ;;
- *) time_year="20$time_year" ;;
- esac
- fi
- case $time_month in
- 1|01) time_monthname='Jan' ;;
- 2|02) time_monthname='Feb' ;;
- 3|03) time_monthname='Mar' ;;
- 4|04) time_monthname='Apr' ;;
- 5|05) time_monthname='May' ;;
- 6|06) time_monthname='Jun' ;;
- 7|07) time_monthname='Jul' ;;
- 8|08) time_monthname='Aug' ;;
- 9|09) time_monthname='Sep' ;;
- 10) time_monthname='Oct' ;;
- 11) time_monthname='Nov' ;;
- 12) time_monthname='Dec' ;;
- esac
- fi
-
- #
- # expand special ``%x'' constructs
- #
- if [ $expand = yes ]; then
- text=`echo $seo "$text" |\
- sed -e "s;%B;${term_bold};g" \
- -e "s;%b;${term_norm};g" \
- -e "s;%u;${username};g" \
- -e "s;%U;${userid};g" \
- -e "s;%h;${hostname};g" \
- -e "s;%d;${domainname};g" \
- -e "s;%D;${time_day};g" \
- -e "s;%M;${time_month};g" \
- -e "s;%Y;${time_year};g" \
- -e "s;%m;${time_monthname};g"`
- fi
-
- #
- # create output
- #
- echo dummy |\
- awk '{ printf("%s%s", TEXT, NEWLINE); }' \
- TEXT="$text" NEWLINE="$newline"
- ;;
-
- table )
- #
- # command line parsing
- #
- width=15
- cols=3
- sep=':'
- strip=79
- while [ ".$1" != . ]; do
- case $1 in
- -F ) sep="$2"; shift; shift; continue ;;
- -w ) width="$2"; shift; shift; continue ;;
- -c ) cols="$2"; shift; shift; continue ;;
- -s ) strip="$2"; shift; shift; continue ;;
- * ) break ;;
- esac
- done
- case x$sep in
- x? ) ;;
- * ) echo "$0:Error: Invalid seperator (one char allowed only)" 1>&2; exit 1 ;;
- esac
- if [ $cols -gt 4 ]; then
- echo "$0:Error: Invalid number of colums (1..4 allowed only)" 1>&2
- exit 1
- fi
-
- #
- # split the list into a table
- #
- list=`
- IFS="$sep"
- for entry in $*; do
- if [ ".$entry" != . ]; then
- echo "$entry"
- fi
- done |\
- awk "
- BEGIN { list = \"\"; n = 0; }
- {
- list = list \\$1;
- n = n + 1;
- if (n < $cols) {
- list = list \":\";
- }
- if (n == $cols) {
- list = list \"\\n\";
- n = 0;
- }
- }
- END { print list; }
- "
- `
-
- #
- # format table cells and make sure table
- # doesn't exceed maximum width
- #
- IFS='
- '
- for entry in $list; do
- case $cols in
- 1 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${width}s\\n\", \$1); }'" ;;
- 2 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${width}s %-${width}s\\n\", \$1, \$2); }'" ;;
- 3 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${width}s %-${width}s %-${width}s\\n\", \$1, \$2, \$3); }'" ;;
- 4 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${width}s %-${width}s %-${width}s %-${width}s\\n\", \$1, \$2, \$3, \$4); }'" ;;
- esac
- done |\
- awk "{
- if (length(\$0) > $strip) {
- printf(\"%s\\n\", substr(\$0, 0, $strip-1));
- } else {
- print \$0;
- }
- }"
- ;;
-
- prop )
- #
- # command line parsing
- #
- prefix=""
- while [ ".$1" != . ]; do
- case $1 in
- -p ) prefix="$2"; shift; shift; continue ;;
- * ) break ;;
- esac
- done
- if [ $# -gt 0 ]; then
- echo "$0:Error: too much arguments" 1>&2
- exit 1
- fi
-
- perl=''
- for dir in `echo $PATH | sed -e 's/:/ /g'` .; do
- if [ -f "$dir/perl" ]; then
- perl="$dir/perl"
- break
- fi
- done
- if [ ".$perl" != . ]; then
- # Perl is preferred because writing to STDERR in
- # Perl really writes immediately as one would expect
- $perl -e '
- @p = ("|","/","-","\\");
- $i = 0;
- while (<STDIN>) {
- printf(STDERR "\r%s...%s\b", $ARGV[0], $p[$i++]);
- $i = 0 if ($i > 3);
- }
- printf(STDERR "\r%s \n", $ARGV[0]);
- ' "$prefix"
- else
- # But when Perl doesn't exists we use Awk even
- # some Awk's buffer even the /dev/stderr writing :-(
- awk '
- BEGIN {
- split("|#/#-#\\", p, "#");
- i = 1;
- }
- {
- printf("\r%s%c\b", prefix, p[i++]) > "/dev/stderr";
- if (i > 4) { i = 1; }
- }
- END {
- printf("\r%s \n", prefix) > "/dev/stderr";
- }
- ' "prefix=$prefix"
- fi
- ;;
-
- move )
- #
- # command line parsing
- #
- expand=no
- preserve=no
- while [ ".$1" != . ]; do
- case $1 in
- -e ) expand=yes ; shift; continue ;;
- -p ) preserve=yes ; shift; continue ;;
- * ) break ;;
- esac
- done
- if [ $# -ne 2 ]; then
- echo "$0:Usage: move [-e] [-p] <src> <dst>" 1>&2
- exit 1
- fi
- src=$1
- dst=$2
-
- #
- # consistency checks
- #
- if [ ".$src" = . -o ".$dst" = . ]; then
- echo "$0:Error: Invalid arguments" 1>&2
- exit 1
- fi
- if [ ".$src" = ".$dst" ]; then
- echo "$0:Error: Source and destination files are the same" 1>&2
- exit 1
- fi
- expsrc="$src"
- if [ $expand = yes ]; then
- expsrc="`echo $expsrc`"
- fi
- if [ $expand = yes ]; then
- if [ ".`echo "$src" | sed -e 's;^.*\\*.*$;;'`" = ".$src" ]; then
- echo "$0:Error: Source doesn't contain wildcard ('*'): $dst" 1>&2
- exit 1
- fi
- if [ ".`echo "$dst" | sed -e 's;^.*%[1-9].*$;;'`" = ".$dst" ]; then
- echo "$0:Error: Destination doesn't contain substitution ('%N'): $dst" 1>&2
- exit 1
- fi
- if [ ".$expsrc" = ".$src" ]; then
- echo "$0:Error: Sources not found or no asterisk : $src" 1>&2
- exit 1
- fi
- else
- if [ ! -r "$src" ]; then
- echo "$0:Error: Source not found: $src" 1>&2
- exit 1
- fi
- fi
-
- #
- # determine substitution patterns
- #
- if [ $expand = yes ]; then
- srcpat=`echo "$src" | sed -e 's/\\./\\\\./g' -e 's/;/\\;/g' -e 's;\\*;\\\\(.*\\\\);g'`
- dstpat=`echo "$dst" | sed -e 's;%\([1-9]\);\\\\\1;g'`
- fi
-
- #
- # iterate over source(s)
- #
- for onesrc in $expsrc; do
- if [ $expand = yes ]; then
- onedst=`echo $onesrc | sed -e "s;$srcpat;$dstpat;"`
- else
- onedst="$dst"
- fi
- errorstatus=0
- if [ -r $onedst ]; then
- if cmp -s $onesrc $onedst; then
- rm -f $onesrc || errstatus=$?
- else
- mv -f $onesrc $onedst || errstatus=$?
- fi
- else
- mv -f $onesrc $onedst || errstatus=$?
- fi
- if [ $errorstatus -ne 0 ]; then
- break;
- fi
- done
-
- # die gracefully
- exit $errorstatus
- ;;
-
- install )
- #
- # put in absolute paths if you don't have them in your path;
- # or use env. vars.
- #
- mvprog="${MVPROG-mv}"
- cpprog="${CPPROG-cp}"
- chmodprog="${CHMODPROG-chmod}"
- chownprog="${CHOWNPROG-chown}"
- chgrpprog="${CHGRPPROG-chgrp}"
- stripprog="${STRIPPROG-strip}"
- rmprog="${RMPROG-rm}"
-
- #
- # parse argument line
- #
- instcmd="$mvprog"
- chmodcmd=""
- chowncmd=""
- chgrpcmd=""
- stripcmd=""
- rmcmd="$rmprog -f"
- mvcmd="$mvprog"
- ext=""
- src=""
- dst=""
- while [ ".$1" != . ]; do
- case $1 in
- -c) instcmd="$cpprog"
- shift; continue
- ;;
- -m) chmodcmd="$chmodprog $2"
- shift; shift; continue
- ;;
- -o) chowncmd="$chownprog $2"
- shift; shift; continue
- ;;
- -g) chgrpcmd="$chgrpprog $2"
- shift; shift; continue
- ;;
- -s) stripcmd="$stripprog"
- shift; continue;;
- -S) stripcmd="$stripprog $2"
- shift; shift; continue ;;
- -e) ext="$2"
- shift; shift; continue
- ;;
- *) if [ ".$src" = . ]; then
- src=$1
- else
- dst=$1
- fi
- shift; continue
- ;;
- esac
- done
- if [ ".$src" = . ]; then
- echo "install.sh: no input file specified"
- exit 1
- fi
- if [ ".$dst" = . ]; then
- echo "install.sh: no destination specified"
- exit 1
- fi
-
- #
- # If destination is a directory, append the input filename; if
- # your system does not like double slashes in filenames, you may
- # need to add some logic
- #
- if [ -d $dst ]; then
- dst="$dst/`basename $src`"
- fi
-
- # Add a possible extension (such as ".exe") to src and dst
- src="$src$ext"
- dst="$dst$ext"
-
- # Make a temp file name in the proper directory.
- dstdir=`dirname $dst`
- dsttmp=$dstdir/#inst.$$#
-
- # Move or copy the file name to the temp name
- $instcmd $src $dsttmp
-
- # And set any options; do chmod last to preserve setuid bits
- if [ ".$chowncmd" != . ]; then $chowncmd $dsttmp; fi
- if [ ".$chgrpcmd" != . ]; then $chgrpcmd $dsttmp; fi
- if [ ".$stripcmd" != . ]; then $stripcmd $dsttmp; fi
- if [ ".$chmodcmd" != . ]; then $chmodcmd $dsttmp; fi
-
- # Now rename the file to the real destination.
- $rmcmd $dst
- $mvcmd $dsttmp $dst
-
- exit 0
- ;;
-
- mkdir )
- # command line parsing
- mode=""
- force=0
- parent=0
- while [ ".$1" != . ]; do
- case $1 in
- -f) force=1; shift; continue ;;
- -p) parent=1; shift; continue ;;
- -m) mode="$2"; shift; shift; continue ;;
- *) break ;;
- esac
- done
- if [ $# -eq 0 ]; then
- echo "$0:Usage: mkdir [-f] [-p] [-m <mode>] <dir> [<dir> ...]" 1>&2
- exit 1
- fi
-
- errstatus=0
- for p in ${1+"$@"}; do
- # when the directory already exists...
- if [ -d "$p" ]; then
- if [ $force = 0 ]; then
- echo "$0:Error: file exists: $p" 1>&2
- errstatus=1
- break
- else
- continue
- fi
- fi
- # when the directory has to be created
- if [ $parent = 0 ]; then
- mkdir $p || errstatus=$?
- else
- # the smart situation
- set fnord `echo ":$p" |\
- sed -e 's/^:\//%/' \
- -e 's/^://' \
- -e 's/\// /g' \
- -e 's/^%/\//'`
- shift
- pathcomp=
- for d in ${1+"$@"}; do
- pathcomp="$pathcomp$d"
- case "$pathcomp" in
- -* ) pathcomp="./$pathcomp" ;;
- esac
- if [ ! -d "$pathcomp" ]; then
- mkdir $pathcomp || errstatus=$?
- if [ ".$mode" != . ]; then
- chmod $mode $pathcomp || errstatus=$?
- fi
- fi
- pathcomp="$pathcomp/"
- done
- fi
- done
- exit $errstatus
- ;;
-
- mkln )
- #
- # command line parsing
- #
- verbose=no
- force=no
- symbolic=no
- while [ ".$1" != . ]; do
- case $1 in
- -v) verbose=yes; shift; continue ;;
- -f) force=yes; shift; continue ;;
- -s) symbolic=yes; shift; continue ;;
- *) break ;;
- esac
- done
- if [ $# -lt 2 ]; then
- echo "$0:Usage: mkln [-v] [-f] [-s] <from> [<from> ...] <to>" 1>&2
- exit 1
- fi
- args=$?
- srcs=""
- while [ $# -gt 1 ]; do
- srcs="$srcs $1"
- shift
- done
- dst="$1"
- if [ ! -d $dst ]; then
- if [ $args -gt 2 ]; then
- echo "$0:Error: multiple sources not allowed when destination isn't a directory" 1>&2
- exit 1
- fi
- fi
-
- #
- # determine link options
- #
- lnopt=""
- if [ $force = yes ]; then
- lnopt="$lnopt -f"
- fi
- if [ $symbolic = yes ]; then
- lnopt="$lnopt -s"
- fi
-
- #
- # iterate over sources
- #
- for src in $srcs; do
- # debugging
- if [ $verbose = yes ]; then
- echo "src=\"$src\" dst=\"$dst\":"
- fi
-
- # determine if one of the paths is an absolute path,
- # because then we _have_ to use an absolute symlink
- oneisabs=0
- srcisabs=0
- dstisabs=0
- case $src in
- /* ) oneisabs=1; srcisabs=1 ;;
- esac
- case $dst in
- /* ) oneisabs=1; dstisabs=1 ;;
- esac
-
- # split source and destination into dir and base name
- if [ -d $src ]; then
- srcdir=`echo $src | sed -e 's;/*$;;'`
- srcbase=""
- else
- srcdir=`echo $src | sed -e 's;^[^/]*$;;' -e 's;^\(.*/\)[^/]*$;\1;' -e 's;\(.\)/$;\1;'`
- srcbase=`echo $src | sed -e 's;.*/\([^/]*\)$;\1;'`
- fi
- if [ -d $dst ]; then
- dstdir=`echo $dst | sed -e 's;/*$;;'`
- dstbase=""
- else
- dstdir=`echo $dst | sed -e 's;^[^/]*$;;' -e 's;^\(.*/\)[^/]*$;\1;' -e 's;\(.\)/$;\1;'`
- dstbase=`echo $dst | sed -e 's;.*/\([^/]*\)$;\1;'`
- fi
-
- # debugging
- if [ $verbose = yes ]; then
- echo " STATE 1:"
- echo " srcisabs=$srcisabs srcdir=\"$srcdir\" srcbase=\"$srcbase\""
- echo " dstisabs=$dstisabs dstdir=\"$dstdir\" dstbase=\"$dstbase\""
- echo " oneisabs=$oneisabs"
- fi
-
- # consistency check
- if [ ".$dstdir" != . ]; then
- if [ ! -d $dstdir ]; then
- echo "$0:Error: destination directory not found: $dstdir" 1>&2
- exit 1
- fi
- fi
-
- # make sure the source is reachable from the destination
- if [ $dstisabs = 1 ]; then
- if [ $srcisabs = 0 ]; then
- if [ -d $srcdir ]; then
- srcdir="`cd $srcdir; pwd | sed -e 's;/*$;;'`"
- srcisabs=1
- oneisabs=1
- # debugging
- if [ $verbose = yes ]; then
- echo " STATE 2:"
- echo " srcisabs=$srcisabs srcdir=\"$srcdir\" srcbase=\"$srcbase\""
- echo " dstisabs=$dstisabs dstdir=\"$dstdir\" dstbase=\"$dstbase\""
- echo " oneisabs=$oneisabs"
- fi
- fi
- fi
- fi
-
- # split away a common prefix
- prefix=""
- if [ ".$srcdir" = ".$dstdir" ] && [ ".$srcdir" != . ]; then
- prefix="$srcdir/"
- srcdir=""
- dstdir=""
- else
- while [ ".$srcdir" != . ] && [ ".$dstdir" != . ]; do
- presrc=`echo $srcdir | sed -e 's;^\([^/]*\)/.*;\1;'`
- predst=`echo $dstdir | sed -e 's;^\([^/]*\)/.*;\1;'`
- if [ ".$presrc" != ".$predst" ]; then
- break
- fi
- prefix="$prefix$presrc/"
- srcdir=`echo $srcdir | sed -e 's;^[^/]*/*;;'`
- dstdir=`echo $dstdir | sed -e 's;^[^/]*/*;;'`
- done
- fi
-
- # debugging
- if [ $verbose = yes ]; then
- echo " STATE 3:"
- echo " prefix=$prefix"
- echo " srcisabs=$srcisabs srcdir=\"$srcdir\" srcbase=\"$srcbase\""
- echo " dstisabs=$dstisabs dstdir=\"$dstdir\" dstbase=\"$dstbase\""
- echo " oneisabs=$oneisabs"
- fi
-
- # destination prefix is just the common prefix
- dstpre="$prefix"
-
- # determine source prefix which is the reverse directory
- # step-up corresponding to the destination directory
- srcpre=""
- if [ $oneisabs = 0 ] || [ ".$prefix" != . -a ".$prefix" != ./ ]; then
- pl="$dstdir/"
- OIFS="$IFS"; IFS='/'
- for pe in $pl; do
- [ ".$pe" = . ] && continue
- srcpre="../$srcpre"
- done
- IFS="$OIFS"
- else
- if [ $srcisabs = 1 ]; then
- srcpre="$prefix"
- fi
- fi
-
- # debugging
- if [ $verbose = yes ]; then
- echo " STATE 4:"
- echo " prefix=$prefix"
- echo " srcisabs=$srcisabs srcpre=\"$srcpre\" srcdir=\"$srcdir\" srcbase=\"$srcbase\""
- echo " dstisabs=$dstisabs dstpre=\"$dstpre\" dstdir=\"$dstdir\" dstbase=\"$dstbase\""
- echo " oneisabs=$oneisabs"
- fi
-
- # determine destination symlink name
- if [ ".$dstbase" = . ]; then
- if [ ".$srcbase" != . ]; then
- dstbase="$srcbase"
- else
- dstbase=`echo "$prefix$srcdir" | sed -e 's;/*$;;' -e 's;.*/\([^/]*\)$;\1;'`
- fi
- fi
-
- # now finalize source and destination directory paths
- srcdir=`echo $srcdir | sed -e 's;\([^/]\)$;\1/;'`
- dstdir=`echo $dstdir | sed -e 's;\([^/]\)$;\1/;'`
-
- # debugging
- if [ $verbose = yes ]; then
- echo " STATE 5:"
- echo " prefix=$prefix"
- echo " srcisabs=$srcisabs srcpre=\"$srcpre\" srcdir=\"$srcdir\" srcbase=\"$srcbase\""
- echo " dstisabs=$dstisabs dstpre=\"$dstpre\" dstdir=\"$dstdir\" dstbase=\"$dstbase\""
- echo " oneisabs=$oneisabs"
- fi
-
- # run the final link command
- if [ $verbose = yes ]; then
- echo " RESULT:"
- echo "ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase"
- fi
- eval ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase
- done
- exit 0
- ;;
-
- mkshadow )
- # default IFS
- DIFS='
- '
-
- # command line check
- if [ $# -ne 2 ]; then
- echo "$0:Error: Invalid aruments" 1>&2
- exit 1
- fi
-
- # source and destination directory
- src=`echo $1 | sed -e 's:/$::'`
- dst=`echo $2 | sed -e 's:/$::'`
-
- # check whether source exists
- if [ ! -d $src ]; then
- echo "$0:Error: source directory not found" 1>&2
- exit 1
- fi
-
- # determine if one of the paths is an absolute path,
- # because then we have to use an absolute symlink
- oneisabs=0
- case $src in
- /* ) oneisabs=1 ;;
- esac
- case $dst in
- /* ) oneisabs=1 ;;
- esac
-
- # determine reverse directory for destination directory
- dstrevdir=''
- if [ $oneisabs = 0 ]; then
- # (inlined fp2rp)
- OIFS="$IFS"; IFS='/'
- for pe in $dst; do
- dstrevdir="../$dstrevdir"
- done
- IFS="$OIFS"
- else
- src="`cd $src; pwd`";
- fi
-
- # create directory tree at destination
- if [ ! -d $dst ]; then
- mkdir $dst
- fi
- DIRS="`cd $src
- find . -type d -print |\
- sed -e '/\/CVS/d' \
- -e '/^\.$/d' \
- -e 's:^\./::'`"
- OIFS="$IFS" IFS="$DIFS"
- for dir in $DIRS; do
- mkdir $dst/$dir
- done
- IFS="$OIFS"
-
- # fill directory tree with symlinks to files
- FILES="`cd $src
- find . -depth -print |\
- sed -e '/\.o$/d' \
- -e '/\.a$/d' \
- -e '/\.so$/d' \
- -e '/\.so-o$/d' \
- -e '/\.cvsignore$/d' \
- -e '/\/CVS/d' \
- -e '/\.indent\.pro$/d' \
- -e '/\.apaci.*/d' \
- -e '/Makefile$/d' \
- -e '/\/\.#/d' \
- -e '/\.orig$/d' \
- -e 's/^\.\///'`"
- OIFS="$IFS" IFS="$DIFS"
- for file in $FILES; do
- # don't use `-type f' above for find because of symlinks
- if [ -d $file ]; then
- continue
- fi
- basename=`echo $file | sed -e 's:^.*/::'`
- dir=`echo $file | sed -e 's:[^/]*$::' -e 's:/$::' -e 's:$:/:' -e 's:^/$::'`
- from="$src/$file"
- to="$dst/$dir$basename"
- if [ $oneisabs = 0 ]; then
- if [ ".$dir" != . ]; then
- subdir=`echo $dir | sed -e 's:/$::'`
- # (inlined fp2rp)
- revdir=''
- OIFS2="$IFS"; IFS='/'
- for pe in $subdir; do
- revdir="../$revdir"
- done
- IFS="$OIFS2"
- # finalize from
- from="$revdir$from"
- fi
- from="$dstrevdir$from"
- fi
- echo " $to"
- ln -s $from $to
- done
- IFS="$OIFS"
- ;;
-
- fixperm )
- for p in $*; do
- for file in `find $p -depth -print`; do
- if [ -f $file ]; then
- if [ -x $file ]; then
- echo " $file (FILE/EXEC)"
- chmod 775 $file
- else
- echo " $file (FILE/REGULAR)"
- chmod 664 $file
- fi
- continue
- fi
- if [ -d $file ]; then
- echo " $file (DIR)"
- chmod 775 $file
- continue
- fi
- echo " $file (UNKNOWN)"
- done
- done
- ;;
-
- guessos )
- MACHINE=`(uname -m) 2>/dev/null` || MACHINE="unknown"
- RELEASE=`(uname -r) 2>/dev/null` || RELEASE="unknown"
- SYSTEM=`(uname -s) 2>/dev/null` || SYSTEM="unknown"
- VERSION=`(uname -v) 2>/dev/null` || VERSION="unknown"
-
- XREL=`(uname -X) 2>/dev/null | grep "^Release" | awk '{print $3}'`
- if [ "x$XREL" != "x" ]; then
- if [ -f /etc/kconfig ]; then
- case "$XREL" in
- 4.0|4.1) echo "${MACHINE}-whatever-isc4"; exit 0 ;;
- esac
- else
- case "$XREL" in
- 3.2v4.2)
- echo "whatever-whatever-sco3"; exit 0
- ;;
- 3.2v5.0*)
- echo "whatever-whatever-sco5"; exit 0
- ;;
- 4.2MP)
- if [ "x$VERSION" = "x2.1.1" ]; then
- echo "${MACHINE}-whatever-unixware211"; exit 0
- elif [ "x$VERSION" = "x2.1.2" ]; then
- echo "${MACHINE}-whatever-unixware212"; exit 0
- else
- echo "${MACHINE}-whatever-unixware2"; exit 0
- fi
- ;;
- 4.2)
- echo "whatever-whatever-unixware1"; exit 0
- ;;
- 5)
- case "$VERSION" in
- 7*) echo "${MACHINE}-whatever-unixware7"; exit 0 ;;
- esac
- ;;
- esac
- fi
- fi
- case "${SYSTEM}:${RELEASE}:${VERSION}:${MACHINE}" in
- MiNT:*)
- echo "m68k-atari-mint"; exit 0
- ;;
- A/UX:*)
- echo "m68k-apple-aux3"; exit 0
- ;;
- AIX:*)
- echo "${MACHINE}-ibm-aix${VERSION}.${RELEASE}"; exit 0
- ;;
- dgux:*)
- echo "${MACHINE}-dg-dgux"; exit 0
- ;;
- HI-UX:*)
- echo "${MACHINE}-hi-hiux"; exit 0
- ;;
- HP-UX:*)
- HPUXVER=`echo ${RELEASE}|sed -e 's/[^.]*.[0B]*//'`
- echo "${MACHINE}-hp-hpux${HPUXVER}"; exit 0
- ;;
- IRIX:*)
- if [ -f /usr/lib32/mips4/libm.so ]; then
- echo "${MACHINE}-sgi-irix32"; exit 0
- else
- echo "${MACHINE}-sgi-irix"; exit 0
- fi
- ;;
- IRIX64:*)
- echo "${MACHINE}-sgi-irix64"; exit 0
- ;;
- Linux:[2-9].*)
- echo "${MACHINE}-whatever-linux2"; exit 0
- ;;
- Linux:1.*)
- echo "${MACHINE}-whatever-linux1"; exit 0
- ;;
- LynxOS:*)
- echo "${MACHINE}-lynx-lynxos"; exit 0
- ;;
- BSD/386:*:*:*486*|BSD/OS:*:*:*:*486*)
- echo "i486-whatever-bsdi"; exit 0
- ;;
- BSD/386:*|BSD/OS:*)
- echo "${MACHINE}-whatever-bsdi"; exit 0
- ;;
- FreeBSD:*)
- VERS=`echo ${RELEASE} | sed -e 's/[-(].*//'`
- MACH=`sysctl -n hw.model`
- ARCH='whatever'
- case ${MACH} in
- *386* ) MACH="i386" ;;
- *486* ) MACH="i486" ;;
- Pentium\ II*) MACH="i686" ;;
- Pentium* ) MACH="i586" ;;
- Alpha* ) MACH="alpha" ;;
- * ) MACH="$MACHINE" ;;
- esac
- case ${MACH} in
- i[0-9]86 ) ARCH="pc" ;;
- esac
- echo "${MACH}-${ARCH}-freebsd${VERS}"; exit 0
- ;;
- NetBSD:*:*:*486*)
- echo "i486-whatever-netbsd"; exit 0
- ;;
- NetBSD:*)
- echo "${MACHINE}-whatever-netbsd"; exit 0
- ;;
- OpenBSD:*)
- echo "${MACHINE}-whatever-openbsd"; exit 0
- ;;
- OSF1:*:*:*alpha*)
- echo "${MACHINE}-dec-osf"; exit 0
- ;;
- QNX:*)
- if [ "$VERSION" -gt 422 ]; then
- echo "${MACHINE}-qssl-qnx32"
- else
- echo "${MACHINE}-qssl-qnx"
- fi
- exit 0
- ;;
- Paragon*:*:*:*)
- echo "i860-intel-osf1"; exit 0
- ;;
- SunOS:5.*)
- SOLVER=`echo ${RELEASE}|awk -F. '{
- if (NF < 3)
- printf "2%s0\n",$2
- else
- printf "2%s%s\n",$2,$3
- }'`
- echo "${MACHINE}-sun-solaris2.${SOLVER}"; exit 0
- ;;
- SunOS:*)
- echo "${MACHINE}-sun-sunos4"; exit 0
- ;;
- UNIX_System_V:4.*:*)
- echo "${MACHINE}-whatever-sysv4"; exit 0
- ;;
- unix:3.0.9*:*:88k)
- echo "${MACHINE}-encore-sysv4"; exit 0
- ;;
- *:4*:R4*:m88k)
- echo "${MACHINE}-whatever-sysv4"; exit 0
- ;;
- UnixWare:5:99*:*)
- # Gemini, beta release of next rev of unixware
- echo "${MACHINE}-whatever-unixware212"; exit 0
- ;;
- DYNIX/ptx:4*:*)
- echo "${MACHINE}-whatever-sysv4"; exit 0
- ;;
- *:4.0:3.0:[345][0-9]?? | *:4.0:3.0:3[34]??[/,]* | library:*)
- echo "x86-ncr-sysv4"; exit 0
- ;;
- ULTRIX:*)
- echo "${MACHINE}-unknown-ultrix"; exit 0
- ;;
- SINIX-?:* | ReliantUNIX-?:*)
- echo "${MACHINE}-siemens-sysv4"; exit 0
- ;;
- POSIX*BS2000)
- echo "${MACHINE}-siemens-sysv4"; exit 0
- ;;
- machten:*)
- echo "${MACHINE}-tenon-${SYSTEM}"; exit 0;
- ;;
- ConvexOS:*:11.*:*)
- echo "${MACHINE}-v11-${SYSTEM}"; exit 0;
- ;;
- UNIX_SV:*:*:maxion)
- echo "${MACHINE}-ccur-sysv4"; exit 0;
- ;;
- PowerMAX_OS:*:*:Night_Hawk)
- MACHINE=`uname -p`
- echo "${MACHINE}-concurrent-powermax"; exit 0;
- ;;
- UNIX_SV:*)
- if [ -d /usr/nec ];then
- echo "mips-nec-sysv4"; exit 0;
- fi
- ;;
- NonStop-UX:4.[02]*:[BC]*:*)
- echo "${MACHINE}-tandem-sysv4"; exit 0;
- ;;
- Rhapsody:*:*:*)
- case "${MACHINE}" in
- Power*) MACHINE=powerpc ;;
- esac
- echo "${MACHINE}-apple-rhapsody${RELEASE}"; exit 0
- ;;
- "RISC iX":*)
- echo "arm-whatever-riscix"; exit 0;
- ;;
- *:4.0:2:*)
- echo "whatever-unisys-sysv4"; exit 0;
- ;;
- *:*:dcosx:NILE*)
- echo "pyramid-pyramid-svr4"; exit 0;
- ;;
- *:*:*:"DRS 6000")
- echo "drs6000-whatever-whatever"; exit 0;
- ;;
- esac
- # existance of the /usr/apollo directory is proof enough for Apollo
- if [ -d /usr/apollo ]; then
- echo "whatever-apollo-whatever"
- exit 0
- fi
- # Now NeXT
- ISNEXT=`hostinfo 2>/dev/null`
- case "$ISNEXT" in
- *NeXT*)
- # Swiped from a friendly uname clone for NEXT/OPEN Step.
- NEXTOSVER="`hostinfo | sed -n 's/.*NeXT Mach \([0-9\.]*\).*/\1/p'`"
- if [ "$NEXTOSVER" -gt 3.3 ]; then
- NEXTOS="openstep"
- else
- NEXTOS="nextstep"
- fi
- NEXTREL="`hostinfo | sed -n 's/.*NeXT Mach \([0-9\.]*\).*/\1/p'`"
- NEXTARCH=`arch`
- echo "${NEXTARCH}-next-${NEXTOS}${NEXTREL}" ; exit 0
- ;;
- esac
-
- echo "${MACHINE}-whatever-${SYSTEM}|${RELEASE}|${VERSION}"
- ;;
-
- arx )
- #
- # command line parsing
- #
- verbose=no
- while [ ".$1" != . ]; do
- case $1 in
- -v) verbose=yes; shift; continue ;;
- *) break ;;
- esac
- done
- if [ $# -le 4 ]; then
- echo "$0:Usage: arx [-v] <ar-prg> <ar-cmd> <archive> <file> [<file> ...]" 1>&2
- exit 1
- fi
- ar_prg=$1; shift
- ar_cmd=$1; shift
- archive=$1; shift
- files="$*"
-
- #
- # walk through the file list and expand archives members
- #
- tmpdir=`echo $archive | sed -e 's;[^/]*$;.arx;'`
- nfiles=""
- for file in $files; do
- if [ ! -f $file ]; then
- echo "$0:Error: input file not found: $file" 1>&2
- exit 1
- fi
- case $file in
- *.a )
- if [ ! -d $tmpdir ]; then
- if [ $verbose = yes ]; then
- echo "mkdir $tmpdir"
- fi
- mkdir $tmpdir
- fi
- case $tmpdir in
- .arx )
- from="../$file"
- ;;
- * )
- dir=`echo $file | sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;'`
- base=`echo $file | sed -e 's;.*/\([^/]*\)$;\1;'`
- from="`cd $dir; pwd`/$base"
- ;;
- esac
- if [ $verbose = yes ]; then
- echo "(cd $tmpdir && $ar_prg x $from)"
- fi
- (cd $tmpdir && eval $ar_prg x $from)
- if [ $? -ne 0 ]; then
- echo "$0:Error: member extraction failed for archive: $file" 1>&2
- exit 1
- fi
- for member in - `eval $ar_prg t $file`; do
- [ ".$member" = .- ] && continue
- nfiles="$nfiles $tmpdir/$member"
- done
- ;;
- * )
- nfiles="$nfiles $file"
- ;;
- esac
- done
-
- #
- # run the final archive command
- #
- if [ $verbose = yes ]; then
- echo "$ar_prg $ar_cmd $archive $nfiles"
- fi
- eval $ar_prg $ar_cmd $archive $nfiles
- if [ $? -ne 0 ]; then
- echo "$0:Error: archive command failed" 1>&2
- exit $?
- fi
-
- #
- # cleanup and die gracefully
- #
- if [ -d $tmpdir ]; then
- if [ $verbose = yes ]; then
- echo "rm -rf $tmpdir"
- fi
- rm -rf $tmpdir
- fi
- exit 0
- ;;
-
- slo )
- DIFS='
- '
-
- #
- # parse out -L and -l options from command line
- #
- DIRS=''
- LIBS=''
- ARGV=''
- optprev=""
- OIFS="$IFS" IFS="$DIFS"
- for opt
- do
- # concatenate with previous option if exists
- if [ ".$optprev" != . ]; then
- opt="${optprev}${opt}";
- optprev=''
- fi
- # remember options for arg when used stand-alone
- if [ ".$opt" = ".-L" -o ".$opt" = ".-l" ]; then
- optprev="$opt"
- continue;
- fi
- # split argument into option plus option argument
- arg="`echo $opt | cut -c3-`"
- opt="`echo $opt | cut -c1-2`"
- # store into containers
- case $opt in
- -L) DIRS="$DIRS:$arg" ;;
- -l) LIBS="$LIBS:$arg" ;;
- *) ARGV="$ARGV $opt" ;;
- esac
- done
- IFS="$OIFS"
-
- #
- # set linker default directories
- #
- DIRS_DEFAULT='/lib:/usr/lib'
- if [ ".$LD_LIBRARY_PATH" != . ]; then
- DIRS_DEFAULT="$DIRS_DEFAULT:$LD_LIBRARY_PATH"
- fi
-
- #
- # sort options by class
- #
- DIRS_OBJ=''
- LIBS_OBJ=''
- DIRS_PIC=''
- LIBS_PIC=''
- DIRS_DSO=''
- LIBS_DSO=''
-
- # for each library...
- OIFS="$IFS" IFS=':'
- for lib in $LIBS; do
- [ ".$lib" = . ] && continue
-
- found='no'
- found_indefdir='no'
- found_type=''
- found_dir=''
-
- # for each directory...
- OIFS2="$IFS" IFS=":$DIFS"
- for dir in ${DIRS} switch-to-defdirs ${DIRS_DEFAULT}; do
- [ ".$dir" = . ] && continue
- [ ".$dir" = .switch-to-defdirs ] && found_indefdir=yes
- [ ! -d $dir ] && continue
-
- # search the file
- OIFS3="$IFS" IFS="$DIFS"
- for file in '' `cd $dir && ls lib${lib}.* 2>/dev/null`; do
- [ ".$file" = . ] && continue
- case $file in
- *.so|*.so.[0-9]*|*.sl|*.sl.[0-9]* )
- found=yes;
- found_type=DSO;
- break
- ;;
- *.lo|*.la )
- found=yes;
- found_type=PIC
- ;;
- *.a )
- if [ ".$found_type" = . ]; then
- found=yes
- found_type=OBJ
- fi
- ;;
- esac
- done
- IFS="$OIFS3"
- if [ ".$found" = .yes ]; then
- found_dir="$dir"
- break
- fi
- done
- IFS="$OIFS2"
-
- if [ ".$found" = .yes ]; then
- if [ ".$found_indefdir" != .yes ]; then
- eval "dirlist=\"\${DIRS_${found_type}}:\""
- if [ ".`echo \"$dirlist\" | fgrep :$found_dir:`" = . ]; then
- eval "DIRS_${found_type}=\"\$DIRS_${found_type}:${found_dir}\""
- fi
- eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\""
- else
- eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\""
- fi
- else
- LIBS_OBJ="$LIBS_OBJ:$lib"
- #dirlist="`echo $DIRS $DIRS_DEFAULT | sed -e 's/:/ /g'`"
- #echo "slo:Warning: library \"$lib\" not found in any of the following dirs:" 2>&1
- #echo "slo:Warning: $dirlist" 1>&1
- fi
- done
- IFS="$OIFS"
-
- #
- # also pass-through unused dirs even if it's useless
- #
- OIFS="$IFS" IFS=':'
- for dir in $DIRS; do
- dirlist="${DIRS_OBJ}:${DIRS_PIC}:${DIRS_DSO}:"
- if [ ".`echo \"$dirlist\" | fgrep :$dir:`" = . ]; then
- DIRS_OBJ="$DIRS_OBJ:$dir"
- fi
- done
- IFS="$OIFS"
-
- #
- # reassemble the options but seperated by type
- #
- OIFS="$IFS" IFS="$DIFS"
- for type in OBJ PIC DSO; do
- OIFS2="$IFS" IFS=':'
- eval "libs=\"\$LIBS_${type}\""
- opts=''
- for lib in $libs; do
- [ ".$lib" = . ] && continue
- opts="$opts -l$lib"
- done
- eval "LIBS_${type}=\"$opts\""
-
- eval "dirs=\"\$DIRS_${type}\""
- opts=''
- for dir in $dirs; do
- [ ".$dir" = . ] && continue
- opts="$opts -L$dir"
- done
- eval "DIRS_${type}=\"$opts\""
- IFS="$OIFS2"
- done
- IFS="$OIFS"
-
- #
- # give back results
- #
- OIFS="$IFS" IFS="$DIFS"
- for var in ARGV DIRS_OBJ LIBS_OBJ DIRS_PIC LIBS_PIC DIRS_DSO LIBS_DSO; do
- eval "val=\"\$${var}\""
- val="`echo $val | sed -e 's/^ *//'`"
- echo "SLO_${var}=\"${val}\""
- done
- IFS="$OIFS"
- ;;
-
- version )
- LANGUAGE=txt
- NAME=unknown
- PREFIX=unknown
- FULLVERSION=unknown
- REPORT=NO
- INCREASE=P
- USAGE=NO
- FILE=""
- while [ ".$1" != . ]; do
- case $1 in
- -l) LANGUAGE=$2; shift; shift; continue ;;
- -n) NAME=$2; shift; shift; continue ;;
- -p) PREFIX=$2; shift; shift; continue ;;
- -s) FULLVERSION=$2; shift; shift; continue ;;
- -i) INCREASE=$2; shift; shift; continue ;;
- -d) REPORT=$2; shift; shift; continue ;;
- -h) USAGE=YES; shift; continue ;;
- *) break;
- esac
- done
- if [ $# -ne 1 ]; then
- USAGE=YES
- else
- FILE=$1
- fi
-
- if [ ".$USAGE" = .YES ]; then
- echo "$0:Usage: version [options] file"
- echo "Options are:"
- echo "-l <lang> set language to one of 'txt', 'c' or 'perl'"
- echo "-n <name> set program name"
- echo "-p <prefix> set symbol prefix"
- echo "-s <v>.<r>[.pb]<p> set version string"
- echo "-i v|r|P|p|b|a|s increase version, revision or {alpha,batch,patch,snap} level"
- echo "-d short|long|libtool|hex display current version only"
- echo "-h print this page"
- exit 0
- fi
-
- # determine language
- if [ ".$LANGUAGE" = .unknown ]; then
- case $FILE in
- *.txt ) LANGUAGE=txt ;;
- *.c ) LANGUAGE=c ;;
- *.pl | *.pm ) LANGUAGE=perl ;;
- * ) echo "$0:Error: Unknown language type" 1>&2; exit 1 ;;
- esac
- fi
-
- # determine prefix from name and vice versa
- if [ ".$PREFIX" = . -o ".$PREFIX" = .unknown ]; then
- if [ ".$NAME" != . -a ".$NAME" != .unknown ]; then
- PREFIX="$NAME"
- fi
- fi
- if [ ".$NAME" = . -o ".$NAME" = .unknown ]; then
- if [ ".$PREFIX" != . -a ".$PREFIX" != .unknown ]; then
- NAME="$PREFIX"
- fi
- fi
-
- # determine version
- date=unknown
- if [ ".$FULLVERSION" = .unknown ]; then
- if [ -r "$FILE" ]; then
- # grep out current information
- id=`grep 'Version [0-9]*.[0-9]*[.abps][0-9]* ([0-9]*-[a-zA-Z]*-[0-9]*)' $FILE | \
- head -1 | \
- sed -e 's%.*Version \([0-9]*\)\.\([0-9]*\)\([.abps]\)\([0-9]*\) (\([0-9]*-[a-zA-Z]*-[0-9]*\)).*%\1:\2:\3:\4:\5%'`
- version=`echo $id | awk -F: '{ print $1 }'`
- revision=`echo $id | awk -F: '{ print $2 }'`
- bptype=`echo $id | awk -F: '{ print $3 }'`
- bplevel=`echo $id | awk -F: '{ print $4 }'`
- date=`echo $id | awk -F: '{ print $5 }'`
- if [ .$REPORT = .NO ]; then
- case $INCREASE in
- b ) bplevel=`expr $bplevel + 1`
- bptype=b
- ;;
- a ) bplevel=`expr $bplevel + 1`
- bptype=a
- ;;
- s ) bplevel=`expr $bplevel + 1`
- bptype=s
- ;;
- P ) bplevel=`expr $bplevel + 1`
- bptype=.
- ;;
- p ) bplevel=`expr $bplevel + 1`
- bptype=p
- ;;
- r ) revision=`expr $revision + 1`
- bplevel=0
- ;;
- v ) version=`expr $version + 1`
- revision=0
- bplevel=0
- ;;
- esac
- date=calc
- fi
- FULLVERSION="$version.$revision$bptype$bplevel"
- else
- # intialise to first version
- version=0
- revision=5
- bptype=b
- bplevel=0
- date=calc
- fi
- else
- # take given version
- V=`echo $FULLVERSION | sed -e 's%\([0-9]*\)\.\([0-9]*\)\([.abps]\)\([0-9]*\).*%\1:\2:\3:\4%'`
- version=`echo $V | awk -F: '{ print $1 }'`
- revision=`echo $V | awk -F: '{ print $2 }'`
- bptype=`echo $V | awk -F: '{ print $3 }'`
- bplevel=`echo $V | awk -F: '{ print $4 }'`
- date=calc
- fi
-
- # determine hex value of version
- case $FULLVERSION in
- *.*a* )
- HEX=`echo "$FULLVERSION" | sed -e 's/a.*//' | awk -F. '{ printf("%d%02d", $1, $2); }' &&
- echo "$FULLVERSION" | sed -e 's/.*a//' | awk '{ printf("0%02d", $1); }'`
- ;;
- *.*b* )
- HEX=`echo "$FULLVERSION" | sed -e 's/b.*//' | awk -F. '{ printf("%d%02d", $1, $2); }' &&
- echo "$FULLVERSION" | sed -e 's/.*b//' | awk '{ printf("1%02d", $1); }'`
- ;;
- *.*.* )
- HEX=`echo "$FULLVERSION" | awk -F. '{ printf("%d%02d2%02d", $1, $2, $3); }'`
- ;;
- esac
-
- # determine libtool version
- case $FULLVERSION in
- *.*a* )
- LTV=`echo "$FULLVERSION" | sed -e 's/a.*//' | awk -F. '{ printf("%d:0", $1*10+$2); }'`
- ;;
- *.*b* )
- LTV=`echo "$FULLVERSION" | sed -e 's/b.*//' | awk -F. '{ printf("%d:0", $1*10+$2); }'`
- ;;
- *.*.* )
- LTV=`echo "$FULLVERSION" | awk -F. '{ printf("%d:%d", $1*10+$2, $3); }'`
- ;;
- esac
-
- # determine string out of filename
- FILESTR=`echo "$FILE" | tr 'abcdefghijklmnopqrstuvwxyz./%+-' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_____'`
-
- # determine date
- if [ ".$date" = .calc ]; then
- day="`date '+%d' | awk '{ printf("%s", $1); }'`"
- month="`date '+%m' | awk '{ printf("%s", $1); }'`"
- year="`date '+%Y' 2>/dev/null | awk '{ printf("%s", $1); }'`"
- if test ".$time_year" = .; then
- year="`date '+%y' | awk '{ printf("%s", $1); }'`"
- case $year in
- 9[0-9]*) year="19$year" ;;
- *) year="20$year" ;;
- esac
- fi
- case $month in
- 1|01) month='Jan' ;;
- 2|02) month='Feb' ;;
- 3|03) month='Mar' ;;
- 4|04) month='Apr' ;;
- 5|05) month='May' ;;
- 6|06) month='Jun' ;;
- 7|07) month='Jul' ;;
- 8|08) month='Aug' ;;
- 9|09) month='Sep' ;;
- 10) month='Oct' ;;
- 11) month='Nov' ;;
- 12) month='Dec' ;;
- esac
- date="${day}-${month}-${year}"
- fi
-
- if [ .$REPORT != .NO ]; then
- case $REPORT in
- long )
- echo "$version.$revision$bptype$bplevel ($date)"
- ;;
- short )
- echo "$version.$revision$bptype$bplevel"
- ;;
- libtool )
- echo "$LTV"
- ;;
- hex )
- echo "0x$HEX"
- ;;
- esac
- exit 0
- fi
-
- # create the version file according the the selected language
- echo "new version: $version.$revision$bptype$bplevel ($date)"
- tmpfile="/tmp/version.tmp.$$"
- rm -f $tmpfile >/dev/null 2>&1
- case $LANGUAGE in
- txt )
- cat >$tmpfile <<'EOT'
-
- This is @NAME@ Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)
- EOT
- ;;
- c )
- cat >$tmpfile <<'EOT'
- /*
- ** @FILE@ -- Version File (automatically generated and maintained by shtool)
- */
-
- #ifdef AS_HEADER
-
- #ifndef @FILESTR@
- #define @FILESTR@
- #define @PREFIX@_VERSION 0x@HEX@
- extern const int @PREFIX@_Version;
- extern const char @PREFIX@_VersionStr[];
- extern const char @PREFIX@_Hello[];
- extern const char @PREFIX@_GNUVersion[];
- extern const char @PREFIX@_WhatID[];
- extern const char @PREFIX@_RCSIdentID[];
- extern const char @PREFIX@_WebID[];
- extern const char @PREFIX@_PlainID[];
- #endif
-
- #else
-
- const int @PREFIX@_Version = 0x@HEX@;
- const char @PREFIX@_VersionStr[] = "@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)";
- const char @PREFIX@_Hello[] = "This is @NAME@ Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)";
- const char @PREFIX@_GNUVersion[] = "@NAME@ Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@";
- const char @PREFIX@_WhatID[] = "@(#)@NAME@ Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)";
- const char @PREFIX@_RCSIdentID[] = "$Id: shtool,v 1.1 1999/12/22 05:04:11 fyodor Exp $";
- const char @PREFIX@_WebID[] = "@NAME@/@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@";
- const char @PREFIX@_PlainID[] = "@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@";
-
- #endif
- EOT
- ;;
- perl )
- cat >$tmpfile <<'EOT'
- ##
- ## @FILE@ -- Version File (automatically generated and maintained by shtool)
- ##
-
- $@PREFIX@_Version = 0x@HEX@;
- $@PREFIX@_VersionStr = "@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)";
- $@PREFIX@_Hello = "This is @NAME@ Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)";
- $@PREFIX@_GNUVersion = "@NAME@ Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@";
- $@PREFIX@_WhatID = "@(#)@NAME@ Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)";
- $@PREFIX@_RCSIdentID = "\$Id: shtool,v 1.1 1999/12/22 05:04:11 fyodor Exp $";
- $@PREFIX@_WebID = "@NAME@/@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@";
- $@PREFIX@_PlainID = "@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@";
-
- 1;
- EOT
- ;;
- esac
-
- # now create the version file
- rm -f $FILE >/dev/null 2>&1
- sed \
- -e "s|@FILE@|$FILE|g" \
- -e "s|@FILESTR@|$FILESTR|g" \
- -e "s|@PREFIX@|$PREFIX|g" \
- -e "s|@NAME@|$NAME|g" \
- -e "s|@HEX@|$HEX|g" \
- -e "s|@VERSION@|$version|g" \
- -e "s|@REVISION@|$revision|g" \
- -e "s|@BPTYPE@|$bptype|g" \
- -e "s|@BPLEVEL@|$bplevel|g" \
- -e "s|@YEAR@|$year|g" \
- -e "s|@MONTH@|$month|g" \
- -e "s|@DAY@|$day|g" <$tmpfile >$FILE
- rm -f $tmpfile >/dev/null 2>&1
- exit 0
- ;;
-
- path )
- #
- # parse argument line
- #
- silent=no
- reverse=no
- magic=no
- dirname=no
- basename=no
- pathlist="$PATH"
- namelist=""
- tmpfile="/tmp/path.tmp.$$"
- while [ ".$1" != . ]; do
- case $1 in
- -s ) silent=yes ; shift; continue ;;
- -r ) reverse=yes ; shift; continue ;;
- -d ) dirname=yes ; shift; continue ;;
- -b ) basename=yes ; shift; continue ;;
- -m ) magic=yes ; shift; continue ;;
- -p ) pathlist="$2"; shift; shift; continue ;;
- * ) break ;;
- esac
- done
- if [ $# -eq 0 ]; then
- echo "$0:Usage: path [-s] [-r] [-d] [-b] [-p <path>] <string> [<string> ...]" 1>&2
- exit 1
- fi
- namelist="$*"
-
- #
- # check whether the test command supports the -x option
- #
- cat >$tmpfile <<EOT
- if [ -x / ] || [ -x /bin ] || [ -x /bin/ls ]; then
- exit 0
- fi
- exit 1
- EOT
- if sh $tmpfile 2>/dev/null; then
- minusx="-x"
- else
- minusx="-r"
- fi
- rm -f $tmpfile
-
- #
- # split path string
- #
- paths="`echo $pathlist |\
- sed -e 's/^:/.:/' \
- -e 's/::/:.:/g' \
- -e 's/:$/:./' \
- -e 's/:/ /g'`"
-
- #
- # SPECIAL REQUEST
- # translate forward to reverse path
- #
- if [ $reverse = yes ]; then
- if [ "x$namelist" = "x." ]; then
- rp='.'
- else
- rp=''
- for pe in `IFS="$IFS/"; echo $namelist`; do
- rp="../$rp"
- done
- fi
- echo $rp | sed -e 's:/$::'
- exit 0
- fi
-
- #
- # SPECIAL REQUEST
- # strip out directory or base name
- #
- if [ $dirname = yes ]; then
- echo "$namelist" |\
- sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;'
- exit 0
- fi
- if [ $basename = yes ]; then
- echo "$namelist" |\
- sed -e 's;.*/\([^/]*\)$;\1;'
- exit 0
- fi
-
- #
- # MAGIC SITUATION
- # Perl Interpreter (perl)
- #
- if [ ".$magic" = .yes ] && [ ".$namelist" = .perl ]; then
- rm -f $tmpfile
- touch $tmpfile
- c=0
- found=0
- for dir in $paths; do
- dir=`echo $dir | sed -e 's;/*$;;'`
- for perl in perl5 perl miniperl; do
- if [ $minusx "$dir/$perl" ]; then
- perl="$dir/$perl"
- version=`$perl -v | grep version |\
- sed -e 's/.* version //' -e 's/ built.*//' -e 's/ with.*//'`
- versionnum="`echo $version | sed -e 's/\.//g' -e 's/_//g'`"
- versionnum=`expr $versionnum - $c`
- echo "$versionnum $perl" >>$tmpfile
- found=1
- fi
- done
- c=`expr $c + 1`
- done
- if [ $found = 1 ]; then
- perl="`cat $tmpfile | sort -u | tail -1 | cut '-d ' -f2`"
- rm -f $tmpfile
- echo "$perl"
- exit 0
- fi
- exit 1
- fi
-
- #
- # MAGIC SITUATION
- # C pre-processor (cpp)
- #
- if [ ".$magic" = .yes ] && [ ".$namelist" = .cpp ]; then
- cat >$tmpfile.c <<EOT
- #include <assert.h>
- Syntax Error
- EOT
- # 1. try the standard cc -E approach
- cpp="${CC-cc} -E"
- (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out
- my_error=`grep -v '^ *+' $tmpfile.out`
- if [ ".$my_error" != . ]; then
- # 2. try the cc -E approach and GCC's -traditional-ccp option
- cpp="${CC-cc} -E -traditional-cpp"
- (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out
- my_error=`grep -v '^ *+' $tmpfile.out`
- if [ ".$my_error" != . ]; then
- # 3. try a standalone cpp command in path and lib dirs
- for path in $paths /lib /usr/lib /usr/local/lib; do
- path=`echo $path | sed -e 's;/*$;;'`
- if [ $minusx "$path/cpp" ] && [ ! -d "$path/cpp" ]; then
- cpp="$path/cpp"
- break
- fi
- done
- if [ ".$cpp" != . ]; then
- (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out
- my_error=`grep -v '^ *+' $tmpfile.out`
- if [ ".$my_error" != . ]; then
- # ok, we gave up...
- cpp=''
- fi
- fi
- fi
- fi
- rm -f $tmpfile.c $tmpfile.out
- if [ ".$cpp" != . ]; then
- echo "$cpp"
- exit 0
- fi
- exit 1
- fi
-
- #
- # STANDARD SITUATION
- # iterate over names
- #
- for name in $namelist; do
- # iterate over paths
- for path in $paths; do
- path=`echo $path | sed -e 's;/*$;;'`
- if [ $minusx "$path/$name" ] && [ ! -d "$path/$name" ]; then
- if [ "$silent" != "yes" ]; then
- echo "$path/$name"
- fi
- exit 0
- fi
- done
- done
- exit 1
- ;;
-
- * )
- echo "$0:Error: Unknown command" 2>&1
- echo "$0:Hint: Run 'shtool.gen -h' for usage" 2>&1
- exit 1
- ;;
- esac
-
- ##EOF##
-