ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/ac-tools/shtool
Revision: 1465
Committed: Fri Jul 9 23:08:25 2010 UTC (15 years ago) by chuckv
File size: 141926 byte(s)
Log Message:
Creating busticated version of OpenMD

File Contents

# User Rev Content
1 gezelter 1385 #!/bin/sh
2     ##
3     ## GNU shtool -- The GNU Portable Shell Tool
4 gezelter 1395 ## Copyright (c) 1994-2008 Ralf S. Engelschall <rse@engelschall.com>
5 gezelter 1385 ##
6     ## See http://www.gnu.org/software/shtool/ for more information.
7     ## See ftp://ftp.gnu.org/gnu/shtool/ for latest version.
8     ##
9 gezelter 1395 ## Version: 2.0.8 (18-Jul-2008)
10     ## Contents: all available modules
11 gezelter 1385 ##
12    
13     ##
14     ## This program is free software; you can redistribute it and/or modify
15     ## it under the terms of the GNU General Public License as published by
16     ## the Free Software Foundation; either version 2 of the License, or
17     ## (at your option) any later version.
18     ##
19     ## This program is distributed in the hope that it will be useful,
20     ## but WITHOUT ANY WARRANTY; without even the implied warranty of
21     ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22     ## General Public License for more details.
23     ##
24     ## You should have received a copy of the GNU General Public License
25     ## along with this program; if not, write to the Free Software
26     ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
27     ## USA, or contact Ralf S. Engelschall <rse@engelschall.com>.
28     ##
29     ## NOTICE: Given that you include this file verbatim into your own
30     ## source tree, you are justified in saying that it remains separate
31     ## from your package, and that this way you are simply just using GNU
32     ## shtool. So, in this situation, there is no requirement that your
33     ## package itself is licensed under the GNU General Public License in
34     ## order to take advantage of GNU shtool.
35     ##
36    
37     ##
38     ## Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]]
39     ##
40     ## Available commands:
41     ## echo Print string with optional construct expansion
42     ## mdate Pretty-print modification time of a file or dir
43     ## table Pretty-print a field-separated list as a table
44     ## prop Display progress with a running propeller
45     ## move Move files with simultaneous substitution
46 gezelter 1395 ## install Install a program, script or datafile
47     ## mkdir Make one or more directories
48 gezelter 1385 ## mkln Make link with calculation of relative paths
49     ## mkshadow Make a shadow tree through symbolic links
50     ## fixperm Fix file permissions inside a source tree
51     ## rotate Logfile rotation
52     ## tarball Roll distribution tarballs
53     ## subst Apply sed(1) substitution operations
54 gezelter 1395 ## platform Platform Identification Utility
55 gezelter 1385 ## arx Extended archive command
56     ## slo Separate linker options by library class
57     ## scpp Sharing C Pre-Processor
58     ## version Maintain a version information file
59 gezelter 1395 ## path Deal with program paths
60 gezelter 1385 ##
61    
62     # maximum Bourne-Shell compatibility
63     if [ ".$ZSH_VERSION" != . ] && (emulate sh) >/dev/null 2>&1; then
64     # reconfigure zsh(1)
65     emulate sh
66     NULLCMD=:
67     alias -g '${1+"$@"}'='"$@"'
68     elif [ ".$BASH_VERSION" != . ] && (set -o posix) >/dev/null 2>&1; then
69     # reconfigure bash(1)
70     set -o posix
71     fi
72    
73     # maximum independence of NLS nuisances
74     for var in \
75     LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
76     LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
77     LC_TELEPHONE LC_TIME
78     do
79     if (set +x; test -z "`(eval $var=C; export $var) 2>&1`"); then
80     eval $var=C; export $var
81     else
82     unset $var
83     fi
84     done
85    
86     # initial command line handling
87     if [ $# -eq 0 ]; then
88     echo "$0:Error: invalid command line" 1>&2
89     echo "$0:Hint: run \`$0 -h' for usage" 1>&2
90     exit 1
91     fi
92     if [ ".$1" = ".-h" ] || [ ".$1" = ".--help" ]; then
93 gezelter 1395 echo "This is GNU shtool, version 2.0.8 (18-Jul-2008)"
94     echo 'Copyright (c) 1994-2008 Ralf S. Engelschall <rse@engelschall.com>'
95 gezelter 1385 echo 'Report bugs to <bug-shtool@gnu.org>'
96     echo ''
97     echo 'Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]]'
98     echo ''
99     echo 'Available global <options>:'
100     echo ' -v, --version display shtool version information'
101     echo ' -h, --help display shtool usage help page (this one)'
102     echo ' -d, --debug display shell trace information'
103     echo ' -r, --recreate recreate this shtool script via shtoolize'
104     echo ''
105     echo 'Available <cmd-name> [<cmd-options>] [<cmd-args>]:'
106     echo ' echo [-n|--newline] [-e|--expand] [<string> ...]'
107 gezelter 1395 echo ' mdate [-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits]'
108     echo ' [-f|--field-sep <str>] [-o|--order <spec>] <path>'
109     echo ' table [-F|--field-sep <sep>] [-w|--width <width>] [-c|--columns'
110     echo ' <cols>] [-s|--strip <strip>] <str><sep><str>...'
111     echo ' prop [-p|--prefix <str>]'
112     echo ' move [-v|--verbose] [-t|--trace] [-e|--expand] [-p|--preserve]'
113     echo ' <src-file> <dst-file>'
114 gezelter 1385 echo ' install [-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy]'
115     echo ' [-C|--compare-copy] [-s|--strip] [-m|--mode <mode>]'
116     echo ' [-o|--owner <owner>] [-g|--group <group>] [-e|--exec'
117     echo ' <sed-cmd>] <file> [<file> ...] <path>'
118     echo ' mkdir [-t|--trace] [-f|--force] [-p|--parents] [-m|--mode'
119     echo ' <mode>] [-o|--owner <owner>] [-g|--group <group>] <dir>'
120     echo ' [<dir> ...]'
121     echo ' mkln [-t|--trace] [-f|--force] [-s|--symbolic] <src-path>'
122     echo ' [<src-path> ...] <dst-path>'
123     echo ' mkshadow [-v|--verbose] [-t|--trace] [-a|--all] <src-dir> <dst-dir>'
124     echo ' fixperm [-v|--verbose] [-t|--trace] <path> [<path> ...]'
125     echo ' rotate [-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files'
126     echo ' <count>] [-s|--size <size>] [-c|--copy] [-r|--remove]'
127     echo ' [-a|--archive-dir <dir>] [-z|--compress [<tool>:]<level>]'
128     echo ' [-b|--background] [-d|--delay] [-p|--pad <len>] [-m|--mode'
129     echo ' <mode>] [-o|--owner <owner>] [-g|--group <group>] [-M|--migrate'
130     echo ' <cmd>] [-P|--prolog <cmd>] [-E|--epilog <cmd>] <file> [...]'
131     echo ' tarball [-t|--trace] [-v|--verbose] [-o|--output <tarball>]'
132     echo ' [-c|--compress <prog>] [-d|--directory <dir>] [-u|--user'
133     echo ' <user>] [-g|--group <group>] [-e|--exclude <pattern>]'
134     echo ' <path> [<path> ...]'
135     echo ' subst [-v|--verbose] [-t|--trace] [-n|--nop] [-w|--warning]'
136     echo ' [-q|--quiet] [-s|--stealth] [-i|--interactive] [-b|--backup'
137     echo ' <ext>] [-e|--exec <cmd>] [-f|--file <cmd-file>] [<file>]'
138     echo ' [...]'
139 gezelter 1395 echo ' platform [-F|--format <format>] [-S|--sep <string>] [-C|--conc'
140     echo ' <string>] [-L|--lower] [-U|--upper] [-v|--verbose]'
141     echo ' [-c|--concise] [-n|--no-newline] [-t|--type <type>]'
142     echo ' [-V|--version] [-h|--help]'
143 gezelter 1385 echo ' arx [-t|--trace] [-C|--command <cmd>] <op> <archive> [<file>'
144     echo ' ...]'
145     echo ' slo [-p|--prefix <str>] -- -L<dir> -l<lib> [-L<dir> -l<lib>'
146     echo ' ...]'
147     echo ' scpp [-v|--verbose] [-p|--preserve] [-f|--filter <filter>]'
148     echo ' [-o|--output <ofile>] [-t|--template <tfile>] [-M|--mark'
149     echo ' <mark>] [-D|--define <dname>] [-C|--class <cname>]'
150     echo ' <file> [<file> ...]'
151     echo ' version [-l|--language <lang>] [-n|--name <name>] [-p|--prefix'
152     echo ' <prefix>] [-s|--set <version>] [-e|--edit] [-i|--increase'
153     echo ' <knob>] [-d|--display <type>] <file>'
154 gezelter 1395 echo ' path [-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename]'
155     echo ' [-m|--magic] [-p|--path <path>] <str> [<str> ...]'
156 gezelter 1385 echo ''
157     exit 0
158     fi
159     if [ ".$1" = ".-v" ] || [ ".$1" = ".--version" ]; then
160 gezelter 1395 echo "GNU shtool 2.0.8 (18-Jul-2008)"
161 gezelter 1385 exit 0
162     fi
163     if [ ".$1" = ".-r" ] || [ ".$1" = ".--recreate" ]; then
164 gezelter 1395 shtoolize -oshtool all
165 gezelter 1385 exit 0
166     fi
167     if [ ".$1" = ".-d" ] || [ ".$1" = ".--debug" ]; then
168     shift
169     set -x
170     fi
171     name=`echo "$0" | sed -e 's;.*/\([^/]*\)$;\1;' -e 's;-sh$;;' -e 's;\.sh$;;'`
172     case "$name" in
173 gezelter 1395 echo|mdate|table|prop|move|install|mkdir|mkln|mkshadow|fixperm|rotate|tarball|subst|platform|arx|slo|scpp|version|path )
174 gezelter 1385 # implicit tool command selection
175     tool="$name"
176     ;;
177     * )
178     # explicit tool command selection
179     tool="$1"
180     shift
181     ;;
182     esac
183     arg_spec=""
184     opt_spec=""
185     gen_tmpfile=no
186    
187     ##
188     ## DISPATCH INTO SCRIPT PROLOG
189     ##
190    
191     case $tool in
192     echo )
193     str_tool="echo"
194     str_usage="[-n|--newline] [-e|--expand] [<string> ...]"
195     arg_spec="0+"
196     opt_spec="n.e."
197     opt_alias="n:newline,e:expand"
198     opt_n=no
199     opt_e=no
200     ;;
201 gezelter 1395 mdate )
202     str_tool="mdate"
203     str_usage="[-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits] [-f|--field-sep <str>] [-o|--order <spec>] <path>"
204     arg_spec="1="
205     opt_spec="n.z.s.d.f:o:"
206     opt_alias="n:newline,z:zero,s:shorten,d:digits,f:field-sep,o:order"
207     opt_n=no
208     opt_z=no
209     opt_s=no
210     opt_d=no
211     opt_f=" "
212     opt_o="dmy"
213     ;;
214     table )
215     str_tool="table"
216     str_usage="[-F|--field-sep <sep>] [-w|--width <width>] [-c|--columns <cols>] [-s|--strip <strip>] <str><sep><str>..."
217     arg_spec="1+"
218     opt_spec="F:w:c:s:"
219     opt_alias="F:field-sep,w:width,c:columns,s:strip"
220     opt_F=":"
221     opt_w=15
222     opt_c=3
223     opt_s=79
224     ;;
225     prop )
226     str_tool="prop"
227     str_usage="[-p|--prefix <str>]"
228     arg_spec="0="
229     opt_spec="p:"
230     opt_alias="p:prefix"
231     opt_p=""
232     ;;
233     move )
234     str_tool="move"
235     str_usage="[-v|--verbose] [-t|--trace] [-e|--expand] [-p|--preserve] <src-file> <dst-file>"
236     arg_spec="2="
237     opt_spec="v.t.e.p."
238     opt_alias="v:verbose,t:trace,e:expand,p:preserve"
239     opt_v=no
240     opt_t=no
241     opt_e=no
242     opt_p=no
243     ;;
244 gezelter 1385 install )
245     str_tool="install"
246     str_usage="[-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy] [-C|--compare-copy] [-s|--strip] [-m|--mode <mode>] [-o|--owner <owner>] [-g|--group <group>] [-e|--exec <sed-cmd>] <file> [<file> ...] <path>"
247     arg_spec="1+"
248     opt_spec="v.t.d.c.C.s.m:o:g:e+"
249     opt_alias="v:verbose,t:trace,d:mkdir,c:copy,C:compare-copy,s:strip,m:mode,o:owner,g:group,e:exec"
250     opt_v=no
251     opt_t=no
252     opt_d=no
253     opt_c=no
254     opt_C=no
255     opt_s=no
256     opt_m="0755"
257     opt_o=""
258     opt_g=""
259     opt_e=""
260     ;;
261     mkdir )
262     str_tool="mkdir"
263     str_usage="[-t|--trace] [-f|--force] [-p|--parents] [-m|--mode <mode>] [-o|--owner <owner>] [-g|--group <group>] <dir> [<dir> ...]"
264     arg_spec="1+"
265     opt_spec="t.f.p.m:o:g:"
266     opt_alias="t:trace,f:force,p:parents,m:mode,o:owner,g:group"
267     opt_t=no
268     opt_f=no
269     opt_p=no
270     opt_m=""
271     opt_o=""
272     opt_g=""
273     ;;
274 gezelter 1395 mkln )
275     str_tool="mkln"
276     str_usage="[-t|--trace] [-f|--force] [-s|--symbolic] <src-path> [<src-path> ...] <dst-path>"
277     arg_spec="2+"
278     opt_spec="t.f.s."
279     opt_alias="t:trace,f:force,s:symbolic"
280     opt_t=no
281     opt_f=no
282     opt_s=no
283     ;;
284     mkshadow )
285     str_tool="mkshadow"
286     str_usage="[-v|--verbose] [-t|--trace] [-a|--all] <src-dir> <dst-dir>"
287     arg_spec="2="
288     opt_spec="v.t.a."
289     opt_alias="v:verbose,t:trace,a:all"
290     opt_v=no
291     opt_t=no
292     opt_a=no
293     ;;
294     fixperm )
295     str_tool="fixperm"
296     str_usage="[-v|--verbose] [-t|--trace] <path> [<path> ...]"
297     arg_spec="1+"
298     opt_spec="v.t."
299     opt_alias="v:verbose,t:trace"
300     opt_v=no
301     opt_t=no
302     ;;
303     rotate )
304     str_tool="rotate"
305     str_usage="[-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files <count>] [-s|--size <size>] [-c|--copy] [-r|--remove] [-a|--archive-dir <dir>] [-z|--compress [<tool>:]<level>] [-b|--background] [-d|--delay] [-p|--pad <len>] [-m|--mode <mode>] [-o|--owner <owner>] [-g|--group <group>] [-M|--migrate <cmd>] [-P|--prolog <cmd>] [-E|--epilog <cmd>] <file> [...]"
306     arg_spec="1+"
307     opt_spec="v.t.f.n:s:c.r.a:z:b.d.p:o:g:m:M:P:E:"
308     opt_alias="v:verbose,t:trace,f:force,n:num-files,s:size,c:copy,r:remove,a:archive-dir,z:compress,b:background,d:delay,p:pad,o:owner,g:group,m:mode,M:migrate,P:prolog,E:epilog"
309     opt_v=no
310     opt_t=no
311     opt_f=no
312     opt_n=10
313     opt_s=""
314     opt_c=no
315     opt_r=no
316     opt_a=""
317     opt_z=""
318     opt_b=no
319     opt_d=no
320     opt_p=1
321     opt_o=""
322     opt_g=""
323     opt_m=""
324     opt_M=""
325     opt_P=""
326     opt_E=""
327     ;;
328     tarball )
329     str_tool="tarball"
330     str_usage="[-t|--trace] [-v|--verbose] [-o|--output <tarball>] [-c|--compress <prog>] [-d|--directory <dir>] [-u|--user <user>] [-g|--group <group>] [-e|--exclude <pattern>] <path> [<path> ...]"
331     gen_tmpfile=yes
332     arg_spec="1+"
333     opt_spec="t.v.o:c:d:u:g:e:"
334     opt_alias="t:trace,v:verbose,o:output,c:compress,d:directory,u:user,g:group,e:exclude"
335     opt_t=no
336     opt_v=no
337     opt_o=""
338     opt_c=""
339     opt_d=""
340     opt_u=""
341     opt_g=""
342     opt_e="CVS,\\.cvsignore,\\.svn,\\.[oa]\$"
343     ;;
344     subst )
345     str_tool="subst"
346     str_usage="[-v|--verbose] [-t|--trace] [-n|--nop] [-w|--warning] [-q|--quiet] [-s|--stealth] [-i|--interactive] [-b|--backup <ext>] [-e|--exec <cmd>] [-f|--file <cmd-file>] [<file>] [...]"
347     gen_tmpfile=yes
348     arg_spec="0+"
349     opt_spec="v.t.n.w.q.s.i.b:e+f:"
350     opt_alias="v:verbose,t:trace,n:nop,w:warning,q:quiet,s:stealth,i:interactive,b:backup,e:exec,f:file"
351     opt_v=no
352     opt_t=no
353     opt_n=no
354     opt_w=no
355     opt_q=no
356     opt_s=no
357     opt_i=no
358     opt_b=""
359     opt_e=""
360     opt_f=""
361     ;;
362 gezelter 1385 platform )
363     str_tool="platform"
364     str_usage="[-F|--format <format>] [-S|--sep <string>] [-C|--conc <string>] [-L|--lower] [-U|--upper] [-v|--verbose] [-c|--concise] [-n|--no-newline] [-t|--type <type>] [-V|--version] [-h|--help]"
365     arg_spec="0="
366     opt_spec="F:S:C:L.U.v.c.n.t:d.V.h."
367     opt_alias="F:format,S:sep,C:conc,L:lower,U:upper,v:verbose,c:consise,t:type,n:no-newline,V:version,h:help"
368     opt_F="%{sp} (%{ap})"
369     opt_S=" "
370     opt_C="/"
371     opt_L=no
372     opt_U=no
373     opt_t=""
374     opt_v=no
375     opt_c=no
376     opt_n=no
377     opt_V=no
378     opt_h=no
379     ;;
380 gezelter 1395 arx )
381     str_tool="arx"
382     str_usage="[-t|--trace] [-C|--command <cmd>] <op> <archive> [<file> ...]"
383     arg_spec="2+"
384     opt_spec="t.C:"
385     opt_alias="t:trace,C:command"
386     opt_t=no
387     opt_C="ar"
388     ;;
389     slo )
390     str_tool="slo"
391     str_usage="[-p|--prefix <str>] -- -L<dir> -l<lib> [-L<dir> -l<lib> ...]"
392     arg_spec="1+"
393     opt_spec="p:"
394     opt_alias="p:prefix"
395     opt_p="SLO_"
396     ;;
397     scpp )
398     str_tool="scpp"
399     str_usage="[-v|--verbose] [-p|--preserve] [-f|--filter <filter>] [-o|--output <ofile>] [-t|--template <tfile>] [-M|--mark <mark>] [-D|--define <dname>] [-C|--class <cname>] <file> [<file> ...]"
400     gen_tmpfile=yes
401     arg_spec="1+"
402     opt_spec="v.p.f+o:t:M:D:C:"
403     opt_alias="v:verbose,p:preserve,f:filter,o:output,t:template,M:mark,D:define,C:class"
404     opt_v=no
405     opt_p=no
406     opt_f=""
407     opt_o="lib.h"
408     opt_t="lib.h.in"
409     opt_M="%%MARK%%"
410     opt_D="cpp"
411     opt_C="intern"
412     ;;
413     version )
414     str_tool="version"
415     str_usage="[-l|--language <lang>] [-n|--name <name>] [-p|--prefix <prefix>] [-s|--set <version>] [-e|--edit] [-i|--increase <knob>] [-d|--display <type>] <file>"
416     arg_spec="1="
417     opt_spec="l:n:p:s:i:e.d:"
418     opt_alias="l:language,n:name,p:prefix,s:set,e:edit,i:increase,d:display"
419     opt_l="txt"
420     opt_n="unknown"
421     opt_p=""
422     opt_s=""
423     opt_e="no"
424     opt_i=""
425     opt_d="short"
426     ;;
427 gezelter 1385 path )
428     str_tool="path"
429     str_usage="[-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename] [-m|--magic] [-p|--path <path>] <str> [<str> ...]"
430     gen_tmpfile=yes
431     arg_spec="1+"
432     opt_spec="s.r.d.b.m.p:"
433     opt_alias="s:suppress,r:reverse,d:dirname,b:basename,m:magic,p:path"
434     opt_s=no
435     opt_r=no
436     opt_d=no
437     opt_b=no
438     opt_m=no
439     opt_p="$PATH"
440     ;;
441     -* )
442     echo "$0:Error: unknown option \`$tool'" 2>&1
443     echo "$0:Hint: run \`$0 -h' for usage" 2>&1
444     exit 1
445     ;;
446     * )
447     echo "$0:Error: unknown command \`$tool'" 2>&1
448     echo "$0:Hint: run \`$0 -h' for usage" 2>&1
449     exit 1
450     ;;
451     esac
452    
453     ##
454     ## COMMON UTILITY CODE
455     ##
456    
457     # commonly used ASCII values
458     ASC_TAB=" "
459     ASC_NL="
460     "
461    
462     # determine name of tool
463     if [ ".$tool" != . ]; then
464     # used inside shtool script
465     toolcmd="$0 $tool"
466     toolcmdhelp="shtool $tool"
467     msgprefix="shtool:$tool"
468     else
469     # used as standalone script
470     toolcmd="$0"
471     toolcmdhelp="sh $0"
472     msgprefix="$str_tool"
473     fi
474    
475     # parse argument specification string
476     eval `echo $arg_spec |\
477     sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'`
478    
479     # parse option specification string
480     eval `echo h.$opt_spec |\
481     sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'`
482    
483     # parse option alias string
484     eval `echo h:help,$opt_alias |\
485     sed -e 's/-/_/g' -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'`
486    
487     # interate over argument line
488     opt_PREV=''
489     while [ $# -gt 0 ]; do
490     # special option stops processing
491     if [ ".$1" = ".--" ]; then
492     shift
493     break
494     fi
495    
496     # determine option and argument
497     opt_ARG_OK=no
498     if [ ".$opt_PREV" != . ]; then
499     # merge previous seen option with argument
500     opt_OPT="$opt_PREV"
501     opt_ARG="$1"
502     opt_ARG_OK=yes
503     opt_PREV=''
504     else
505     # split argument into option and argument
506     case "$1" in
507     --[a-zA-Z0-9]*=*)
508     eval `echo "x$1" |\
509     sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'`
510     opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'`
511     eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}"
512     ;;
513     --[a-zA-Z0-9]*)
514     opt_OPT=`echo "x$1" | cut -c4-`
515     opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'`
516     eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}"
517     opt_ARG=''
518     ;;
519     -[a-zA-Z0-9]*)
520     eval `echo "x$1" |\
521     sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \
522     -e 's/";\(.*\)$/"; opt_ARG="\1"/'`
523     ;;
524     -[a-zA-Z0-9])
525     opt_OPT=`echo "x$1" | cut -c3-`
526     opt_ARG=''
527     ;;
528     *)
529     break
530     ;;
531     esac
532     fi
533    
534     # eat up option
535     shift
536    
537     # determine whether option needs an argument
538     eval "opt_MODE=\$opt_MODE_${opt_OPT}"
539     if [ ".$opt_ARG" = . ] && [ ".$opt_ARG_OK" != .yes ]; then
540     if [ ".$opt_MODE" = ".:" ] || [ ".$opt_MODE" = ".+" ]; then
541     opt_PREV="$opt_OPT"
542     continue
543     fi
544     fi
545    
546     # process option
547     case $opt_MODE in
548     '.' )
549     # boolean option
550     eval "opt_${opt_OPT}=yes"
551     ;;
552     ':' )
553     # option with argument (multiple occurances override)
554     eval "opt_${opt_OPT}=\"\$opt_ARG\""
555     ;;
556     '+' )
557     # option with argument (multiple occurances append)
558     eval "opt_${opt_OPT}=\"\$opt_${opt_OPT}\${ASC_NL}\$opt_ARG\""
559     ;;
560     * )
561     echo "$msgprefix:Error: unknown option: \`$opt_OPT'" 1>&2
562     echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2
563     exit 1
564     ;;
565     esac
566     done
567     if [ ".$opt_PREV" != . ]; then
568     echo "$msgprefix:Error: missing argument to option \`$opt_PREV'" 1>&2
569     echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2
570     exit 1
571     fi
572    
573     # process help option
574     if [ ".$opt_h" = .yes ]; then
575     echo "Usage: $toolcmdhelp $str_usage"
576     exit 0
577     fi
578    
579     # complain about incorrect number of arguments
580     case $arg_MODE in
581     '=' )
582     if [ $# -ne $arg_NUMS ]; then
583     echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2
584     echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2
585     exit 1
586     fi
587     ;;
588     '+' )
589     if [ $# -lt $arg_NUMS ]; then
590     echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2
591     echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2
592     exit 1
593     fi
594     ;;
595     esac
596    
597     # establish a temporary file on request
598     if [ ".$gen_tmpfile" = .yes ]; then
599     # create (explicitly) secure temporary directory
600     if [ ".$TMPDIR" != . ]; then
601     tmpdir="$TMPDIR"
602     elif [ ".$TEMPDIR" != . ]; then
603     tmpdir="$TEMPDIR"
604     else
605     tmpdir="/tmp"
606     fi
607     tmpdir="$tmpdir/.shtool.$$"
608     ( umask 077
609     rm -rf "$tmpdir" >/dev/null 2>&1 || true
610     mkdir "$tmpdir" >/dev/null 2>&1
611     if [ $? -ne 0 ]; then
612     echo "$msgprefix:Error: failed to create temporary directory \`$tmpdir'" 1>&2
613     exit 1
614     fi
615     )
616    
617     # create (implicitly) secure temporary file
618     tmpfile="$tmpdir/shtool.tmp"
619     touch "$tmpfile"
620     fi
621    
622     # utility function: map string to lower case
623     util_lower () {
624     echo "$1" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'
625     }
626    
627     # utility function: map string to upper case
628     util_upper () {
629     echo "$1" | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
630     }
631    
632     # cleanup procedure
633     shtool_exit () {
634     rc="$1"
635     if [ ".$gen_tmpfile" = .yes ]; then
636     rm -rf "$tmpdir" >/dev/null 2>&1 || true
637     fi
638     exit $rc
639     }
640    
641     ##
642     ## DISPATCH INTO SCRIPT BODY
643     ##
644    
645     case $tool in
646    
647     echo )
648     ##
649     ## echo -- Print string with optional construct expansion
650 gezelter 1395 ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com>
651 gezelter 1385 ##
652    
653     text="$*"
654    
655     # check for broken escape sequence expansion
656     seo=''
657     bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'`
658     if [ ".$bytes" != .3 ]; then
659     bytes=`echo -E '\1' | wc -c | awk '{ printf("%s", $1); }'`
660     if [ ".$bytes" = .3 ]; then
661     seo='-E'
662     fi
663     fi
664    
665     # check for existing -n option (to suppress newline)
666     minusn=''
667     bytes=`echo -n 123 2>/dev/null | wc -c | awk '{ printf("%s", $1); }'`
668     if [ ".$bytes" = .3 ]; then
669     minusn='-n'
670     fi
671    
672     # determine terminal bold sequence
673     term_bold=''
674     term_norm=''
675     if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[Bb]'`" != . ]; then
676     case $TERM in
677     # for the most important terminal types we directly know the sequences
678     xterm|xterm*|vt220|vt220*)
679     term_bold=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' </dev/null 2>/dev/null`
680     term_norm=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' </dev/null 2>/dev/null`
681     ;;
682     vt100|vt100*|cygwin)
683     term_bold=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' </dev/null 2>/dev/null`
684     term_norm=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' </dev/null 2>/dev/null`
685     ;;
686     # for all others, we try to use a possibly existing `tput' or `tcout' utility
687     * )
688     paths=`echo $PATH | sed -e 's/:/ /g'`
689     for tool in tput tcout; do
690     for dir in $paths; do
691     if [ -r "$dir/$tool" ]; then
692     for seq in bold md smso; do # 'smso' is last
693     bold="`$dir/$tool $seq 2>/dev/null`"
694     if [ ".$bold" != . ]; then
695     term_bold="$bold"
696     break
697     fi
698     done
699     if [ ".$term_bold" != . ]; then
700     for seq in sgr0 me rmso init reset; do # 'reset' is last
701     norm="`$dir/$tool $seq 2>/dev/null`"
702     if [ ".$norm" != . ]; then
703     term_norm="$norm"
704     break
705     fi
706     done
707     fi
708     break
709     fi
710     done
711     if [ ".$term_bold" != . ] && [ ".$term_norm" != . ]; then
712     break;
713     fi
714     done
715     ;;
716     esac
717     if [ ".$term_bold" = . ] || [ ".$term_norm" = . ]; then
718     echo "$msgprefix:Warning: unable to determine terminal sequence for bold mode" 1>&2
719     term_bold=''
720     term_norm=''
721     fi
722     fi
723    
724     # determine user name
725     username=''
726     if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[uUgG]'`" != . ]; then
727     username="`(id -un) 2>/dev/null`"
728     if [ ".$username" = . ]; then
729     str="`(id) 2>/dev/null`"
730     if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then
731     username=`echo $str | sed -e 's/^uid[ ]*=[ ]*[0-9]*(//' -e 's/).*$//'`
732     fi
733     if [ ".$username" = . ]; then
734     username="$LOGNAME"
735     if [ ".$username" = . ]; then
736     username="$USER"
737     if [ ".$username" = . ]; then
738     username="`(whoami) 2>/dev/null |\
739     awk '{ printf("%s", $1); }'`"
740     if [ ".$username" = . ]; then
741     username="`(who am i) 2>/dev/null |\
742     awk '{ printf("%s", $1); }'`"
743     if [ ".$username" = . ]; then
744     username='unknown'
745     fi
746     fi
747     fi
748     fi
749     fi
750     fi
751     fi
752    
753     # determine user id
754     userid=''
755     if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%U'`" != . ]; then
756     userid="`(id -u) 2>/dev/null`"
757     if [ ".$userid" = . ]; then
758     userid="`(id -u ${username}) 2>/dev/null`"
759     if [ ".$userid" = . ]; then
760     str="`(id) 2>/dev/null`"
761     if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then
762     userid=`echo $str | sed -e 's/^uid[ ]*=[ ]*//' -e 's/(.*$//'`
763     fi
764     if [ ".$userid" = . ]; then
765     userid=`(getent passwd ${username}) 2>/dev/null | \
766     sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
767     if [ ".$userid" = . ]; then
768     userid=`grep "^${username}:" /etc/passwd 2>/dev/null | \
769     sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
770     if [ ".$userid" = . ]; then
771 gezelter 1395 userid=`(ypmatch "${username}" passwd; nismatch "${username}" passwd) 2>/dev/null | \
772     sed -e 'q' | sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
773 gezelter 1385 if [ ".$userid" = . ]; then
774 gezelter 1395 userid=`(nidump passwd . | grep "^${username}:") 2>/dev/null | \
775     sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
776     if [ ".$userid" = . ]; then
777     userid='?'
778     fi
779 gezelter 1385 fi
780     fi
781     fi
782     fi
783     fi
784     fi
785     fi
786    
787     # determine (primary) group id
788     groupid=''
789     if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[gG]'`" != . ]; then
790     groupid="`(id -g ${username}) 2>/dev/null`"
791     if [ ".$groupid" = . ]; then
792     str="`(id) 2>/dev/null`"
793     if [ ".`echo $str | grep 'gid[ ]*=[ ]*[0-9]*('`" != . ]; then
794     groupid=`echo $str | sed -e 's/^.*gid[ ]*=[ ]*//' -e 's/(.*$//'`
795     fi
796     if [ ".$groupid" = . ]; then
797     groupid=`(getent passwd ${username}) 2>/dev/null | \
798     sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`
799     if [ ".$groupid" = . ]; then
800     groupid=`grep "^${username}:" /etc/passwd 2>/dev/null | \
801     sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`
802     if [ ".$groupid" = . ]; then
803 gezelter 1395 groupid=`(ypmatch "${username}" passwd; nismatch "${username}" passwd) 2>/dev/null | \
804     sed -e 'q' | sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`
805 gezelter 1385 if [ ".$groupid" = . ]; then
806 gezelter 1395 groupid=`(nidump passwd . | grep "^${username}:") 2>/dev/null | \
807     sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`
808     if [ ".$groupid" = . ]; then
809     groupid='?'
810     fi
811 gezelter 1385 fi
812     fi
813     fi
814     fi
815     fi
816     fi
817    
818     # determine (primary) group name
819     groupname=''
820     if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%g'`" != . ]; then
821     groupname="`(id -gn ${username}) 2>/dev/null`"
822     if [ ".$groupname" = . ]; then
823     str="`(id) 2>/dev/null`"
824     if [ ".`echo $str | grep 'gid[ ]*=[ ]*[0-9]*('`" != . ]; then
825     groupname=`echo $str | sed -e 's/^.*gid[ ]*=[ ]*[0-9]*(//' -e 's/).*$//'`
826     fi
827     if [ ".$groupname" = . ]; then
828     groupname=`(getent group) 2>/dev/null | \
829     grep "^[^:]*:[^:]*:${groupid}:" | \
830     sed -e 's/:.*$//'`
831     if [ ".$groupname" = . ]; then
832     groupname=`grep "^[^:]*:[^:]*:${groupid}:" /etc/group 2>/dev/null | \
833     sed -e 's/:.*$//'`
834     if [ ".$groupname" = . ]; then
835 gezelter 1395 groupname=`(ypcat group; niscat group) 2>/dev/null | \
836     sed -e 'q' | grep "^[^:]*:[^:]*:${groupid}:" | \
837 gezelter 1385 sed -e 's/:.*$//'`
838     if [ ".$groupname" = . ]; then
839 gezelter 1395 groupname=`(nidump group .) 2>/dev/null | \
840     grep "^[^:]*:[^:]*:${groupid}:" | \
841     sed -e 's/:.*$//'`
842     if [ ".$groupname" = . ]; then
843     groupname='?'
844     fi
845 gezelter 1385 fi
846     fi
847     fi
848     fi
849     fi
850     fi
851    
852     # determine host and domain name
853     hostname=''
854     domainname=''
855     if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%h'`" != . ]; then
856     hostname="`(uname -n) 2>/dev/null |\
857     awk '{ printf("%s", $1); }'`"
858     if [ ".$hostname" = . ]; then
859     hostname="`(hostname) 2>/dev/null |\
860     awk '{ printf("%s", $1); }'`"
861     if [ ".$hostname" = . ]; then
862     hostname='unknown'
863     fi
864     fi
865     case $hostname in
866     *.* )
867     domainname=".`echo $hostname | cut -d. -f2-`"
868     hostname="`echo $hostname | cut -d. -f1`"
869     ;;
870     esac
871     fi
872     if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%d'`" != . ]; then
873     if [ ".$domainname" = . ]; then
874     if [ -f /etc/resolv.conf ]; then
875     domainname="`grep '^[ ]*domain' /etc/resolv.conf | sed -e 'q' |\
876     sed -e 's/.*domain//' \
877     -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \
878     -e 's/^\.//' -e 's/^/./' |\
879     awk '{ printf("%s", $1); }'`"
880     if [ ".$domainname" = . ]; then
881     domainname="`grep '^[ ]*search' /etc/resolv.conf | sed -e 'q' |\
882     sed -e 's/.*search//' \
883     -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \
884     -e 's/ .*//' -e 's/ .*//' \
885     -e 's/^\.//' -e 's/^/./' |\
886     awk '{ printf("%s", $1); }'`"
887     fi
888     fi
889     fi
890     fi
891    
892     # determine current time
893     time_day=''
894     time_month=''
895     time_year=''
896     time_monthname=''
897     if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[DMYm]'`" != . ]; then
898     time_day=`date '+%d'`
899     time_month=`date '+%m'`
900     time_year=`date '+%Y' 2>/dev/null`
901     if [ ".$time_year" = . ]; then
902     time_year=`date '+%y'`
903     case $time_year in
904     [5-9][0-9]) time_year="19$time_year" ;;
905     [0-4][0-9]) time_year="20$time_year" ;;
906     esac
907     fi
908     case $time_month in
909     1|01) time_monthname='Jan' ;;
910     2|02) time_monthname='Feb' ;;
911     3|03) time_monthname='Mar' ;;
912     4|04) time_monthname='Apr' ;;
913     5|05) time_monthname='May' ;;
914     6|06) time_monthname='Jun' ;;
915     7|07) time_monthname='Jul' ;;
916     8|08) time_monthname='Aug' ;;
917     9|09) time_monthname='Sep' ;;
918     10) time_monthname='Oct' ;;
919     11) time_monthname='Nov' ;;
920     12) time_monthname='Dec' ;;
921     esac
922     fi
923    
924     # expand special ``%x'' constructs
925     if [ ".$opt_e" = .yes ]; then
926     text=`echo $seo "$text" |\
927     sed -e "s/%B/${term_bold}/g" \
928     -e "s/%b/${term_norm}/g" \
929     -e "s/%u/${username}/g" \
930     -e "s/%U/${userid}/g" \
931     -e "s/%g/${groupname}/g" \
932     -e "s/%G/${groupid}/g" \
933     -e "s/%h/${hostname}/g" \
934     -e "s/%d/${domainname}/g" \
935     -e "s/%D/${time_day}/g" \
936     -e "s/%M/${time_month}/g" \
937     -e "s/%Y/${time_year}/g" \
938     -e "s/%m/${time_monthname}/g" 2>/dev/null`
939     fi
940    
941     # create output
942     if [ .$opt_n = .no ]; then
943     echo $seo "$text"
944     else
945     # the harder part: echo -n is best, because
946     # awk may complain about some \xx sequences.
947     if [ ".$minusn" != . ]; then
948     echo $seo $minusn "$text"
949     else
950     echo dummy | awk '{ printf("%s", TEXT); }' TEXT="$text"
951     fi
952     fi
953    
954     shtool_exit 0
955     ;;
956    
957 gezelter 1395 mdate )
958     ##
959     ## mdate -- Pretty-print modification time of a file or dir
960     ## Copyright (c) 1995-1997 Free Software Foundation, Inc.
961     ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com>
962     ##
963    
964     fod="$1"
965     case "$opt_o" in
966     [dmy][dmy][dmy] )
967     ;;
968     * ) echo "$msgprefix:Error: invalid argument to option \`-o': $opt_o" 1>&2
969     shtool_exit 1
970     ;;
971     esac
972     if [ ! -r "$fod" ]; then
973     echo "$msgprefix:Error: file or directory not found: $fod" 1>&2
974     shtool_exit 1
975     fi
976    
977     # GNU ls changes its time format in response to the TIME_STYLE
978     # variable. Since we cannot assume "unset" works, revert this
979     # variable to its documented default.
980     if [ ".$TIME_STYLE" != . ]; then
981     TIME_STYLE=posix-long-iso
982     export TIME_STYLE
983     fi
984    
985     # get the extended ls output of the file or directory.
986     if /bin/ls -L /dev/null >/dev/null 2>&1; then
987     set - x`/bin/ls -L -l -d $fod`
988     else
989     set - x`/bin/ls -l -d $fod`
990     fi
991    
992     # The month is at least the fourth argument
993     # (3 shifts here, the next inside the loop).
994     shift; shift; shift
995    
996     # Find the month. Next argument is day, followed by the year or time.
997     month=""
998     while [ ".$month" = . ]; do
999     shift
1000     case $1 in
1001     Jan) month=January; nummonth=1 ;;
1002     Feb) month=February; nummonth=2 ;;
1003     Mar) month=March; nummonth=3 ;;
1004     Apr) month=April; nummonth=4 ;;
1005     May) month=May; nummonth=5 ;;
1006     Jun) month=June; nummonth=6 ;;
1007     Jul) month=July; nummonth=7 ;;
1008     Aug) month=August; nummonth=8 ;;
1009     Sep) month=September; nummonth=9 ;;
1010     Oct) month=October; nummonth=10 ;;
1011     Nov) month=November; nummonth=11 ;;
1012     Dec) month=December; nummonth=12 ;;
1013     esac
1014     done
1015     day="$2"
1016     year="$3"
1017    
1018     # We finally have to deal with the problem that the "ls" output
1019     # gives either the time of the day or the year.
1020     case $year in
1021     *:*)
1022     this_year=`date '+%Y' 2>/dev/null`
1023     if [ ".$this_year" = . ]; then
1024     this_year=`date '+%y'`
1025     case $this_year in
1026     [5-9][0-9]) this_year="19$this_year" ;;
1027     [0-4][0-9]) this_year="20$this_year" ;;
1028     esac
1029     fi
1030     # for the following months of the last year the time notation
1031     # is usually also used for files modified in the last year.
1032     this_month=`date '+%m'`
1033     if (expr $nummonth \> $this_month) >/dev/null; then
1034     this_year=`expr $this_year - 1`
1035     fi
1036     year="$this_year"
1037     ;;
1038     esac
1039    
1040     # Optionally fill day and month with leeding zeros
1041     if [ ".$opt_z" = .yes ]; then
1042     case $day in
1043     [0-9][0-9] ) ;;
1044     [0-9] ) day="0$day" ;;
1045     esac
1046     case $nummonth in
1047     [0-9][0-9] ) ;;
1048     [0-9] ) nummonth="0$nummonth" ;;
1049     esac
1050     fi
1051    
1052     # Optionally use digits for month
1053     if [ ".$opt_d" = .yes ]; then
1054     month="$nummonth"
1055     fi
1056    
1057     # Optionally shorten the month name to three characters
1058     if [ ".$opt_s" = .yes ]; then
1059     month=`echo $month | cut -c1-3`
1060     fi
1061    
1062     # Output the resulting date string
1063     echo dummy | awk '{
1064     for (i = 0; i < 3; i++) {
1065     now = substr(order, 1, 1);
1066     order = substr(order, 2);
1067     if (now == "d")
1068     out = day;
1069     else if (now == "m")
1070     out = month;
1071     else if (now == "y")
1072     out = year;
1073     if (i < 2)
1074     printf("%s%s", out, field);
1075     else
1076     printf("%s", out);
1077     }
1078     if (newline != "yes")
1079     printf("\n");
1080     }' "day=$day" "month=$month" "year=$year" \
1081     "field=$opt_f" "order=$opt_o" "newline=$opt_n"
1082    
1083     shtool_exit 0
1084     ;;
1085    
1086     table )
1087     ##
1088     ## table -- Pretty-print a field-separated list as a table
1089     ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com>
1090     ##
1091    
1092     if [ $opt_c -gt 4 ]; then
1093     echo "$msgprefix:Error: Invalid number of colums (1..4 allowed only)" 1>&2
1094     shtool_exit 1
1095     fi
1096     case "x$opt_F" in
1097     x? ) ;;
1098     * ) echo "$msgprefix:Error: Invalid separator (one char allowed only)" 1>&2; shtool_exit 1 ;;
1099     esac
1100    
1101     # split the list into a table
1102     list=`
1103     IFS="$opt_F"
1104     for entry in $*; do
1105     if [ ".$entry" != . ]; then
1106     echo "$entry"
1107     fi
1108     done |\
1109     awk "
1110     BEGIN { list = \"\"; n = 0; }
1111     {
1112     list = list \\$1;
1113     n = n + 1;
1114     if (n < $opt_c) {
1115     list = list \":\";
1116     }
1117     if (n == $opt_c) {
1118     list = list \"\\n\";
1119     n = 0;
1120     }
1121     }
1122     END { print list; }
1123     "
1124     `
1125    
1126     # format table cells and make sure table
1127     # doesn't exceed maximum width
1128     OIFS="$IFS"
1129     IFS='
1130     '
1131     for entry in $list; do
1132     case $opt_c in
1133     1 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s\\n\", \$1); }'" ;;
1134     2 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s\\n\", \$1, \$2); }'" ;;
1135     3 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3); }'" ;;
1136     4 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3, \$4); }'" ;;
1137     esac
1138     done |\
1139     awk "{
1140     if (length(\$0) > $opt_s) {
1141     printf(\"%s\\n\", substr(\$0, 0, $opt_s-1));
1142     } else {
1143     print \$0;
1144     }
1145     }"
1146     IFS="$OIFS"
1147    
1148     shtool_exit 0
1149     ;;
1150    
1151     prop )
1152     ##
1153     ## prop -- Display progress with a running propeller
1154     ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com>
1155     ##
1156    
1157     perl=''
1158     for dir in `echo $PATH | sed -e 's/:/ /g'` .; do
1159     if [ -f "$dir/perl" ]; then
1160     perl="$dir/perl"
1161     break
1162     fi
1163     done
1164     if [ ".$perl" != . ]; then
1165     # Perl is preferred because writing to STDERR in
1166     # Perl really writes immediately as one would expect
1167     $perl -e '
1168     @p = ("|","/","-","\\");
1169     $i = 0;
1170     while (<STDIN>) {
1171     printf(STDERR "\r%s...%s\b", $ARGV[0], $p[$i++]);
1172     $i = 0 if ($i > 3);
1173     }
1174     printf(STDERR "\r%s \n", $ARGV[0]);
1175     ' "$opt_p"
1176     else
1177     # But if Perl doesn't exists we use Awk even
1178     # some Awk's buffer even the /dev/stderr writing :-(
1179     awk '
1180     BEGIN {
1181     split("|#/#-#\\", p, "#");
1182     i = 1;
1183     }
1184     {
1185     printf("\r%s%c\b", prefix, p[i++]) > "/dev/stderr";
1186     if (i > 4) { i = 1; }
1187     }
1188     END {
1189     printf("\r%s \n", prefix) > "/dev/stderr";
1190     }
1191     ' "prefix=$opt_p"
1192     fi
1193    
1194     shtool_exit 0
1195     ;;
1196    
1197     move )
1198     ##
1199     ## move -- Move files with simultaneous substitution
1200     ## Copyright (c) 1999-2008 Ralf S. Engelschall <rse@engelschall.com>
1201     ##
1202    
1203     src="$1"
1204     dst="$2"
1205    
1206     # consistency checks
1207     if [ ".$src" = . ] || [ ".$dst" = . ]; then
1208     echo "$msgprefix:Error: Invalid arguments" 1>&2
1209     shtool_exit 1
1210     fi
1211     if [ ".$src" = ".$dst" ]; then
1212     echo "$msgprefix:Error: Source and destination files are the same" 1>&2
1213     shtool_exit 1
1214     fi
1215     expsrc="$src"
1216     if [ ".$opt_e" = .yes ]; then
1217     expsrc="`echo $expsrc`"
1218     fi
1219     if [ ".$opt_e" = .yes ]; then
1220     if [ ".`echo "$src" | sed -e 's;^.*\\*.*$;;'`" = ".$src" ]; then
1221     echo "$msgprefix:Error: Source doesn't contain wildcard ('*'): $dst" 1>&2
1222     shtool_exit 1
1223     fi
1224     if [ ".`echo "$dst" | sed -e 's;^.*%[1-9].*$;;'`" = ".$dst" ]; then
1225     echo "$msgprefix:Error: Destination doesn't contain substitution ('%N'): $dst" 1>&2
1226     shtool_exit 1
1227     fi
1228     if [ ".$expsrc" = ".$src" ]; then
1229     echo "$msgprefix:Error: Sources not found or no asterisk : $src" 1>&2
1230     shtool_exit 1
1231     fi
1232     else
1233     if [ ! -r "$src" ]; then
1234     echo "$msgprefix:Error: Source not found: $src" 1>&2
1235     shtool_exit 1
1236     fi
1237     fi
1238    
1239     # determine substitution patterns
1240     if [ ".$opt_e" = .yes ]; then
1241     srcpat=`echo "$src" | sed -e 's/\\./\\\\./g' -e 's/;/\\;/g' -e 's;\\*;\\\\(.*\\\\);g'`
1242     dstpat=`echo "$dst" | sed -e 's;%\([1-9]\);\\\\\1;g'`
1243     fi
1244    
1245     # iterate over source(s)
1246     for onesrc in $expsrc; do
1247     if [ .$opt_e = .yes ]; then
1248     onedst=`echo $onesrc | sed -e "s;$srcpat;$dstpat;"`
1249     else
1250     onedst="$dst"
1251     fi
1252     errorstatus=0
1253     if [ ".$opt_v" = .yes ]; then
1254     echo "$onesrc -> $onedst"
1255     fi
1256     if [ ".$opt_p" = .yes ]; then
1257     if [ -r $onedst ]; then
1258     if cmp -s $onesrc $onedst; then
1259     if [ ".$opt_t" = .yes ]; then
1260     echo "rm -f $onesrc" 1>&2
1261     fi
1262     rm -f $onesrc || errorstatus=$?
1263     else
1264     if [ ".$opt_t" = .yes ]; then
1265     echo "mv -f $onesrc $onedst" 1>&2
1266     fi
1267     mv -f $onesrc $onedst || errorstatus=$?
1268     fi
1269     else
1270     if [ ".$opt_t" = .yes ]; then
1271     echo "mv -f $onesrc $onedst" 1>&2
1272     fi
1273     mv -f $onesrc $onedst || errorstatus=$?
1274     fi
1275     else
1276     if [ ".$opt_t" = .yes ]; then
1277     echo "mv -f $onesrc $onedst" 1>&2
1278     fi
1279     mv -f $onesrc $onedst || errorstatus=$?
1280     fi
1281     if [ $errorstatus -ne 0 ]; then
1282     break;
1283     fi
1284     done
1285    
1286     shtool_exit $errorstatus
1287     ;;
1288    
1289 gezelter 1385 install )
1290     ##
1291     ## install -- Install a program, script or datafile
1292 gezelter 1395 ## Copyright (c) 1997-2008 Ralf S. Engelschall <rse@engelschall.com>
1293 gezelter 1385 ##
1294    
1295     # special case: "shtool install -d <dir> [...]" internally
1296     # maps to "shtool mkdir -f -p -m 755 <dir> [...]"
1297     if [ "$opt_d" = yes ]; then
1298     cmd="$0 mkdir -f -p -m 755"
1299     if [ ".$opt_o" != . ]; then
1300     cmd="$cmd -o '$opt_o'"
1301     fi
1302     if [ ".$opt_g" != . ]; then
1303     cmd="$cmd -g '$opt_g'"
1304     fi
1305     if [ ".$opt_v" = .yes ]; then
1306     cmd="$cmd -v"
1307     fi
1308     if [ ".$opt_t" = .yes ]; then
1309     cmd="$cmd -t"
1310     fi
1311     for dir in "$@"; do
1312     eval "$cmd $dir" || shtool_exit $?
1313     done
1314     shtool_exit 0
1315     fi
1316    
1317     # determine source(s) and destination
1318     argc=$#
1319     srcs=""
1320     while [ $# -gt 1 ]; do
1321     srcs="$srcs $1"
1322     shift
1323     done
1324     dstpath="$1"
1325    
1326     # type check for destination
1327     dstisdir=0
1328     if [ -d $dstpath ]; then
1329     dstpath=`echo "$dstpath" | sed -e 's:/$::'`
1330     dstisdir=1
1331     fi
1332    
1333     # consistency check for destination
1334     if [ $argc -gt 2 ] && [ $dstisdir = 0 ]; then
1335     echo "$msgprefix:Error: multiple sources require destination to be directory" 1>&2
1336     shtool_exit 1
1337     fi
1338    
1339     # iterate over all source(s)
1340     for src in $srcs; do
1341     dst=$dstpath
1342    
1343     # if destination is a directory, append the input filename
1344     if [ $dstisdir = 1 ]; then
1345     dstfile=`echo "$src" | sed -e 's;.*/\([^/]*\)$;\1;'`
1346     dst="$dst/$dstfile"
1347     fi
1348    
1349     # check for correct arguments
1350     if [ ".$src" = ".$dst" ]; then
1351     echo "$msgprefix:Warning: source and destination are the same - skipped" 1>&2
1352     continue
1353     fi
1354     if [ -d "$src" ]; then
1355     echo "$msgprefix:Warning: source \`$src' is a directory - skipped" 1>&2
1356     continue
1357     fi
1358    
1359     # make a temp file name in the destination directory
1360     dsttmp=`echo $dst |\
1361     sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;' \
1362     -e "s;\$;/#INST@$$#;"`
1363    
1364     # verbosity
1365     if [ ".$opt_v" = .yes ]; then
1366     echo "$src -> $dst" 1>&2
1367     fi
1368    
1369     # copy or move the file name to the temp name
1370     # (because we might be not allowed to change the source)
1371     if [ ".$opt_C" = .yes ]; then
1372     opt_c=yes
1373     fi
1374     if [ ".$opt_c" = .yes ]; then
1375     if [ ".$opt_t" = .yes ]; then
1376     echo "cp $src $dsttmp" 1>&2
1377     fi
1378 gezelter 1395 cp "$src" "$dsttmp" || shtool_exit $?
1379 gezelter 1385 else
1380     if [ ".$opt_t" = .yes ]; then
1381     echo "mv $src $dsttmp" 1>&2
1382     fi
1383 gezelter 1395 mv "$src" "$dsttmp" || shtool_exit $?
1384 gezelter 1385 fi
1385    
1386     # adjust the target file
1387     if [ ".$opt_e" != . ]; then
1388     sed='sed'
1389     OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_e; IFS="$OIFS"
1390     for e
1391     do
1392     sed="$sed -e '$e'"
1393     done
1394 gezelter 1395 cp "$dsttmp" "$dsttmp.old"
1395 gezelter 1385 chmod u+w $dsttmp
1396     eval "$sed <$dsttmp.old >$dsttmp" || shtool_exit $?
1397     rm -f $dsttmp.old
1398     fi
1399     if [ ".$opt_s" = .yes ]; then
1400     if [ ".$opt_t" = .yes ]; then
1401     echo "strip $dsttmp" 1>&2
1402     fi
1403     strip $dsttmp || shtool_exit $?
1404     fi
1405     if [ ".$opt_o" != . ]; then
1406     if [ ".$opt_t" = .yes ]; then
1407     echo "chown $opt_o $dsttmp" 1>&2
1408     fi
1409     chown $opt_o $dsttmp || shtool_exit $?
1410     fi
1411     if [ ".$opt_g" != . ]; then
1412     if [ ".$opt_t" = .yes ]; then
1413     echo "chgrp $opt_g $dsttmp" 1>&2
1414     fi
1415     chgrp $opt_g $dsttmp || shtool_exit $?
1416     fi
1417     if [ ".$opt_m" != ".-" ]; then
1418     if [ ".$opt_t" = .yes ]; then
1419     echo "chmod $opt_m $dsttmp" 1>&2
1420     fi
1421     chmod $opt_m $dsttmp || shtool_exit $?
1422     fi
1423    
1424     # determine whether to do a quick install
1425     # (has to be done _after_ the strip was already done)
1426     quick=no
1427     if [ ".$opt_C" = .yes ]; then
1428     if [ -r $dst ]; then
1429 gezelter 1395 if cmp -s "$src" "$dst"; then
1430 gezelter 1385 quick=yes
1431     fi
1432     fi
1433     fi
1434    
1435     # finally, install the file to the real destination
1436     if [ $quick = yes ]; then
1437     if [ ".$opt_t" = .yes ]; then
1438     echo "rm -f $dsttmp" 1>&2
1439     fi
1440     rm -f $dsttmp
1441     else
1442     if [ ".$opt_t" = .yes ]; then
1443     echo "rm -f $dst && mv $dsttmp $dst" 1>&2
1444     fi
1445     rm -f $dst && mv $dsttmp $dst
1446     fi
1447     done
1448    
1449     shtool_exit 0
1450     ;;
1451    
1452     mkdir )
1453     ##
1454     ## mkdir -- Make one or more directories
1455 gezelter 1395 ## Copyright (c) 1996-2008 Ralf S. Engelschall <rse@engelschall.com>
1456 gezelter 1385 ##
1457    
1458     errstatus=0
1459     for p in ${1+"$@"}; do
1460     # if the directory already exists...
1461     if [ -d "$p" ]; then
1462     if [ ".$opt_f" = .no ] && [ ".$opt_p" = .no ]; then
1463     echo "$msgprefix:Error: directory already exists: $p" 1>&2
1464     errstatus=1
1465     break
1466     else
1467     continue
1468     fi
1469     fi
1470     # if the directory has to be created...
1471     if [ ".$opt_p" = .no ]; then
1472     if [ ".$opt_t" = .yes ]; then
1473     echo "mkdir $p" 1>&2
1474     fi
1475     mkdir $p || errstatus=$?
1476     if [ ".$opt_o" != . ]; then
1477     if [ ".$opt_t" = .yes ]; then
1478     echo "chown $opt_o $p" 1>&2
1479     fi
1480     chown $opt_o $p || errstatus=$?
1481     fi
1482     if [ ".$opt_g" != . ]; then
1483     if [ ".$opt_t" = .yes ]; then
1484     echo "chgrp $opt_g $p" 1>&2
1485     fi
1486     chgrp $opt_g $p || errstatus=$?
1487     fi
1488     if [ ".$opt_m" != . ]; then
1489     if [ ".$opt_t" = .yes ]; then
1490     echo "chmod $opt_m $p" 1>&2
1491     fi
1492     chmod $opt_m $p || errstatus=$?
1493     fi
1494     else
1495     # the smart situation
1496     set fnord `echo ":$p" |\
1497     sed -e 's/^:\//%/' \
1498     -e 's/^://' \
1499     -e 's/\// /g' \
1500     -e 's/^%/\//'`
1501     shift
1502     pathcomp=''
1503     for d in ${1+"$@"}; do
1504     pathcomp="$pathcomp$d"
1505     case "$pathcomp" in
1506     -* ) pathcomp="./$pathcomp" ;;
1507     esac
1508     if [ ! -d "$pathcomp" ]; then
1509     if [ ".$opt_t" = .yes ]; then
1510     echo "mkdir $pathcomp" 1>&2
1511     fi
1512     mkdir $pathcomp || errstatus=$?
1513     if [ ".$opt_o" != . ]; then
1514     if [ ".$opt_t" = .yes ]; then
1515     echo "chown $opt_o $pathcomp" 1>&2
1516     fi
1517     chown $opt_o $pathcomp || errstatus=$?
1518     fi
1519     if [ ".$opt_g" != . ]; then
1520     if [ ".$opt_t" = .yes ]; then
1521     echo "chgrp $opt_g $pathcomp" 1>&2
1522     fi
1523     chgrp $opt_g $pathcomp || errstatus=$?
1524     fi
1525     if [ ".$opt_m" != . ]; then
1526     if [ ".$opt_t" = .yes ]; then
1527     echo "chmod $opt_m $pathcomp" 1>&2
1528     fi
1529     chmod $opt_m $pathcomp || errstatus=$?
1530     fi
1531     fi
1532     pathcomp="$pathcomp/"
1533     done
1534     fi
1535     done
1536    
1537     shtool_exit $errstatus
1538     ;;
1539    
1540 gezelter 1395 mkln )
1541     ##
1542     ## mkln -- Make link with calculation of relative paths
1543     ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com>
1544     ##
1545    
1546     # determine source(s) and destination
1547     args=$#
1548     srcs=""
1549     while [ $# -gt 1 ]; do
1550     srcs="$srcs $1"
1551     shift
1552     done
1553     dst="$1"
1554     if [ ! -d $dst ]; then
1555     if [ $args -gt 2 ]; then
1556     echo "$msgprefix:Error: multiple sources not allowed when target isn't a directory" 1>&2
1557     shtool_exit 1
1558     fi
1559     fi
1560    
1561     # determine link options
1562     lnopt=""
1563     if [ ".$opt_f" = .yes ]; then
1564     lnopt="$lnopt -f"
1565     fi
1566     if [ ".$opt_s" = .yes ]; then
1567     lnopt="$lnopt -s"
1568     fi
1569    
1570     # iterate over sources
1571     for src in $srcs; do
1572     # determine if one of the paths is an absolute path,
1573     # because then we _have_ to use an absolute symlink
1574     oneisabs=0
1575     srcisabs=0
1576     dstisabs=0
1577     case $src in
1578     /* ) oneisabs=1; srcisabs=1 ;;
1579     esac
1580     case $dst in
1581     /* ) oneisabs=1; dstisabs=1 ;;
1582     esac
1583    
1584     # split source and destination into dir and base name
1585     if [ -d $src ]; then
1586     srcdir=`echo $src | sed -e 's;/*$;;'`
1587     srcbase=""
1588     else
1589     srcdir=`echo $src | sed -e 's;^[^/]*$;;' -e 's;^\(.*/\)[^/]*$;\1;' -e 's;\(.\)/$;\1;'`
1590     srcbase=`echo $src | sed -e 's;.*/\([^/]*\)$;\1;'`
1591     fi
1592     if [ -d $dst ]; then
1593     dstdir=`echo $dst | sed -e 's;/*$;;'`
1594     dstbase=""
1595     else
1596     dstdir=`echo $dst | sed -e 's;^[^/]*$;;' -e 's;^\(.*/\)[^/]*$;\1;' -e 's;\(.\)/$;\1;'`
1597     dstbase=`echo $dst | sed -e 's;.*/\([^/]*\)$;\1;'`
1598     fi
1599    
1600     # consistency check
1601     if [ ".$dstdir" != . ]; then
1602     if [ ! -d $dstdir ]; then
1603     echo "$msgprefix:Error: destination directory not found: $dstdir" 1>&2
1604     shtool_exit 1
1605     fi
1606     fi
1607    
1608     # make sure the source is reachable from the destination
1609     if [ $dstisabs = 1 ]; then
1610     if [ $srcisabs = 0 ]; then
1611     if [ ".$srcdir" = . ]; then
1612     srcdir="`pwd | sed -e 's;/*$;;'`"
1613     srcisabs=1
1614     oneisabs=1
1615     elif [ -d $srcdir ]; then
1616     srcdir="`cd $srcdir; pwd | sed -e 's;/*$;;'`"
1617     srcisabs=1
1618     oneisabs=1
1619     fi
1620     fi
1621     fi
1622    
1623     # split away a common prefix
1624     prefix=""
1625     if [ ".$srcdir" = ".$dstdir" ] && [ ".$srcdir" != . ]; then
1626     prefix="$srcdir/"
1627     srcdir=""
1628     dstdir=""
1629     else
1630     while [ ".$srcdir" != . ] && [ ".$dstdir" != . ]; do
1631     presrc=`echo $srcdir | sed -e 's;^\([^/]*\)/.*;\1;'`
1632     predst=`echo $dstdir | sed -e 's;^\([^/]*\)/.*;\1;'`
1633     if [ ".$presrc" != ".$predst" ]; then
1634     break
1635     fi
1636     prefix="$prefix$presrc/"
1637     srcdir=`echo $srcdir | sed -e 's;^[^/]*/*;;'`
1638     dstdir=`echo $dstdir | sed -e 's;^[^/]*/*;;'`
1639     done
1640     fi
1641    
1642     # destination prefix is just the common prefix
1643     dstpre="$prefix"
1644    
1645     # determine source prefix which is the reverse directory
1646     # step-up corresponding to the destination directory
1647     srcpre=""
1648     allow_relative_srcpre=no
1649     if [ ".$prefix" != . ] && [ ".$prefix" != ./ ]; then
1650     allow_relative_srcpre=yes
1651     fi
1652     if [ $oneisabs = 0 ]; then
1653     allow_relative_srcpre=yes
1654     fi
1655     if [ ".$opt_s" != .yes ]; then
1656     allow_relative_srcpre=no
1657     fi
1658     if [ ".$allow_relative_srcpre" = .yes ]; then
1659     pl="$dstdir/"
1660     OIFS="$IFS"; IFS='/'
1661     for pe in $pl; do
1662     [ ".$pe" = . ] && continue
1663     [ ".$pe" = .. ] && continue
1664     srcpre="../$srcpre"
1665     done
1666     IFS="$OIFS"
1667     else
1668     if [ $srcisabs = 1 ]; then
1669     srcpre="$prefix"
1670     fi
1671     fi
1672    
1673     # determine destination symlink name
1674     if [ ".$dstbase" = . ]; then
1675     if [ ".$srcbase" != . ]; then
1676     dstbase="$srcbase"
1677     else
1678     dstbase=`echo "$prefix$srcdir" | sed -e 's;/*$;;' -e 's;.*/\([^/]*\)$;\1;'`
1679     fi
1680     fi
1681    
1682     # now finalize source and destination directory paths
1683     srcdir=`echo $srcdir | sed -e 's;\([^/]\)$;\1/;'`
1684     dstdir=`echo $dstdir | sed -e 's;\([^/]\)$;\1/;'`
1685    
1686     # run the final link command
1687     if [ ".$opt_t" = .yes ]; then
1688     echo "ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase"
1689     fi
1690     eval ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase
1691     done
1692    
1693     shtool_exit 0
1694     ;;
1695    
1696     mkshadow )
1697     ##
1698     ## mkshadow -- Make a shadow tree through symbolic links
1699     ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com>
1700     ##
1701    
1702     # source and destination directory
1703     src=`echo "$1" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'`
1704     dst=`echo "$2" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'`
1705    
1706     # check whether source exists
1707     if [ ! -d $src ]; then
1708     echo "$msgprefix:Error: source directory not found: \`$src'" 1>&2
1709     shtool_exit 1
1710     fi
1711    
1712     # determine if one of the paths is an absolute path,
1713     # because then we have to use an absolute symlink
1714     oneisabs=0
1715     case $src in
1716     /* ) oneisabs=1 ;;
1717     esac
1718     case $dst in
1719     /* ) oneisabs=1 ;;
1720     esac
1721    
1722     # determine reverse directory for destination directory
1723     dstrevdir=''
1724     if [ $oneisabs = 0 ]; then
1725     # derive reverse path from forward path
1726     pwd=`pwd`
1727     OIFS="$IFS"; IFS='/'
1728     for pe in $dst; do
1729     if [ "x$pe" = "x.." ]; then
1730     OIFS2="$IFS"; IFS="$DIFS"
1731     eval `echo "$pwd" |\
1732     sed -e 's:\([^/]*\)$:; dir="\1":' \
1733     -e 's:^\(.*\)/[^/]*;:pwd="\1";:'\
1734     -e 's:^;:pwd="";:'`
1735     dstrevdir="$dir/$dstrevdir"
1736     IFS="$OIFS2"
1737     else
1738     dstrevdir="../$dstrevdir"
1739     fi
1740     done
1741     IFS="$OIFS"
1742     else
1743     src="`cd $src; pwd`";
1744     fi
1745    
1746     # create directory tree at destination
1747     if [ ! -d $dst ]; then
1748     if [ ".$opt_t" = .yes ]; then
1749     echo "mkdir $dst" 1>&2
1750     fi
1751     mkdir $dst
1752     fi
1753     if [ ".$opt_a" = .yes ]; then
1754     DIRS=`cd $src; find . -type d -print |\
1755     sed -e '/^\.$/d' -e 's:^\./::'`
1756     else
1757     DIRS=`cd $src; find . -type d -print |\
1758     sed -e '/\/CVS/d' -e '/^\.$/d' -e 's:^\./::'`
1759     fi
1760     for dir in $DIRS; do
1761     if [ ".$opt_t" = .yes ]; then
1762     echo "mkdir $dst/$dir" 1>&2
1763     fi
1764     mkdir $dst/$dir
1765     done
1766    
1767     # fill directory tree with symlinks to files
1768     if [ ".$opt_a" = .yes ]; then
1769     FILES="`cd $src; find . -depth -print |\
1770     sed -e 's/^\.\///'`"
1771     else
1772     FILES="`cd $src; find . -depth -print |\
1773     sed -e '/\.o$/d' -e '/\.a$/d' -e '/\.so$/d' \
1774     -e '/\.cvsignore$/d' -e '/\/CVS/d' \
1775     -e '/\/\.#/d' -e '/\.orig$/d' \
1776     -e 's/^\.\///'`"
1777     fi
1778     for file in $FILES; do
1779     # don't use `-type f' above for find because of symlinks
1780     if [ -d "$src/$file" ]; then
1781     continue
1782     fi
1783     basename=`echo $file | sed -e 's:^.*/::'`
1784     dir=`echo $file | sed -e 's:[^/]*$::' -e 's:/$::' -e 's:$:/:' -e 's:^/$::'`
1785     from=`echo "$src/$file" | sed -e 's/^\.\///'`
1786     to="$dst/$dir$basename"
1787     if [ $oneisabs = 0 ]; then
1788     if [ ".$dir" != . ]; then
1789     subdir=`echo $dir | sed -e 's:/$::'`
1790     # derive reverse path from forward path
1791     revdir=''
1792     OIFS="$IFS"; IFS='/'
1793     for pe in $subdir; do
1794     revdir="../$revdir"
1795     done
1796     IFS="$OIFS"
1797     # finalize from
1798     from="$revdir$from"
1799     fi
1800     from="$dstrevdir$from"
1801     fi
1802     if [ ".$opt_v" = .yes ]; then
1803     echo " $to" 1>&2
1804     fi
1805     if [ ".$opt_t" = .yes ]; then
1806     echo "ln -s $from $to" 1>&2
1807     fi
1808     ln -s $from $to
1809     done
1810    
1811     shtool_exit 0
1812     ;;
1813    
1814     fixperm )
1815     ##
1816     ## fixperm -- Fix file permissions inside a source tree
1817     ## Copyright (c) 1996-2008 Ralf S. Engelschall <rse@engelschall.com>
1818     ##
1819    
1820     paths="$*"
1821    
1822     # check whether the test command supports the -x option
1823     if [ -x /bin/sh ] 2>/dev/null; then
1824     minusx="-x"
1825     else
1826     minusx="-r"
1827     fi
1828    
1829     # iterate over paths
1830     for p in $paths; do
1831     for file in `find $p -depth -print`; do
1832     if [ -f $file ]; then
1833     if [ $minusx $file ]; then
1834     if [ ".$opt_v" = .yes ]; then
1835     echo "-rwxr-xr-x $file" 2>&1
1836     fi
1837     if [ ".$opt_t" = .yes ]; then
1838     echo "chmod 755 $file" 2>&1
1839     fi
1840     chmod 755 $file
1841     else
1842     if [ ".$opt_v" = .yes ]; then
1843     echo "-rw-r--r-- $file" 2>&1
1844     fi
1845     if [ ".$opt_t" = .yes ]; then
1846     echo "chmod 644 $file" 2>&1
1847     fi
1848     chmod 644 $file
1849     fi
1850     continue
1851     fi
1852     if [ -d $file ]; then
1853     if [ ".$opt_v" = .yes ]; then
1854     echo "drwxr-xr-x $file" 2>&1
1855     fi
1856     if [ ".$opt_t" = .yes ]; then
1857     echo "chmod 755 $file" 2>&1
1858     fi
1859     chmod 755 $file
1860     continue
1861     fi
1862     if [ ".$opt_v" = .yes ]; then
1863     echo "?????????? $file" 2>&1
1864     fi
1865     done
1866     done
1867    
1868     shtool_exit 0
1869     ;;
1870    
1871     rotate )
1872     ##
1873     ## rotate -- Logfile rotation
1874     ## Copyright (c) 2001-2008 Ralf S. Engelschall <rse@engelschall.com>
1875     ##
1876    
1877     # make sure we have at least one file to rotate
1878     if [ ".$opt_n" = .0 ]; then
1879     echo "$msgprefix:Error: invalid argument \`$opt_n' to option -n." 1>&2
1880     shtool_exit 1
1881     fi
1882    
1883     # canonicalize -s option argument
1884     if [ ".$opt_s" != . ]; then
1885     if [ ".`expr $opt_s : '[0-9]*$'`" != .0 ]; then
1886     :
1887     elif [ ".`expr $opt_s : '[0-9]*[Kk]$'`" != .0 ]; then
1888     opt_s=`expr $opt_s : '\([0-9]*\)[Kk]$'`
1889     opt_s=`expr $opt_s \* 1024`
1890     elif [ ".`expr $opt_s : '[0-9]*[Mm]$'`" != .0 ]; then
1891     opt_s=`expr $opt_s : '\([0-9]*\)[Mm]$'`
1892     opt_s=`expr $opt_s \* 1048576` # 1024*1024
1893     elif [ ".`expr $opt_s : '[0-9]*[Gg]$'`" != .0 ]; then
1894     opt_s=`expr $opt_s : '\([0-9]*\)[Gg]$'`
1895     opt_s=`expr $opt_s \* 1073741824` # 1024*1024*1024
1896     else
1897     echo "$msgprefix:Error: invalid argument \`$opt_s' to option -s." 1>&2
1898     shtool_exit 1
1899     fi
1900     fi
1901    
1902     # option -d/-z consistency
1903     if [ ".$opt_d" = .yes ] && [ ".$opt_z" = . ]; then
1904     echo "$msgprefix:Error: option -d requires option -z." 1>&2
1905     shtool_exit 1
1906     fi
1907    
1908     # make sure target directory exists
1909     if [ ".$opt_a" != . ]; then
1910     if [ ! -d $opt_a ]; then
1911     if [ ".$opt_f" = .no ]; then
1912     echo "$msgprefix:Error: archive directory \`$opt_a' does not exist." 1>&2
1913     shtool_exit 1
1914     fi
1915     mkdir $opt_a || shtool_exit $?
1916     chmod 755 $opt_a
1917     fi
1918     if [ ! -w $opt_a ]; then
1919     echo "$msgprefix:Error: archive directory \`$opt_a' not writable." 1>&2
1920     shtool_exit 1
1921     fi
1922     fi
1923    
1924     # determine compression approach
1925     if [ ".$opt_z" != . ]; then
1926     comp_lvl="$opt_z"
1927     comp_prg=""
1928     case $comp_lvl in
1929     *:* ) eval `echo $comp_lvl |\
1930     sed -e 's%^\(.*\):\(.*\)$%comp_prg="\1"; comp_lvl="\2"%'` ;;
1931     esac
1932    
1933     # compression level consistency
1934     case $comp_lvl in
1935     [0-9] )
1936     ;;
1937     * ) echo "$msgprefix:Error: invalid compression level \`$comp_lvl'" 1>&2
1938     shtool_exit 1
1939     ;;
1940     esac
1941    
1942     # determine a suitable compression tool
1943     if [ ".$comp_prg" = . ]; then
1944     # check whether the test command supports the -x option
1945     if [ -x /bin/sh ] 2>/dev/null; then
1946     minusx="-x"
1947     else
1948     minusx="-r"
1949     fi
1950     # search for tools in $PATH
1951     paths="`echo $PATH |\
1952     sed -e 's%/*:%:%g' -e 's%/*$%%' \
1953     -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \
1954     -e 's/:/ /g'`"
1955     for prg in bzip2 gzip compress; do
1956     for path in $paths; do
1957     if [ $minusx "$path/$prg" ] && [ ! -d "$path/$prg" ]; then
1958     comp_prg="$prg"
1959     break
1960     fi
1961     done
1962     if [ ".$comp_prg" != . ]; then
1963     break
1964     fi
1965     done
1966     if [ ".$comp_prg" = . ]; then
1967     echo "$msgprefix:Error: no suitable compression tool found in \$PATH" 1>&2
1968     shtool_exit 1
1969     fi
1970     fi
1971    
1972     # determine standard compression extension
1973     # and make sure it is a known tool
1974     case $comp_prg in
1975     */bzip2 | bzip2 ) comp_ext="bz2" comp_lvl="-$comp_lvl" ;;
1976     */gzip | gzip ) comp_ext="gz" comp_lvl="-$comp_lvl" ;;
1977     */compress | compress ) comp_ext="Z"; comp_lvl="" ;;
1978     * ) echo "$msgprefix:Error: tool \`$comp_prg' is not a known compression tool" 1>&2
1979     shtool_exit 1
1980     ;;
1981     esac
1982     comp_suf=".$comp_ext"
1983     fi
1984    
1985     # iterate over all given logfile arguments
1986     for file in $*; do
1987     # make sure the logfile exists
1988     if [ ! -f $file ]; then
1989     if [ ".$opt_f" = .yes ]; then
1990     continue
1991     fi
1992     echo "$msgprefix:Error: logfile \`$file' not found" 1>&2
1993     shtool_exit 1
1994     fi
1995    
1996     # determine log directory (where original logfile is placed)
1997     ldir="."
1998     case $file in
1999     */* ) eval `echo $file | sed -e 's%^\(.*\)/\([^/]*\)$%ldir="\1"; file="\2";%'` ;;
2000     esac
2001    
2002     # determine archive directory (where rotated logfiles are placed)
2003     adir="$ldir"
2004     if [ ".$opt_a" != . ]; then
2005     case "$opt_a" in
2006     /* | ./* ) adir="$opt_a" ;;
2007     * ) adir="$ldir/$opt_a" ;;
2008     esac
2009     fi
2010    
2011     # optionally take logfile size into account
2012     if [ ".$opt_s" != . ]; then
2013     # determine size of logfile
2014     set -- `env -i /bin/ls -l "$ldir/$file" | sed -e "s;$ldir/$file;;" |\
2015     sed -e 's; -> .*$;;' -e 's;[ ][ ]*; ;g'`
2016     n=`expr $# - 3`
2017     eval "size=\`echo \${$n}\`"
2018    
2019     # skip logfile if size is still too small
2020     if [ $size -lt $opt_s ]; then
2021     if [ ".$opt_v" = .yes ]; then
2022     echo "$ldir/$file: still too small in size -- skipping"
2023     fi
2024     continue
2025     fi
2026     fi
2027    
2028     # verbosity
2029     if [ ".$opt_v" = .yes ]; then
2030     echo "rotating $ldir/$file"
2031     fi
2032    
2033     # execute prolog
2034     if [ ".$opt_P" != . ]; then
2035     if [ ".$opt_t" = .yes ]; then
2036     echo "$opt_P"
2037     fi
2038     eval $opt_P
2039     [ $? -ne 0 ] && shtool_exit $?
2040     fi
2041    
2042     # kick away out-rotated logfile
2043     n=`expr $opt_n - 1`
2044     n=`echo dummy | awk "{ printf(\"%0${opt_p}d\", n); }" n=$n`
2045     if [ -f "${adir}/${file}.${n}${comp_suf}" ]; then
2046     # optionally migrate away the out-rotated logfile
2047     if [ ".$opt_M" != . ]; then
2048     if [ ".$opt_t" = .yes ]; then
2049     echo "$opt_M ${adir}/${file}.${n}${comp_suf}"
2050     fi
2051     eval "$opt_M ${adir}/${file}.${n}${comp_suf}"
2052     [ $? -ne 0 ] && shtool_exit $?
2053     fi
2054     # finally get rid of the out-rotated logfile
2055     if [ ".$opt_t" = .yes ]; then
2056     echo "rm -f ${adir}/${file}.${n}${comp_suf}"
2057     fi
2058     rm -f ${adir}/${file}.${n}${comp_suf} || shtool_exit $?
2059     fi
2060    
2061     # rotate already archived logfiles
2062     while [ $n -gt 0 ]; do
2063     m=$n
2064     n=`expr $n - 1`
2065     n=`echo dummy | awk "{ printf(\"%0${opt_p}d\", n); }" n=$n`
2066     if [ $n -eq 0 ] && [ ".$opt_d" = .yes ]; then
2067     # special case: first rotation file under delayed compression situation
2068     if [ ! -f "${adir}/${file}.${n}" ]; then
2069     continue
2070     fi
2071    
2072     # compress file (delayed)
2073     if [ ".$opt_b" = .yes ]; then
2074     if [ ".$opt_t" = .yes ]; then
2075     echo "mv ${adir}/${file}.${n} ${adir}/${file}.${m}"
2076     fi
2077     mv ${adir}/${file}.${n} ${adir}/${file}.${m} || shtool_exit $?
2078     if [ ".$opt_t" = .yes ]; then
2079     echo "(${comp_prg} ${comp_lvl} <${adir}/${file}.${m} >${adir}/${file}.${m}${comp_suf}; rm -f ${adir}/${file}.${m}) &"
2080     fi
2081     ( ${comp_prg} ${comp_lvl} \
2082     <${adir}/${file}.${m} \
2083     >${adir}/${file}.${m}${comp_suf} || shtool_exit $?
2084     rm -f ${adir}/${file}.${m} || shtool_exit $?
2085     ) </dev/null >/dev/null 2>&1 &
2086     else
2087     if [ ".$opt_t" = .yes ]; then
2088     echo "${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${m}${comp_suf}"
2089     fi
2090     ${comp_prg} ${comp_lvl} \
2091     <${adir}/${file}.${n} \
2092     >${adir}/${file}.${m}${comp_suf} || shtool_exit $?
2093     if [ ".$opt_t" = .yes ]; then
2094     echo "rm -f ${adir}/${file}.${n}"
2095     fi
2096     rm -f ${adir}/${file}.${n} || shtool_exit $?
2097     fi
2098    
2099     # fix file attributes
2100     if [ ".$opt_o" != . ]; then
2101     if [ ".$opt_t" = .yes ]; then
2102     echo "chown $opt_o ${adir}/${file}.${m}${comp_suf}"
2103     fi
2104     chown $opt_o ${adir}/${file}.${m}${comp_suf} || shtool_exit $?
2105     fi
2106     if [ ".$opt_g" != . ]; then
2107     if [ ".$opt_t" = .yes ]; then
2108     echo "chgrp $opt_g ${adir}/${file}.${m}${comp_suf}"
2109     fi
2110     chgrp $opt_g ${adir}/${file}.${m}${comp_suf} || shtool_exit $?
2111     fi
2112     if [ ".$opt_m" != . ]; then
2113     if [ ".$opt_t" = .yes ]; then
2114     echo "chmod $opt_m ${adir}/${file}.${m}${comp_suf}"
2115     fi
2116     chmod $opt_m ${adir}/${file}.${m}${comp_suf} || shtool_exit $?
2117     fi
2118     else
2119     # standard case: second and following rotation file
2120     if [ ! -f "${adir}/${file}.${n}${comp_suf}" ]; then
2121     continue
2122     fi
2123     if [ ".$opt_t" = .yes ]; then
2124     echo "mv ${adir}/${file}.${n}${comp_suf} ${adir}/${file}.${m}${comp_suf}"
2125     fi
2126     mv ${adir}/${file}.${n}${comp_suf} ${adir}/${file}.${m}${comp_suf} || shtool_exit $?
2127     fi
2128     done
2129    
2130     # move away current logfile
2131     if [ ".$opt_c" = .yes ]; then
2132     # approach: copy[+truncate]
2133     if [ ".$opt_t" = .yes ]; then
2134     echo "cp -p ${ldir}/${file} ${adir}/${file}.${n}"
2135     fi
2136     cp -p ${ldir}/${file} ${adir}/${file}.${n} || shtool_exit $?
2137     if [ ".$opt_r" = .no ]; then
2138     if [ ".$opt_t" = .yes ]; then
2139     echo "cp /dev/null ${ldir}/${file}"
2140     fi
2141     cp /dev/null ${ldir}/${file} || shtool_exit $?
2142     fi
2143     else
2144     # approach: move[+touch]
2145     if [ ".$opt_t" = .yes ]; then
2146     echo "mv ${ldir}/${file} ${adir}/${file}.${n}"
2147     fi
2148     mv ${ldir}/${file} ${adir}/${file}.${n} || shtool_exit $?
2149     if [ ".$opt_r" = .no ]; then
2150     if [ ".$opt_t" = .yes ]; then
2151     echo "touch ${ldir}/${file}"
2152     fi
2153     touch ${ldir}/${file} || shtool_exit $?
2154     # fix file attributes
2155     if [ ".$opt_o" != . ]; then
2156     if [ ".$opt_t" = .yes ]; then
2157     echo "chown $opt_o ${ldir}/${file}"
2158     fi
2159     chown $opt_o ${ldir}/${file} || shtool_exit $?
2160     fi
2161     if [ ".$opt_g" != . ]; then
2162     if [ ".$opt_t" = .yes ]; then
2163     echo "chgrp $opt_g ${ldir}/${file}"
2164     fi
2165     chgrp $opt_g ${ldir}/${file} || shtool_exit $?
2166     fi
2167     if [ ".$opt_m" != . ]; then
2168     if [ ".$opt_t" = .yes ]; then
2169     echo "chmod $opt_m ${ldir}/${file}"
2170     fi
2171     chmod $opt_m ${ldir}/${file} || shtool_exit $?
2172     fi
2173     fi
2174     fi
2175    
2176     # regular compression step
2177     if [ ".$opt_z" != . ] && [ ".$opt_d" = .no ]; then
2178     # compress file
2179     if [ ".$opt_b" = .yes ]; then
2180     if [ ".$opt_t" = .yes ]; then
2181     echo "(${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${n}${comp_suf}; rm -f ${adir}/${file}.${n}) &"
2182     fi
2183     ( ${comp_prg} ${comp_lvl} \
2184     <${adir}/${file}.${n} \
2185     >${adir}/${file}.${n}${comp_suf} || shtool_exit $?
2186     rm -f ${adir}/${file}.${n} || shtool_exit $?
2187     ) </dev/null >/dev/null 2>&1 &
2188     else
2189     if [ ".$opt_t" = .yes ]; then
2190     echo "${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${n}${comp_suf}"
2191     fi
2192     ${comp_prg} ${comp_lvl} \
2193     <${adir}/${file}.${n} \
2194     >${adir}/${file}.${n}${comp_suf} || shtool_exit $?
2195     if [ ".$opt_t" = .yes ]; then
2196     echo "rm -f ${opt_a}${file}.${n}"
2197     fi
2198     rm -f ${adir}/${file}.${n} || shtool_exit $?
2199     fi
2200    
2201     # fix file attributes
2202     if [ ".$opt_o" != . ]; then
2203     if [ ".$opt_t" = .yes ]; then
2204     echo "chown $opt_o ${adir}/${file}.${n}${comp_suf}"
2205     fi
2206     chown $opt_o ${adir}/${file}.${n}${comp_suf} || shtool_exit $?
2207     fi
2208     if [ ".$opt_g" != . ]; then
2209     if [ ".$opt_t" = .yes ]; then
2210     echo "chgrp $opt_g ${adir}/${file}.${n}${comp_suf}"
2211     fi
2212     chgrp $opt_g ${adir}/${file}.${n}${comp_suf} || shtool_exit $?
2213     fi
2214     if [ ".$opt_m" != . ]; then
2215     if [ ".$opt_t" = .yes ]; then
2216     echo "chmod $opt_m ${adir}/${file}.${n}${comp_suf}"
2217     fi
2218     chmod $opt_m ${adir}/${file}.${n}${comp_suf} || shtool_exit $?
2219     fi
2220     fi
2221    
2222     # execute epilog
2223     if [ ".$opt_E" != . ]; then
2224     if [ ".$opt_t" = .yes ]; then
2225     echo "$opt_E"
2226     fi
2227     eval $opt_E
2228     [ $? -ne 0 ] && shtool_exit $?
2229     fi
2230     done
2231    
2232     shtool_exit 0
2233     ;;
2234    
2235     tarball )
2236     ##
2237     ## tarball -- Roll distribution tarballs
2238     ## Copyright (c) 1999-2008 Ralf S. Engelschall <rse@engelschall.com>
2239     ##
2240    
2241     srcs="$*"
2242    
2243     # check whether the test command supports the -x option
2244     if [ -x /bin/sh ] 2>/dev/null; then
2245     minusx="-x"
2246     else
2247     minusx="-r"
2248     fi
2249    
2250     # find the tools
2251     paths="`echo $PATH |\
2252     sed -e 's%/*:%:%g' -e 's%/*$%%' \
2253     -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \
2254     -e 's/:/ /g'`"
2255     for spec in find:gfind,find tar:gtar,tar tardy:tardy,tarcust; do
2256     prg=`echo $spec | sed -e 's/:.*$//'`
2257     tools=`echo $spec | sed -e 's/^.*://'`
2258     eval "prg_${prg}=''"
2259     # iterate over tools
2260     for tool in `echo $tools | sed -e 's/,/ /g'`; do
2261     # iterate over paths
2262     for path in $paths; do
2263     if [ $minusx "$path/$tool" ] && [ ! -d "$path/$tool" ]; then
2264     eval "prg_${prg}=\"$path/$tool\""
2265     break
2266     fi
2267     done
2268     eval "val=\$prg_${prg}"
2269     if [ ".$val" != . ]; then
2270     break
2271     fi
2272     done
2273     done
2274    
2275     # expand source paths
2276     exclude=''
2277     for pat in `echo $opt_e | sed 's/,/ /g'`; do
2278     exclude="$exclude | grep -v '$pat'"
2279     done
2280     if [ ".$opt_t" = .yes ]; then
2281     echo "cp /dev/null $tmpfile.lst" 1>&2
2282     fi
2283     cp /dev/null $tmpfile.lst
2284     for src in $srcs; do
2285     if [ -d $src ]; then
2286     if [ ".$opt_t" = .yes ]; then
2287     echo "(cd $src && $prg_find . -type f -depth -print) | sed -e 's:^\\.\$::' -e 's:^\\./::' | cat $exclude >>$tmpfile.lst" 1>&2
2288     fi
2289     (cd $src && $prg_find . -type f -depth -print) |\
2290     sed -e 's:^\.$::' -e 's:^\./::' | eval cat $exclude >>$tmpfile.lst
2291     else
2292     if [ ".$opt_t" = .yes ]; then
2293     echo "echo $src >>$tmpfile.lst" 1>&2
2294     fi
2295     echo $src >>$tmpfile.lst
2296     fi
2297     done
2298     sort <$tmpfile.lst >$tmpfile.lst.n
2299     mv $tmpfile.lst.n $tmpfile.lst
2300     if [ ".$opt_v" = .yes ]; then
2301     cat $tmpfile.lst | sed -e 's/^/ /' 1>&2
2302     fi
2303    
2304     # determine tarball file and directory name
2305     if [ ".$opt_o" != . ]; then
2306     tarfile="$opt_o"
2307     if [ ".$opt_d" != . ]; then
2308     tarname="$opt_d"
2309     else
2310     tarname=`echo $tarfile | sed -e 's/\.tar.*$//' -e 's;.*/\([^/]*\)$;\1;'`
2311     fi
2312     else
2313     if [ ".$opt_d" != . ]; then
2314     tarname="$opt_d"
2315     elif [ -d "$from" ]; then
2316     tarname=`echo $from | sed -e 's;.*/\([^/]*\)$;\1;'`
2317     else
2318     tarname="out"
2319     fi
2320     tarfile="$tarname.tar"
2321     fi
2322    
2323     # roll the tarball
2324     compress=''
2325     if [ ".$opt_c" != . ]; then
2326     compress="| $opt_c"
2327     fi
2328     if [ ".$prg_tardy" != . ]; then
2329     # the elegant hackers way
2330     tardy_opt="--prefix=$tarname"
2331     tardy_opt="$tardy_opt --user_number=0 --group_number=0" # security!
2332     if [ ".$opt_u" != . ]; then
2333     tardy_opt="$tardy_opt --user_name=$opt_u"
2334     fi
2335     if [ ".$opt_g" != . ]; then
2336     tardy_opt="$tardy_opt --group_name=$opt_g"
2337     fi
2338     if [ ".$opt_t" = .yes ]; then
2339     echo "cat $tmpfile.lst | xargs $prg_tar cf - | $prg_tardy $tardy_opt | cat $compress >$tmpfile.out" 1>&2
2340     fi
2341     cat $tmpfile.lst |\
2342     xargs $prg_tar cf - |\
2343     $prg_tardy $tardy_opt |\
2344     eval cat $compress >$tmpfile.out
2345     if [ ".$opt_t" = .yes ]; then
2346     echo "cp $tmpfile.out $tarfile" 1>&2
2347     fi
2348     cp $tmpfile.out $tarfile
2349     else
2350     # the portable standard way
2351     if [ ".$opt_t" = .yes ]; then
2352     echo "mkdir $tmpdir/$tarname" 1>&2
2353     fi
2354     mkdir $tmpdir/$tarname || shtool_exit 1
2355     if [ ".$opt_t" = .yes ]; then
2356     echo "cat $tmpfile.lst | xargs $prg_tar cf - | (cd $tmpdir/$tarname && $prg_tar xf -)" 1>&2
2357     fi
2358     cat $tmpfile.lst |\
2359     xargs $prg_tar cf - |\
2360     (cd $tmpdir/$tarname && $prg_tar xf -)
2361     if [ ".$opt_u" != . ]; then
2362     if [ ".$opt_t" = .yes ]; then
2363     echo "chown -R $opt_u $tmpdir/$tarname >/dev/null 2>&1" 2>&1
2364     fi
2365     chown -R $opt_u $tmpdir/$tarname >/dev/null 2>&1 ||\
2366     echo "$msgprefix:Warning: cannot set user name \`$opt_u' (would require root privileges)"
2367     fi
2368     if [ ".$opt_g" != . ]; then
2369     if [ ".$opt_t" = .yes ]; then
2370     echo "chgrp -R $opt_g $tmpdir/$tarname >/dev/null 2>&1" 2>&1
2371     fi
2372     chgrp -R $opt_g $tmpdir/$tarname >/dev/null 2>&1 ||\
2373     echo "$msgprefix:Warning: cannot set group name \`$opt_g' (would require root privileges)"
2374     fi
2375     if [ ".$opt_t" = .yes ]; then
2376     echo "(cd $tmpdir && $prg_find $tarname -type f -depth -print | sort | xargs $prg_tar cf -) | cat $compress >$tmpfile.out" 1>&2
2377     fi
2378     (cd $tmpdir && $prg_find $tarname -type f -depth -print | sort | xargs $prg_tar cf -) |\
2379     eval cat $compress >$tmpfile.out
2380     if [ ".$opt_t" = .yes ]; then
2381     echo "cp $tmpfile.out $tarfile" 1>&2
2382     fi
2383     cp $tmpfile.out $tarfile
2384     if [ ".$opt_t" = .yes ]; then
2385     echo "rm -rf $tmpdir/$tarname" 1>&2
2386     fi
2387     rm -rf $tmpdir/$tarname
2388     fi
2389    
2390     # cleanup
2391     if [ ".$opt_t" = .yes ]; then
2392     echo "rm -f $tmpfile.lst $tmpfile.out" 1>&2
2393     fi
2394     rm -f $tmpfile.lst $tmpfile.out
2395    
2396     shtool_exit 0
2397     ;;
2398    
2399     subst )
2400     ##
2401     ## subst -- Apply sed(1) substitution operations
2402     ## Copyright (c) 2001-2008 Ralf S. Engelschall <rse@engelschall.com>
2403     ##
2404    
2405     # remember optional list of file(s)
2406     files="$*"
2407     files_num="$#"
2408    
2409     # parameter consistency check
2410     if [ $# -eq 0 ] && [ ".$opt_b" != . ]; then
2411     echo "$msgprefix:Error: option -b cannot be applied to stdin" 1>&2
2412     shtool_exit 1
2413     fi
2414     if [ $# -eq 0 ] && [ ".$opt_s" = .yes ]; then
2415     echo "$msgprefix:Error: option -s cannot be applied to stdin" 1>&2
2416     shtool_exit 1
2417     fi
2418    
2419     # build underlying sed(1) command
2420     sedcmd='sed'
2421     if [ ".$opt_e" != . ]; then
2422     OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_e; IFS="$OIFS"
2423     for e
2424     do
2425     sedcmd="$sedcmd -e '$e'"
2426     done
2427     elif [ ".$opt_f" != . ]; then
2428     if [ ! -f $opt_f ]; then
2429     echo "$msgprefix:Error: command file \`$opt_f' not found or not a regular file" 1>&2
2430     shtool_exit 1
2431     fi
2432     sedcmd="$sedcmd -f '$opt_f'"
2433     else
2434     echo "$msgprefix:Error: either -e option(s) or -f option required" 1>&2
2435     shtool_exit 1
2436     fi
2437    
2438     # determine extension for original file
2439     orig=".orig"
2440     if [ ".$opt_b" != . ]; then
2441     orig="$opt_b"
2442     fi
2443    
2444     # apply sed(1) operation(s)
2445     if [ ".$files" != . ]; then
2446     # apply operation(s) to files
2447     substdone=no
2448     for file in $files; do
2449     test ".$file" = . && continue
2450     if [ ! -f $file ]; then
2451     echo "$msgprefix:Warning: file \`$file' not found or not a regular file" 1>&2
2452     continue
2453     fi
2454    
2455     # handle interactive mode
2456     if [ ".$opt_i" = .yes ]; then
2457     eval "$sedcmd <$file >$file.new"
2458     skip=no
2459     if cmp $file $file.new >/dev/null 2>&1; then
2460     rm -f $file.new
2461     skip=yes
2462     else
2463     (diff -U1 $file $file.new >$tmpfile) 2>/dev/null
2464     if [ ".`cat $tmpfile`" = . ]; then
2465     (diff -C1 $file $file.new >$tmpfile) 2>/dev/null
2466     if [ ".`cat $tmpfile`" = . ]; then
2467     echo "$msgprefix:Warning: unable to show difference for file \`$file'" 1>&2
2468     cp /dev/null $tmpfile
2469     fi
2470     fi
2471     rm -f $file.new
2472     cat $tmpfile
2473     echo dummy | awk '{ printf("%s", TEXT); }' TEXT=">>> Apply [Y/n]: "
2474     read input
2475     if [ ".$input" != .Y ] &&\
2476     [ ".$input" != .y ] &&\
2477     [ ".$input" != . ]; then
2478     skip=yes
2479     fi
2480     fi
2481     if [ ".$skip" = .yes ]; then
2482     if [ ".$opt_v" = .yes ]; then
2483     echo "file \`$file' -- skipped" 1>&2
2484     fi
2485     continue
2486     fi
2487     fi
2488    
2489     # apply sed(1) operation(s)
2490     if [ ".$opt_v" = .yes ]; then
2491     echo "patching \`$file'" 1>&2
2492     fi
2493     if [ ".$opt_t" = .yes ]; then
2494     echo "\$ cp -p $file $file$orig"
2495     echo "\$ chmod u+w $file"
2496     echo "\$ $sedcmd <$file$orig >$file"
2497     fi
2498     if [ ".$opt_n" = .no ]; then
2499     cp -p $file $file$orig
2500     chmod u+w $file >/dev/null 2>&1 || true
2501     eval "$sedcmd <$file$orig >$file"
2502     fi
2503    
2504     # optionally fix timestamp
2505     if [ ".$opt_s" = .yes ]; then
2506     if [ ".$opt_t" = .yes ]; then
2507     echo "\$ touch -r $file$orig $file"
2508     fi
2509     if [ ".$opt_n" = .no ]; then
2510     touch -r $file$orig $file
2511     fi
2512     fi
2513    
2514     # optionally check whether any content change actually occurred
2515     if [ ".$opt_q" = .no ]; then
2516     if cmp $file$orig $file >/dev/null 2>&1; then
2517     if [ ".$opt_w" = .yes ]; then
2518     echo "$msgprefix:Warning: substitution resulted in no content change on file \"$file\"" 1>&2
2519     fi
2520     else
2521     substdone=yes
2522     fi
2523     fi
2524    
2525     # optionally remove preserved original file
2526     if [ ".$opt_b" = . ]; then
2527     if [ ".$opt_t" = .yes ]; then
2528     echo "\$ rm -f $file$orig"
2529     fi
2530     if [ ".$opt_n" = .no ]; then
2531     rm -f $file$orig
2532     fi
2533     fi
2534     done
2535     if [ ".$opt_q" = .no ] && [ ".$opt_w" = .no ]; then
2536     if [ ".$substdone" = .no ]; then
2537     if [ ".$files_num" = .1 ]; then
2538     echo "$msgprefix:Warning: substitution resulted in no content change on file \"$file\"" 1>&2
2539     else
2540     echo "$msgprefix:Warning: substitution resulted in no content change on any file" 1>&2
2541     fi
2542     fi
2543     fi
2544     else
2545     # apply operation(s) to stdin/stdout
2546     if [ ".$opt_v" = .yes ]; then
2547     echo "patching <stdin>" 1>&2
2548     fi
2549     if [ ".$opt_t" = .yes ]; then
2550     echo "\$ $sedcmd"
2551     fi
2552     if [ ".$opt_n" = .no ]; then
2553     eval "$sedcmd"
2554     fi
2555     fi
2556    
2557     shtool_exit 0
2558     ;;
2559    
2560 gezelter 1385 platform )
2561     ##
2562     ## platform -- Platform Identification Utility
2563 gezelter 1395 ## Copyright (c) 2003-2008 Ralf S. Engelschall <rse@engelschall.com>
2564 gezelter 1385 ##
2565    
2566     # option post-processing
2567     if [ ".$opt_t" != . ]; then
2568     case "$opt_t" in
2569     binary )
2570     # binary package id (OpenPKG RPM)
2571     opt_F="%<ap>-%<sp>"
2572     opt_L=yes
2573     opt_S=""
2574     opt_C="+"
2575     ;;
2576     build )
2577     # build time checking (OpenPKG RPM)
2578     opt_F="%<at>-%<st>"
2579     opt_L=yes
2580     opt_S=""
2581     opt_C="+"
2582     ;;
2583     gnu )
2584     # GNU config.guess style <arch>-<vendor>-<os><osversion>
2585     opt_F="%<at>-unknown-%<st>"
2586     opt_L=yes
2587     opt_S=""
2588     opt_C="+"
2589     ;;
2590     web )
2591     # non-whitespace HTTP Server-header id
2592     opt_F="%<sp>-%<ap>"
2593     opt_S="/"
2594     opt_C="+"
2595     ;;
2596     summary)
2597     # human readable verbose summary information
2598     opt_F="Class: %[sc] (%[ac])\\nProduct: %[sp] (%[ap])\\nTechnology: %[st] (%[at])"
2599     opt_S=" "
2600     opt_C="/"
2601     ;;
2602     all-in-one )
2603     # full-table all-in-one information
2604     opt_F=""
2605     opt_F="${opt_F}concise architecture class: %<ac>\\n"
2606     opt_F="${opt_F}regular architecture class: %{ac}\\n"
2607     opt_F="${opt_F}verbose architecture class: %[ac]\\n"
2608     opt_F="${opt_F}concise architecture product: %<ap>\\n"
2609     opt_F="${opt_F}regular architecture product: %{ap}\\n"
2610     opt_F="${opt_F}verbose architecture product: %[ap]\\n"
2611     opt_F="${opt_F}concise architecture technology: %<at>\\n"
2612     opt_F="${opt_F}regular architecture technology: %{at}\\n"
2613     opt_F="${opt_F}verbose architecture technology: %[at]\\n"
2614     opt_F="${opt_F}concise system class: %<sc>\\n"
2615     opt_F="${opt_F}regular system class: %{sc}\\n"
2616     opt_F="${opt_F}verbose system class: %[sc]\\n"
2617     opt_F="${opt_F}concise system product: %<sp>\\n"
2618     opt_F="${opt_F}regular system product: %{sp}\\n"
2619     opt_F="${opt_F}verbose system product: %[sp]\\n"
2620     opt_F="${opt_F}concise system technology: %<st>\\n"
2621     opt_F="${opt_F}regular system technology: %{st}\\n"
2622     opt_F="${opt_F}verbose system technology: %[st]"
2623     ;;
2624     * )
2625     echo "$msgprefix:Error: invalid type \`$opt_t'" 1>&2
2626     exit 1
2627     ;;
2628     esac
2629     fi
2630    
2631     # assemble initial platform information
2632     UNAME_MACHINE=`(uname -m) 2>/dev/null` ||\
2633     UNAME_MACHINE=`(uname -p) 2>/dev/null` ||\
2634     UNAME_MACHINE='unknown'
2635     UNAME_SYSTEM=`(uname -s) 2>/dev/null` ||\
2636     UNAME_SYSTEM='unknown'
2637     UNAME_RELEASE=`(uname -r) 2>/dev/null` ||\
2638     UNAME_RELEASE=`(uname -v) 2>/dev/null` ||\
2639     UNAME_RELEASE='unknown'
2640    
2641     UNAME="${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}"
2642    
2643     AC=""; AP=""; AT=""
2644     SC=""; SP=""; ST=""
2645    
2646     # dispatch into platform specific sections
2647     case "${UNAME}" in
2648    
2649     # FreeBSD
2650     *:FreeBSD:* )
2651     # determine architecture
2652     AC="${UNAME_MACHINE}"
2653     case "${AC}" in
2654     i386 ) AC="iX86" ;;
2655     esac
2656     AP="${AC}"
2657     AT="${AP}"
2658     if [ ".${AT}" = ".iX86" ]; then
2659     case "`(/sbin/sysctl -n hw.model) 2>&1`" in
2660     *"Xeon"* | *"Pentium Pro"* | *"Cyrix 6x86MX"* | *"Pentium II"* | *"Pentium III"* | *"Pentium 4"* | *"Celeron"* ) AT="i686" ;;
2661     *"Pentium"* ) AT="i586" ;; *"i486[SD]X"* | *"Cyrix 486"* | *"Cyrix [56]x86"* | *"Blue Lightning" | *"Cyrix 486S/DX" ) AT="i486" ;;
2662     *"i386[SD]X"* | *"NexGen 586"* ) AT="i386" ;;
2663     esac
2664     fi
2665     # determine system
2666     r=`echo "${UNAME_RELEASE}" |\
2667     sed -e 's;[()];;' -e 's/\(-.*\)$/[\1]/'`
2668     ST="FreeBSD ${r}"
2669     SP="${ST}"
2670     case "${r}" in
2671     1.* ) SC="4.3BSD" ;;
2672     * ) SC="4.4BSD" ;;
2673     esac
2674     ;;
2675    
2676     # NetBSD
2677     *:NetBSD:* )
2678     # determine architecture
2679     AT="${UNAME_MACHINE}"
2680     AP="${AT}"
2681     case "${AP}" in
2682     i[3-6]86 ) AP="iX86" ;;
2683     esac
2684     AC="${AP}"
2685     # determine system
2686     r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'`
2687     ST="NetBSD ${r}"
2688     SP="${ST}"
2689     case "${r}" in
2690     0.* ) SC="4.3BSD" ;;
2691     * ) SC="4.4BSD" ;;
2692     esac
2693     ;;
2694    
2695     # OpenBSD
2696     *:OpenBSD:* )
2697     # determine architecture
2698     AT="${UNAME_MACHINE}"
2699     AP="${AT}"
2700     case "${AP}" in
2701     i[3-6]86 ) AP="iX86" ;;
2702     esac
2703     AC="${AP}"
2704     # determine system
2705     r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'`
2706     ST="OpenBSD ${r}"
2707     SP="${ST}"
2708     SC="4.4BSD"
2709     ;;
2710    
2711 gezelter 1395 # DragonFly BSD
2712     *:DragonFly:* )
2713     # determine architecture
2714     AT="${UNAME_MACHINE}"
2715     AP="${AT}"
2716     case "${AP}" in
2717     i[3-6]86 ) AP="iX86" ;;
2718     esac
2719     AC="${AP}"
2720     # determine system
2721     r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'`
2722     ST="DragonFly ${r}"
2723     SP="${ST}"
2724     SC="4.4BSD"
2725     ;;
2726    
2727 gezelter 1385 # GNU/Linux
2728     *:Linux:* )
2729     # determine architecture
2730     AT="${UNAME_MACHINE}"
2731     case "${AT}" in
2732     ia64 ) AT="IA64" ;;
2733     x86_64 ) AT='AMD64' ;;
2734     parisc ) AT="HPPA32" ;;
2735     parisc64 ) AT="HPPA64" ;;
2736     esac
2737     AP="${AT}"
2738     case "${AP}" in
2739     i[3-6]86 ) AP='iX86' ;;
2740     esac
2741     AC="${AP}"
2742     # determine system
2743     v_kern=`echo "${UNAME_RELEASE}" |\
2744     sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/'`
2745     v_libc=`(strings /lib/libc.so.* | grep '^GLIBC_' | sed -e 's/^GLIBC_//' |\
2746     env -i sort -n | sed -n -e '$p' | sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/') 2>/dev/null`
2747     ST="GNU/<Linux >${v_libc}/<${v_kern}>"
2748     if [ -f /etc/lsb-release ]; then
2749     eval `( . /etc/lsb-release
2750     echo "SC=\"LSB${LSB_VERSION}\""
2751     if [ ".${DISTRIB_ID}" != . -a ".${DISTRIB_RELEASE}" != . ]; then
2752     echo "SP=\"${DISTRIB_ID} ${DISTRIB_RELEASE}\""
2753     fi
2754     ) 2>/dev/null`
2755     fi
2756     if [ ".$SP" = . ]; then
2757     for tagfile in x \
2758     `cd /etc && \
2759     /bin/ls *[_-]release *[_-]version 2>/dev/null | env -i sort | \
2760     sed -e '/^redhat-release$/d' -e '/^lsb-release$/d'; \
2761     echo redhat-release lsb-release`
2762     do
2763     [ ".${tagfile}" = .x ] && continue
2764     [ ! -f "/etc/${tagfile}" ] && continue
2765     n=`echo ${tagfile} | sed -e 's/[_-]release$//' -e 's/[_-]version$//'`
2766     v=`(grep VERSION /etc/${tagfile}; cat /etc/${tagfile}) | grep '[0-9]' | sed -e 'q' |\
2767     sed -e 's/^/#/' \
2768     -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
2769     -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
2770     -e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \
2771     -e 's/^#.*$//'`
2772     case "`util_lower ${n}`" in
2773     redhat )
2774 gezelter 1395 if [ ".`egrep '(Red Hat Enterprise Linux|CentOS)' /etc/${tagfile}`" != . ]; then
2775 gezelter 1385 n="<R>ed <H>at <E>nterprise <L>inux"
2776     else
2777     n="<R>ed <H>at <L>inux"
2778     fi
2779     ;;
2780     debian ) n="Debian[ GNU/Linux]" ;;
2781     ubuntu ) n="Ubuntu[ GNU/Linux]" ;;
2782     fedora ) n="<Fedora> Core[ GNU/Linux]" ;;
2783 gezelter 1395 suse ) n="[Novell ]SUSE[ Linux]" ;;
2784 gezelter 1385 mandrake*|mandriva ) n="Mandriva[ Linux]" ;;
2785     gentoo ) n="Gentoo[ GNU/Linux]" ;;
2786     slackware ) n="Slackware[ Linux]" ;;
2787     turbolinux ) n="TurboLinux" ;;
2788     unitedlinux ) n="UnitedLinux" ;;
2789     * ) n="${n}[ GNU/Linux]" ;;
2790     esac
2791     case "$n" in
2792     *"<"*">"* ) SP="$n <$v>" ;;
2793     * ) SP="$n $v" ;;
2794     esac
2795     break
2796     done
2797     fi
2798     [ ".$SP" = . ] && SP="${ST}"
2799     [ ".$SC" = . ] && SC="LSB"
2800     ;;
2801    
2802     # Sun Solaris
2803     *:SunOS:* )
2804     # determine architecture
2805     AT="${UNAME_MACHINE}"
2806     case "${AT}" in
2807     i86pc )
2808     AT="iX86"
2809     case "`(/bin/isainfo -k) 2>&1`" in
2810     amd64 ) AT="AMD64" ;;
2811     esac
2812     ;;
2813     esac
2814     AP="${AT}"
2815     case "${AP}" in
2816     sun4[cdm] ) AP="SPARC32" ;;
2817     sun4[uv] ) AP="SPARC64" ;;
2818     sun4* ) AP="SPARC" ;;
2819     esac
2820     AC="${AP}"
2821     case "${AC}" in
2822     SPARC* ) AC="SPARC" ;;
2823     esac
2824     # determine system
2825     ST="[Sun ]SunOS ${UNAME_RELEASE}"
2826     v=`echo "${UNAME_RELEASE}" |\
2827     sed -e 's;^4\.;1.;' \
2828     -e 's;^5\.\([0-6]\)[^0-9]*$;2.\1;' \
2829     -e 's;^5\.\([0-9][0-9]*\).*;\1;'`
2830     SP="[Sun ]Solaris $v"
2831     case "${UNAME_RELEASE}" in
2832     4.* ) SC="4.3BSD" ;;
2833     5.* ) SC="SVR4" ;;
2834     esac
2835     ;;
2836    
2837     # SCO UnixWare
2838     *:UnixWare:* )
2839     # determine architecture
2840     AT="${UNAME_MACHINE}"
2841     case "${AT}" in
2842     i[3-6]86 | ix86at ) AT="iX86" ;;
2843     esac
2844     AP="${AT}"
2845     # determine system
2846     v=`/sbin/uname -v`
2847     ST="[SCO ]UnixWare ${v}"
2848     SP="${ST}"
2849     SC="SVR${UNAME_RELEASE}"
2850     ;;
2851    
2852     # QNX
2853     *:QNX:* )
2854     # determine architecture
2855     AT="${UNAME_MACHINE}"
2856     case "${AT}" in
2857     x86pc ) AT="iX86" ;;
2858     esac
2859     AP="${AT}"
2860     # determine system
2861     v="${UNAME_RELEASE}"
2862     ST="QNX[ Neutrino RTOS] ${v}"
2863     v=`echo "${v}" | sed -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\).*$;\1;'`
2864     SP="QNX[ Neutrino RTOS] ${v}"
2865     SC="QNX"
2866     ;;
2867    
2868     # SGI IRIX
2869     *:IRIX*:* )
2870     # determine architecture
2871     AT="${UNAME_MACHINE}"
2872     AP="${AT}"
2873     case "${AP}:${UNAME_SYSTEM}" in
2874     IP*:IRIX64 ) AP="MIPS64" ;;
2875     IP*:* ) AP="MIPS" ;;
2876     esac
2877     AC="${AP}"
2878     # determine system
2879     v=`(/bin/uname -R || /bin/uname -r) 2>/dev/null | sed -e 's;[0-9.]* ;;'`
2880     ST="[SGI ]IRIX ${v}"
2881     v="${UNAME_RELEASE}"
2882     SP="[SGI ]IRIX ${v}"
2883     SC="4.2BSD/SVR3"
2884     ;;
2885    
2886     # HP HP-UX
2887     *:HP-UX:* )
2888     # determine architecture
2889     AT="${UNAME_MACHINE}"
2890     case "${AT}" in
2891     ia64 ) AT="IA64" ;;
2892     9000/[34]?? ) AT=M68K ;;
2893     9000/[678][0-9][0-9])
2894     sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
2895     sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
2896     case "${sc_cpu_version}" in
2897     523 ) AT="HPPA1.0" ;;
2898     528 ) AT="HPPA1.1" ;;
2899     532 ) AT="HPPA2.0"
2900     case "${sc_kernel_bits}" in
2901     32 ) AT="${AT}n" ;;
2902     64 ) AT="${AT}w" ;;
2903     esac
2904     ;;
2905     esac
2906     ;;
2907     esac
2908     AP="${AT}"
2909     case "${AP}" in
2910     HPPA* ) AP="HPPA" ;;
2911     esac
2912     AC="${AP}"
2913     # determine system
2914     v=`echo "${UNAME_RELEASE}" | sed -e 's;^[^0-9]*;;'`
2915     ST="[HP ]<HP>-<UX ${v}>"
2916     SP="${ST}"
2917     case "${v}" in
2918     10.* ) SC="SVR4.2" ;;
2919     [7-9]* ) SC="SVR4" ;;
2920     esac
2921     ;;
2922    
2923     # HP Tru64 (OSF1)
2924     *:OSF1:* )
2925     # determine architecture
2926     AP="${UNAME_MACHINE}"
2927     case "${AP}" in
2928     alpha ) AP="Alpha" ;;
2929     esac
2930     alpha_type=`(/usr/sbin/psrinfo -v) 2>/dev/null |\
2931     sed -n -e 's/^.*The alpha \([^ ][^ ]*\).*processor.*$/\1/p' | sed -e 'q'`
2932     AT="${AP}${alpha_type}"
2933     AC="${AP}"
2934     # determine system
2935     v=`echo "${UNAME_RELEASE}" | sed -e 's;^[VTX];;'`
2936     ST="[HP ]Tru64 ${v}"
2937     SP="${ST}"
2938     SC="OSF1"
2939     ;;
2940    
2941     # IBM AIX
2942     *:AIX:* )
2943 gezelter 1395 # determine architecture
2944     cpu_arch=RS6000
2945 gezelter 1385 if [ -x /usr/sbin/lsdev -a -x /usr/sbin/lsattr ]; then
2946     cpu_id=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
2947     if [ ".`/usr/sbin/lsattr -El ${cpu_id} | grep -i powerpc`" != . ]; then
2948 gezelter 1395 cpu_arch=PPC
2949 gezelter 1385 fi
2950     elif [ -d /QOpenSys ]; then
2951     # IBM i5/OS (aka OS/400) with PASE (Portable Application Solutions Environment)
2952 gezelter 1395 cpu_arch=PPC
2953 gezelter 1385 fi
2954     if [ -x /usr/bin/oslevel ]; then
2955     os_level=`/usr/bin/oslevel`
2956     else
2957     os_level="`uname -v`.`uname -r`"
2958     fi
2959     os_level=`echo "${os_level}" |\
2960     sed -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\)\(\.[0-9][0-9]*\)\(.*\)$;<\1>\2[\3];' \
2961     -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\)\(.*\)$;<\1>\2;'`
2962     AT="${cpu_arch}"
2963     AP="${AT}"
2964     AC="${AP}"
2965 gezelter 1395 # determine system
2966 gezelter 1385 ST="[IBM ]<AIX >${os_level}"
2967     SP="${ST}"
2968     case "${os_level}" in
2969     [12]* ) SC="SVR2" ;;
2970     * ) SC="SVR4" ;;
2971     esac
2972     ;;
2973    
2974 gezelter 1395 # Apple Mac OS X (Darwin)
2975 gezelter 1385 *:Darwin:* )
2976 gezelter 1395 # determine architecture
2977     AT="`uname -p`"
2978 gezelter 1385 case "${AT}" in
2979     powerpc ) AT="PPC" ;;
2980     esac
2981     AP="${AT}"
2982 gezelter 1395 case "${AP}" in
2983     i?86 ) AP="iX86" ;;
2984     esac
2985 gezelter 1385 AC="${AP}"
2986 gezelter 1395 # determine system
2987     unset v1; unset v2; unset v3
2988     eval `echo "${UNAME_RELEASE}" |\
2989     sed -e 's/^/#/' \
2990     -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \
2991     -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \
2992     -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \
2993     -e 's/^#.*$/v1="0"/'`
2994     ST="[Apple ]<${UNAME_SYSTEM} ${v1}>${v2+.$v2}${v3+[.$v3]}"
2995     SP="$ST"
2996     v="`(sw_vers) 2>/dev/null | grep 'ProductVersion:' | sed -e 's/^ProductVersion:[^0-9]*\([0-9][0-9.]*\).*$/\1/'`"
2997     if [ ".$v" = . ]; then
2998     for name in System Server; do
2999     if [ -f /System/Library/CoreServices/${name}Version.plist ]; then
3000     v=`(defaults read "/System/Library/CoreServices/${name}Version" "ProductVersion") 2>/dev/null`
3001     [ ".$v" != . ] && break
3002     fi
3003     done
3004     fi
3005     if [ ".$v" != . ]; then
3006     unset v1; unset v2; unset v3
3007     eval `echo "${v}" |\
3008     sed -e 's/^/#/' \
3009     -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \
3010     -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \
3011     -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \
3012     -e 's/^#.*$/v1="0"/'`
3013     SP="[Apple ]Mac OS X ${v1}${v2+.$v2}${v3+[.$v3]}"
3014     fi
3015     SC="4.4BSD/Mach3.0"
3016     ;;
3017    
3018     # Windows/Cygwin
3019     *:CYGWIN*:* )
3020     # determine architecture
3021     AT="`uname -m`"
3022     AP="${AT}"
3023     case "${AP}" in
3024     i?86 ) AP="iX86" ;;
3025 gezelter 1385 esac
3026 gezelter 1395 AC="${AP}"
3027     # determine system
3028     unset v1; unset v2; unset v3
3029     eval `echo "${UNAME_RELEASE}" |\
3030     sed -e 's/^/#/' \
3031     -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \
3032     -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \
3033     -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \
3034     -e 's/^#.*$/v1="0"/'`
3035     ST="Cygwin ${v1}${v2+.$v2}${v3+[.$v3]}"
3036     SP="$ST"
3037     SC="Windows"
3038     v=`echo "${UNAME_SYSTEM}" | sed -e 's/^CYGWIN_NT-//' |\
3039     sed -e 's/^/#/' -e 's/^#\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' -e 's/^#.*$//'`
3040     case "$v" in
3041     4.0 ) SC="$SC[ NT]" ;;
3042     5.0 ) SC="$SC[ 2000]" ;;
3043     5.1 ) SC="$SC[ XP]" ;;
3044     6.0 ) SC="$SC[ Vista]" ;;
3045     esac
3046 gezelter 1385 ;;
3047    
3048     # TODO ...ADD YOUR NEW PLATFORM CHECK HERE... TODO
3049     # *:XXX:* )
3050     # ...
3051     # ;;
3052    
3053     # ...A STILL UNKNOWN PLATFORM...
3054     * )
3055     AT=`echo "${UNAME_MACHINE}" | sed -e "s; ;${opt_C};g"`
3056     AP="${AT}"
3057     AC="${AP}"
3058     v=`echo "${UNAME_RELEASE}" |\
3059     sed -e 's/^/#/' \
3060     -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
3061     -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
3062     -e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \
3063     -e 's/^#.*$/?/'`
3064     ST="${UNAME_SYSTEM} ${v}"
3065     SP="${ST}"
3066     SC="${SP}"
3067     ;;
3068    
3069     esac
3070    
3071     # provide fallback values
3072     [ ".$AT" = . ] && AT="${AP:-${AC}}"
3073     [ ".$AP" = . ] && AP="${AT:-${AC}}"
3074     [ ".$AC" = . ] && AC="${AP:-${AT}}"
3075     [ ".$ST" = . ] && ST="${SP:-${SC}}"
3076     [ ".$SP" = . ] && SP="${ST:-${SC}}"
3077     [ ".$SC" = . ] && SC="${SP:-${ST}}"
3078    
3079     # support explicit enforced verbose/concise output
3080     if [ ".$opt_v" = .yes ]; then
3081     opt_F=`echo ":$opt_F" | sed -e 's/^://' -e 's/%\([as][cpt]\)/%[\1]/g'`
3082     elif [ ".$opt_c" = .yes ]; then
3083     opt_F=`echo ":$opt_F" | sed -e 's/^://' -e 's/%\([as][cpt]\)/%<\1>/g'`
3084     fi
3085    
3086     # provide verbose and concise variants
3087     AC_V=""; AC_N=""; AC_C=""
3088     AP_V=""; AP_N=""; AP_C=""
3089     AT_V=""; AT_N=""; AT_C=""
3090     SC_V=""; SC_N=""; SC_C=""
3091     SP_V=""; SP_N=""; SP_C=""
3092     ST_V=""; ST_N=""; ST_C=""
3093     for var_lc in at ap ac st sp sc; do
3094     case "$opt_F" in
3095     *"%[${val_lc}]"* | *"%{${val_lc}}"* | *"%${val_lc}"* | *"%<${val_lc}>"* )
3096     var_uc=`util_upper "$var_lc"`
3097     eval "val=\"\$${var_uc}\""
3098     val_V=""; val_N=""; val_C=""
3099     case "$opt_F" in
3100     *"%[${var_lc}]"* )
3101     val_V=`echo ":$val" | \
3102     sed -e 's/^://' \
3103     -e 's;\[\([^]]*\)\];\1;g' \
3104     -e 's;<\([^>]*\)>;\1;g' \
3105     -e "s; ;§§;g" \
3106     -e "s;/;%%;g" \
3107     -e "s;§§;${opt_S};g" \
3108     -e "s;%%;${opt_C};g"`
3109     eval "${var_uc}_V=\"\${val_V}\""
3110     ;;
3111     esac
3112     case "$opt_F" in
3113     *"%{${var_lc}}"* | *"%${var_lc}"* )
3114     val_N=`echo ":$val" | \
3115     sed -e 's/^://' \
3116     -e 's;\[\([^]]*\)\];;g' \
3117     -e 's;<\([^>]*\)>;\1;g' \
3118     -e "s; ;§§;g" \
3119     -e "s;/;%%;g" \
3120     -e "s;§§;${opt_S};g" \
3121     -e "s;%%;${opt_C};g"`
3122     eval "${var_uc}_N=\"\${val_N}\""
3123     ;;
3124     esac
3125     case "$opt_F" in
3126     *"%<${var_lc}>"* )
3127     val_C=`echo ":$val" | \
3128     sed -e 's/^://' \
3129     -e 's;\[\([^]]*\)\];;g' \
3130     -e 's;[^<]*<\([^>]*\)>[^<]*;\1;g' \
3131     -e "s; ;§§;g" \
3132     -e "s;/;%%;g" \
3133     -e "s;§§;${opt_S};g" \
3134     -e "s;%%;${opt_C};g"`
3135     eval "${var_uc}_C=\"\${val_C}\""
3136     ;;
3137     esac
3138     ;;
3139     esac
3140     done
3141    
3142     # create output string
3143     output=`echo ":$opt_F" |\
3144     sed -e "s/^://" \
3145     -e "s;%\\[ac\\];${AC_V};g" \
3146     -e "s;%{ac};${AC_N};g" \
3147     -e "s;%ac;${AC_N};g" \
3148     -e "s;%<ac>;${AC_C};g" \
3149     -e "s;%\\[ap\\];${AP_V};g" \
3150     -e "s;%{ap};${AP_N};g" \
3151     -e "s;%ap;${AP_N};g" \
3152     -e "s;%<ap>;${AP_C};g" \
3153     -e "s;%\\[at\\];${AT_V};g" \
3154     -e "s;%{at};${AT_N};g" \
3155     -e "s;%at;${AT_N};g" \
3156     -e "s;%<at>;${AT_C};g" \
3157     -e "s;%\\[sc\\];${SC_V};g" \
3158     -e "s;%{sc};${SC_N};g" \
3159     -e "s;%sc;${SC_N};g" \
3160     -e "s;%<sc>;${SC_C};g" \
3161     -e "s;%\\[sp\\];${SP_V};g" \
3162     -e "s;%{sp};${SP_N};g" \
3163     -e "s;%sp;${SP_N};g" \
3164     -e "s;%<sp>;${SP_C};g" \
3165     -e "s;%\\[st\\];${ST_V};g" \
3166     -e "s;%{st};${ST_N};g" \
3167     -e "s;%st;${ST_N};g" \
3168     -e "s;%<st>;${ST_C};g" \
3169     -e 's/\\\\n/^/g' |\
3170     tr '^' '\012'`
3171    
3172     # support lower/upper-case mapping
3173     if [ ".$opt_L" = .yes ]; then
3174     output=`util_lower "$output"`
3175     elif [ ".$opt_U" = .yes ]; then
3176     output=`util_upper "$output"`
3177     fi
3178    
3179     # display output string
3180     if [ ".$opt_n" = .yes ]; then
3181     echo . | awk '{ printf("%s", output); }' output="$output"
3182     else
3183     echo "$output"
3184     fi
3185    
3186     shtool_exit 0
3187     ;;
3188    
3189 gezelter 1395 arx )
3190     ##
3191     ## arx -- Extended archive command
3192     ## Copyright (c) 1999-2008 Ralf S. Engelschall <rse@engelschall.com>
3193     ##
3194    
3195     ar_prg="$opt_C"
3196     ar_cmd="$1"; shift
3197     archive="$1"; shift
3198     files="$*"
3199    
3200     # walk through the file list and expand archives members
3201     ar_tmpdir=`echo $archive | sed -e 's;[^/]*$;.arx;'`
3202     nfiles=''
3203     if [ ".$files" != . ]; then
3204     for file in $files; do
3205     if [ ! -f $file ]; then
3206     echo "$msgprefix:Error: input file not found: $file" 1>&2
3207     shtool_exit 1
3208     fi
3209     case $file in
3210     *.a )
3211     if [ ! -d $ar_tmpdir ]; then
3212     if [ ".$opt_t" = .yes ]; then
3213     echo "mkdir $ar_tmpdir" 1>&2
3214     fi
3215     mkdir $ar_tmpdir
3216     fi
3217     case $ar_tmpdir in
3218     .arx )
3219     from="../$file"
3220     ;;
3221     * )
3222     dir=`echo $file | sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;'`
3223     base=`echo $file | sed -e 's;.*/\([^/]*\)$;\1;'`
3224     from="`cd $dir; pwd`/$base"
3225     ;;
3226     esac
3227     if [ ".$opt_t" = .yes ]; then
3228     echo "(cd $ar_tmpdir && $ar_prg x $from)" 1>&2
3229     fi
3230     (cd $ar_tmpdir && eval $ar_prg x $from)
3231     if [ $? -ne 0 ]; then
3232     echo "$msgprefix:Error: member extraction failed for archive: $file" 1>&2
3233     shtool_exit 1
3234     fi
3235     for member in - `eval $ar_prg t $file | sed -e '/_\.SYMDEF/d'`; do
3236     [ ".$member" = .- ] && continue
3237     nfiles="$nfiles $ar_tmpdir/$member"
3238     done
3239     ;;
3240     * )
3241     nfiles="$nfiles $file"
3242     ;;
3243     esac
3244     done
3245     fi
3246    
3247     # run the final archive command
3248     if [ ".$opt_t" = .yes ]; then
3249     echo "$ar_prg $ar_cmd $archive $nfiles" 1>&2
3250     fi
3251     eval $ar_prg $ar_cmd $archive $nfiles
3252     if [ $? -ne 0 ]; then
3253     echo "$msgprefix:Error: archive command failed" 1>&2
3254     shtool_exit $?
3255     fi
3256    
3257     # cleanup and die gracefully
3258     if [ -d $ar_tmpdir ]; then
3259     if [ ".$opt_t" = .yes ]; then
3260     echo "rm -rf $ar_tmpdir" 1>&2
3261     fi
3262     rm -rf $ar_tmpdir
3263     fi
3264    
3265     shtool_exit 0
3266     ;;
3267    
3268     slo )
3269     ##
3270     ## slo -- Separate linker options by library class
3271     ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com>
3272     ##
3273    
3274     DIFS="$IFS"
3275    
3276     # parse out -L and -l options from command line
3277     DIRS=''
3278     LIBS=''
3279     ARGV=''
3280     optprev=''
3281     for opt
3282     do
3283     # concatenate with previous option if exists
3284     if [ ".$optprev" != . ]; then
3285     opt="${optprev}${opt}";
3286     optprev=''
3287     fi
3288     # remember options for arg if used stand-alone
3289     if [ ".$opt" = ".-L" ] || [ ".$opt" = ".-l" ]; then
3290     optprev="$opt"
3291     continue;
3292     fi
3293     # split argument into option plus option argument
3294     arg="`echo $opt | cut -c3-`"
3295     opt="`echo $opt | cut -c1-2`"
3296     # store into containers
3297     case $opt in
3298     -L) DIRS="$DIRS:$arg" ;;
3299     -l) LIBS="$LIBS:$arg" ;;
3300     *) ARGV="$ARGV $opt" ;;
3301     esac
3302     done
3303    
3304     # set linker default directories
3305     DIRS_DEFAULT='/lib:/usr/lib'
3306     if [ ".$LD_LIBRARY_PATH" != . ]; then
3307     DIRS_DEFAULT="$DIRS_DEFAULT:$LD_LIBRARY_PATH"
3308     fi
3309    
3310     # sort options by class
3311     DIRS_OBJ=''
3312     LIBS_OBJ=''
3313     DIRS_PIC=''
3314     LIBS_PIC=''
3315     DIRS_DSO=''
3316     LIBS_DSO=''
3317    
3318     # for each library...
3319     OIFS="$IFS"; IFS=':'
3320     for lib in $LIBS; do
3321     [ ".$lib" = . ] && continue
3322    
3323     found='no'
3324     found_indefdir='no'
3325     found_type=''
3326     found_dir=''
3327    
3328     # for each directory...
3329     OIFS2="$IFS"; IFS=":$DIFS"
3330     for dir in ${DIRS} switch-to-defdirs ${DIRS_DEFAULT}; do
3331     [ ".$dir" = . ] && continue
3332     [ ".$dir" = .switch-to-defdirs ] && found_indefdir=yes
3333     [ ! -d $dir ] && continue
3334    
3335     # search the file
3336     OIFS3="$IFS"; IFS="$DIFS"
3337     for file in '' `cd $dir && env -i /bin/ls lib${lib}.* 2>/dev/null`; do
3338     [ ".$file" = . ] && continue
3339     case $file in
3340     *.so|*.so.[0-9]*|*.sl|*.sl.[0-9]* )
3341     found=yes;
3342     found_type=DSO;
3343     break
3344     ;;
3345     *.lo|*.la )
3346     found=yes;
3347     found_type=PIC
3348     ;;
3349     *.a )
3350     if [ ".$found_type" = . ]; then
3351     found=yes
3352     found_type=OBJ
3353     fi
3354     ;;
3355     esac
3356     done
3357     IFS="$OIFS3"
3358     if [ ".$found" = .yes ]; then
3359     found_dir="$dir"
3360     break
3361     fi
3362     done
3363     IFS="$OIFS2"
3364    
3365     if [ ".$found" = .yes ]; then
3366     if [ ".$found_indefdir" != .yes ]; then
3367     eval "dirlist=\"\${DIRS_${found_type}}:\""
3368     case "$dirlist" in
3369     *:$found_dir:* ) ;;
3370     * ) eval "DIRS_${found_type}=\"\$DIRS_${found_type}:${found_dir}\"" ;;
3371     esac
3372     eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\""
3373     else
3374     eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\""
3375     fi
3376     else
3377     LIBS_OBJ="$LIBS_OBJ:$lib"
3378     #dirlist="`echo $DIRS $DIRS_DEFAULT | sed -e 's/:/ /g'`"
3379     #echo "slo:Warning: library \"$lib\" not found in any of the following dirs:" 2>&1
3380     #echo "slo:Warning: $dirlist" 1>&1
3381     fi
3382     done
3383     IFS="$OIFS"
3384    
3385     # also pass-through unused dirs even if it's useless
3386     OIFS="$IFS"; IFS=':'
3387     for dir in $DIRS; do
3388     dirlist="${DIRS_OBJ}:${DIRS_PIC}:${DIRS_DSO}:"
3389     case "$dirlist" in
3390     *:$dir:* ) ;;
3391     * ) DIRS_OBJ="$DIRS_OBJ:$dir" ;;
3392     esac
3393     done
3394     IFS="$OIFS"
3395    
3396     # reassemble the options but separated by type
3397     for type in OBJ PIC DSO; do
3398     OIFS="$IFS"; IFS=':'
3399     eval "libs=\"\$LIBS_${type}\""
3400     opts=''
3401     for lib in $libs; do
3402     [ ".$lib" = . ] && continue
3403     opts="$opts -l$lib"
3404     done
3405     eval "LIBS_${type}=\"$opts\""
3406    
3407     eval "dirs=\"\$DIRS_${type}\""
3408     opts=''
3409     for dir in $dirs; do
3410     [ ".$dir" = . ] && continue
3411     opts="$opts -L$dir"
3412     done
3413     eval "DIRS_${type}=\"$opts\""
3414     IFS="$OIFS"
3415     done
3416    
3417     # give back results
3418     for var in ARGV DIRS_OBJ LIBS_OBJ DIRS_PIC LIBS_PIC DIRS_DSO LIBS_DSO; do
3419     eval "val=\"\$${var}\""
3420     val="`echo $val | sed -e 's/^ *//'`"
3421     echo "${opt_p}${var}=\"${val}\""
3422     done
3423    
3424     shtool_exit 0
3425     ;;
3426    
3427     scpp )
3428     ##
3429     ## scpp -- Sharing C Pre-Processor
3430     ## Copyright (c) 1999-2008 Ralf S. Engelschall <rse@engelschall.com>
3431     ##
3432    
3433     srcs="$*"
3434     output="${opt_o}.n"
3435    
3436     # find a reasonable Awk
3437     awk=''
3438     paths=`echo $PATH |\
3439     sed -e 's%/*:%:%g' -e 's%/$%%' \
3440     -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \
3441     -e 's/:/ /g'`
3442     for name in gawk nawk awk; do
3443     for path in $paths; do
3444     if [ -r "$path/$name" ]; then
3445     awk="$path/$name"
3446     break
3447     fi
3448     done
3449     if [ ".$awk" != . ]; then
3450     break
3451     fi
3452     done
3453     if [ ".$awk" = . ]; then
3454     echo "$msgprefix:Error: cannot find a reasonable Awk" 1>&2
3455     shtool_exit 1
3456     fi
3457    
3458     # parse source file(s)
3459     if [ ".$opt_v" = .yes ]; then
3460     echo "Parsing:" | $awk '{ printf("%s", $0); }' 1>&2
3461     fi
3462     for src in $srcs; do
3463     if [ ".$opt_v" = .yes ]; then
3464     echo $src | $awk '{ printf(" %s", $0); }' 1>&2
3465     fi
3466     if [ ".$opt_f" != . ]; then
3467     inputcmd="sed"
3468     OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_f; IFS="$OIFS"
3469     for e
3470     do
3471     inputcmd="$inputcmd -e '$e'"
3472     done
3473     inputcmd="$inputcmd '$src'"
3474     else
3475     inputcmd="cat '$src'"
3476     fi
3477     eval $inputcmd |\
3478     $awk '
3479     BEGIN {
3480     ln = 0;
3481     fln = 0;
3482     level = 0;
3483     mode = "";
3484     store = "";
3485     }
3486     {
3487     ln++;
3488     }
3489     /^#if.*/ {
3490     level++;
3491     }
3492     /^#if [a-zA-Z_][a-zA-Z0-9_]* *$/ {
3493     if ($2 == define) {
3494     mode = "D";
3495     printf("D:#line %d \"%s\"\n", ln, src);
3496     next;
3497     }
3498     }
3499     /^#endif.*/ {
3500     level--;
3501     if (mode == "D" && level == 0) {
3502     mode = "";
3503     next;
3504     }
3505     }
3506     /^[a-zA-Z_][a-zA-Z0-9_].*;.*/ {
3507     if ($1 == class) {
3508     printf("V:#line %d \"%s\"\n", ln, src);
3509     printf("V:%s\n", $0);
3510     printf("J:%s\n", $0);
3511     next;
3512     }
3513     }
3514     /^[a-zA-Z_][a-zA-Z0-9_].*=.*/ {
3515     if ($1 == class) {
3516     printf("V:#line %d \"%s\"\n", ln, src);
3517     printf("V:%s\n", $0);
3518     printf("J:%s\n", $0);
3519     next;
3520     }
3521     }
3522     /^[a-zA-Z_][a-zA-Z0-9_]*/ {
3523     if ($1 == class) {
3524     fln = ln;
3525     store = $0;
3526     mode = "F";
3527     next;
3528     }
3529     }
3530     /^\{ *$/ {
3531     if (mode == "F") {
3532     printf("F:#line %d \"%s\"\n", fln, src);
3533     printf("F:%s;\n", store);
3534     printf("I:%s;\n", store);
3535     store = "";
3536     mode = "";
3537     next;
3538     }
3539     }
3540     {
3541     if (mode == "D")
3542     printf("D:%s\n", $0);
3543     else if (mode == "F")
3544     store = store " " $0;
3545     }
3546     ' "src=$src" "define=$opt_D" "class=$opt_C" >>$tmpfile
3547     done
3548     if [ ".$opt_v" = .yes ]; then
3549     echo "" 1>&2
3550     fi
3551    
3552     # start generating output header
3553     echo "/* $opt_o -- autogenerated from $opt_t, DO NOT EDIT! */" >$output
3554     echo "#line 1 \"$opt_t\"" >>$output
3555     sed <$opt_t -e "1,/^${opt_M} *\$/p" -e 'd' |\
3556     sed -e "/^${opt_M} *\$/d" >>$output
3557    
3558     # merge in the define blocks
3559     grep '^D:' $tmpfile | sed -e 's/^D://' >>$output
3560    
3561     # generate standard prolog
3562     echo "#line 1 \"_ON_THE_FLY_\"" >>$output
3563     echo "" >>$output
3564     echo "/* make sure the scpp source extensions are skipped */" >>$output
3565     echo "#define $opt_D 0" >>$output
3566     echo "#define $opt_C /**/" >>$output
3567    
3568     # generate namespace hiding for variables
3569     echo "" >>$output
3570     echo "/* move intern variables to hidden namespace */" >>$output
3571     grep '^J:' $tmpfile | sed >>$output \
3572     -e 's/^J://' \
3573     -e 's/ */ /g' \
3574     -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\)\[\];.*$/#define \1 __\1/' \
3575     -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\)\[\] =.*$/#define \1 __\1/' \
3576     -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\);.*$/#define \1 __\1/' \
3577     -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\) =.*$/#define \1 __\1/'
3578    
3579     # generate namespace hiding for functions
3580     echo "" >>$output
3581     echo "/* move intern functions to hidden namespace */" >>$output
3582     grep '^I:' $tmpfile | sed >>$output \
3583     -e 's/^I://' \
3584     -e 's/\([ (]\) */\1/g' \
3585     -e 's/ *\([),]\)/\1/g' \
3586     -e 's/^[^(]*[ *]\([a-zA-Z0-9_]*\)(.*$/#define \1 __\1/'
3587    
3588     # generate prototypes for variables
3589     echo "" >>$output
3590     echo "/* prototypes for intern variables */" >>$output
3591     grep '^V:' $tmpfile | sed >>$output \
3592     -e 's/^V://' \
3593     -e 's/ */ /g' \
3594     -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\[\]\);.*$/\1;/' \
3595     -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\[\]\) =.*$/\1;/' \
3596     -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\);.*$/\1;/' \
3597     -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\) =.*$/\1;/' \
3598     -e 's/ ;/;/g' \
3599     -e "s/^$opt_C /extern /"
3600    
3601     # generate prototypes for functions
3602     echo "" >>$output
3603     echo "/* prototypes for intern functions */" >>$output
3604     grep '^F:' $tmpfile | sed >>$output \
3605     -e 's/^F://' \
3606     -e 's/\([ (]\) */\1/g' \
3607     -e 's/ *\([),]\)/\1/g' \
3608     -e 's/\([* ]\)[a-zA-Z0-9_]*,/\1,/g' \
3609     -e 's/\([* ]\)[a-zA-Z0-9_]*);/\1);/g' \
3610     -e 's/(\*[a-zA-Z0-9_]*)(/(*)(/g' \
3611     -e 's/\([ (]\) */\1/g' \
3612     -e 's/ *\([),]\)/\1/g' \
3613     -e "s/^$opt_C /extern /"
3614    
3615     # finish generating output header
3616     n=`(echo ''; sed <$opt_t -e "1,/^${opt_M} *\$/p" -e 'd') |\
3617     wc -l | sed -e 's;^ *\([0-9]*\) *$;\1;'`
3618     echo "#line $n \"$opt_t\"" >>$output
3619     sed <$opt_t -e "/^${opt_M} *\$/,\$p" -e 'd' |\
3620     sed -e "/^${opt_M} *\$/d" >>$output
3621    
3622     # create final output file
3623     if [ -f $opt_o ]; then
3624     if [ ".$opt_p" = .yes ]; then
3625     grep -v '^#line' $opt_o >$tmpfile.o
3626     grep -v '^#line' $output >$tmpfile.n
3627     out_old="$tmpfile.o"
3628     out_new="$tmpfile.n"
3629     else
3630     out_old="$opt_o"
3631     out_new="$output"
3632     fi
3633     if cmp -s $out_old $out_new; then
3634     :
3635     else
3636     cp $output $opt_o
3637     fi
3638     else
3639     cp $output $opt_o
3640     fi
3641     rm -f $output
3642     rm -f $tmpfile $tmpfile.* >/dev/null 2>&1
3643    
3644     shtool_exit 0
3645     ;;
3646    
3647     version )
3648     ##
3649     ## version -- Maintain a version information file
3650     ## Copyright (c) 1994-2008 Ralf S. Engelschall <rse@engelschall.com>
3651     ##
3652    
3653     file="$1"
3654    
3655     # determine prefix and name
3656     name="$opt_n"
3657     prefix="$opt_p"
3658    
3659     # determine current version
3660     triple="$opt_s"
3661     if [ ".$triple" != . ]; then
3662     # use given triple
3663     if [ ".`echo $triple | grep '[0-9]*.[0-9]*[sabp.][0-9]*'`" = . ]; then
3664     echo "$msgprefix:Error: invalid argument to option \`-s': \`$opt_s'" 1>&2
3665     shtool_exit 1
3666     fi
3667     eval `echo $triple |\
3668     sed -e 's%\([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\).*%\
3669     ver="\1";rev="\2";typ="\3";lev="\4"%'`
3670     tim=calc
3671     elif [ -r $file ]; then
3672     # determine triple from given file
3673     eval `grep 'Version [0-9]*.[0-9]*[sabp.][0-9]* ([0-9]*-[a-zA-Z]*-[0-9]*)' $file |\
3674     sed -e 's%.*Version \([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\) (\([0-9]*-[a-zA-Z]*-[0-9]*\)).*%\
3675     ver="\1";rev="\2";typ="\3";lev="\4";tim="\5"%' -e 'q'`
3676     else
3677     # intialise to first version
3678     ver=0
3679     rev=1
3680     typ=.
3681     lev=0
3682     tim=calc
3683     fi
3684    
3685     # determine new version in batch
3686     if [ ".$opt_i" != . ]; then
3687     case $opt_i in
3688     v ) ver=`expr $ver + 1`
3689     rev=0
3690     lev=0
3691     ;;
3692     r ) rev=`expr $rev + 1`
3693     lev=0
3694     ;;
3695     l ) lev=`expr $lev + 1`
3696     ;;
3697     * ) echo "$msgprefix:Error: invalid argument to option \`-i': \`$opt_i'" 1>&2
3698     shtool_exit 1
3699     ;;
3700     esac
3701     tim=calc
3702     fi
3703    
3704     # determine new version interactively
3705     if [ ".$opt_e" = .yes ]; then
3706     echo "old version: ${ver}.${rev}${typ}${lev}"
3707     while [ 1 ]; do
3708     echo dummy | awk '{ printf("new version: "); }'
3709     read triple
3710     case $triple in
3711     [0-9]*.[0-9]*[sabp.][0-9]* )
3712     ;;
3713     * ) echo "$msgprefix:Error: invalid version string entered: \`$triple'" 1>&2
3714     continue
3715     ;;
3716     esac
3717     break
3718     done
3719     eval `echo $triple |\
3720     sed -e 's%^\([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\)$%\
3721     ver="\1";rev="\2";typ="\3";lev="\4"%'`
3722     tim=calc
3723     fi
3724    
3725     # determine hexadecimal and libtool value of version
3726     case $typ in
3727     a ) typnum=0; levnum=$lev ;;
3728     b ) typnum=1; levnum=$lev ;;
3729     p | . ) typnum=2; levnum=$lev ;;
3730     s ) typnum=15; levnum=255 ;; # snapshots are special
3731     esac
3732     hex=`echo "$ver:$rev:$typnum:$levnum" |\
3733     awk -F: '{ printf("0x%x%02x%1x%02x", $1, $2, $3, $4); }' |\
3734     tr 'abcdef' 'ABCDEF'`
3735     ltv=`echo "$ver:$rev:$typnum:$levnum" |\
3736     awk -F: '{ printf("%d:%d", $1*10 + $2, $3*10 + $4); }'`
3737    
3738     # determine date
3739     if [ ".$tim" = .calc ]; then
3740     day=`date '+%d'`
3741     month=`date '+%m'`
3742     year=`date '+%Y' 2>/dev/null`
3743     if [ ".$time_year" = . ]; then
3744     year=`date '+%y'`
3745     case $year in
3746     [5-9][0-9]) year="19$year" ;;
3747     [0-4][0-9]) year="20$year" ;;
3748     esac
3749     fi
3750     case $month in
3751     1|01) month='Jan' ;;
3752     2|02) month='Feb' ;;
3753     3|03) month='Mar' ;;
3754     4|04) month='Apr' ;;
3755     5|05) month='May' ;;
3756     6|06) month='Jun' ;;
3757     7|07) month='Jul' ;;
3758     8|08) month='Aug' ;;
3759     9|09) month='Sep' ;;
3760     10) month='Oct' ;;
3761     11) month='Nov' ;;
3762     12) month='Dec' ;;
3763     esac
3764     tim="${day}-${month}-${year}"
3765     fi
3766    
3767     # perform result actions
3768     mode=show
3769     if [ ".$opt_i" != . ]; then
3770     mode=edit
3771     elif [ ".$opt_e" = .yes ]; then
3772     mode=edit
3773     elif [ ".$opt_s" != . ]; then
3774     mode=edit
3775     fi
3776     if [ ".$mode" = .show ]; then
3777     # just display the current version
3778     case $opt_d in
3779     short )
3780     echo "${ver}.${rev}${typ}${lev}"
3781     ;;
3782     long )
3783     echo "${ver}.${rev}${typ}${lev} ($tim)"
3784     ;;
3785     libtool )
3786     echo "${ltv}"
3787     ;;
3788     hex )
3789     echo "${hex}"
3790     ;;
3791     * ) echo "$msgprefix:Error: invalid argument to option \`-d': \`$opt_d'" 1>&2
3792     shtool_exit 1
3793     ;;
3794     esac
3795     else
3796     # update the version file
3797    
3798     # pre-generate various strings
3799     triple="${ver}.${rev}${typ}${lev}"
3800     vHex="$hex"
3801     vShort="${triple}"
3802     vLong="${triple} (${tim})"
3803     vTeX="This is ${name}, Version ${triple} (${tim})"
3804     vGNU="${name} ${triple} (${tim})"
3805     vWeb="${name}/${triple}"
3806     vSCCS="@(#)${name} ${triple} (${tim})"
3807     vRCS="\$Id: ${name} ${triple} (${tim}) \$"
3808    
3809     # determine string out of filename
3810     # (do NOT try to optimize this in any way because of portability)
3811     filestr=`util_upper "$file" | tr './%+' '____' | sed -e 's/-/_/g'`
3812    
3813     # generate uppercase prefix
3814     prefixupper=`util_upper "$prefix"`
3815    
3816     # create the version file according the the selected language
3817     echo "new version: ${vLong}"
3818    
3819     cp /dev/null $file
3820     case $opt_l in
3821     txt )
3822     echo >>$file ""
3823     echo >>$file " ${file} -- Version Information for ${name} (syntax: Text)"
3824     echo >>$file " [automatically generated and maintained by GNU shtool]"
3825     echo >>$file ""
3826     echo >>$file " $vTeX"
3827     echo >>$file ""
3828     ;;
3829     c )
3830     echo >>$file "/*"
3831     echo >>$file "** ${file} -- Version Information for ${name} (syntax: C/C++)"
3832     echo >>$file "** [automatically generated and maintained by GNU shtool]"
3833     echo >>$file "*/"
3834     echo >>$file ""
3835     echo >>$file "#ifdef _${filestr}_AS_HEADER_"
3836     echo >>$file ""
3837     echo >>$file "#ifndef _${filestr}_"
3838     echo >>$file "#define _${filestr}_"
3839     echo >>$file ""
3840     echo >>$file "#define ${prefixupper}VERSION ${vHex}"
3841     echo >>$file ""
3842     echo >>$file "typedef struct {"
3843     echo >>$file " const int v_hex;"
3844     echo >>$file " const char *v_short;"
3845     echo >>$file " const char *v_long;"
3846     echo >>$file " const char *v_tex;"
3847     echo >>$file " const char *v_gnu;"
3848     echo >>$file " const char *v_web;"
3849     echo >>$file " const char *v_sccs;"
3850     echo >>$file " const char *v_rcs;"
3851     echo >>$file "} ${prefix}version_t;"
3852     echo >>$file ""
3853     echo >>$file "extern ${prefix}version_t ${prefix}version;"
3854     echo >>$file ""
3855     echo >>$file "#endif /* _${filestr}_ */"
3856     echo >>$file ""
3857     echo >>$file "#else /* _${filestr}_AS_HEADER_ */"
3858     echo >>$file ""
3859     echo >>$file "#define _${filestr}_AS_HEADER_"
3860     echo >>$file "#include \"${file}\""
3861     echo >>$file "#undef _${filestr}_AS_HEADER_"
3862     echo >>$file ""
3863     echo >>$file "${prefix}version_t ${prefix}version = {"
3864     echo >>$file " ${vHex},"
3865     echo >>$file " \"${vShort}\","
3866     echo >>$file " \"${vLong}\","
3867     echo >>$file " \"${vTeX}\","
3868     echo >>$file " \"${vGNU}\","
3869     echo >>$file " \"${vWeb}\","
3870     echo >>$file " \"${vSCCS}\","
3871     echo >>$file " \"${vRCS}\""
3872     echo >>$file "};"
3873     echo >>$file ""
3874     echo >>$file "#endif /* _${filestr}_AS_HEADER_ */"
3875     echo >>$file ""
3876     ;;
3877     m4 )
3878     echo >>$file "##"
3879     echo >>$file "## ${file} -- Version Information for ${name} (syntax: M4)"
3880     echo >>$file "## [automatically generated and maintained by GNU shtool]"
3881     echo >>$file "##"
3882     echo >>$file ""
3883     echo >>$file "m4_define([v_hex], [${vHex}])"
3884     echo >>$file "m4_define([v_short], [${vShort}])"
3885     echo >>$file "m4_define([v_long], [${vLong}])"
3886     echo >>$file "m4_define([v_tex], [${vTeX}])"
3887     echo >>$file "m4_define([v_gnu], [${vGNU}])"
3888     echo >>$file "m4_define([v_web], [${vWeb}])"
3889     echo >>$file "m4_define([v_sccs], [${vSCCS}])"
3890     echo >>$file "m4_define([v_rcs], [${vRCS}])"
3891     echo >>$file ""
3892     ;;
3893     perl )
3894     echo >>$file "##"
3895     echo >>$file "## ${file} -- Version Information for ${name} (syntax: Perl)"
3896     echo >>$file "## [automatically generated and maintained by GNU shtool]"
3897     echo >>$file "##"
3898     echo >>$file ""
3899     echo >>$file "our \$${prefix}version = {"
3900     echo >>$file " 'v_hex' => ${vHex},"
3901     echo >>$file " 'v_short' => \"${vShort}\","
3902     echo >>$file " 'v_long' => \"${vLong}\","
3903     echo >>$file " 'v_tex' => \"${vTeX}\","
3904     echo >>$file " 'v_gnu' => \"${vGNU}\","
3905     echo >>$file " 'v_web' => \"${vWeb}\","
3906     echo >>$file " 'v_sccs' => \"${vSCCS}\","
3907     echo >>$file " 'v_rcs' => \"\\${vRCS}/\""
3908     echo >>$file "};"
3909     echo >>$file ""
3910     echo >>$file "1;"
3911     echo >>$file ""
3912     ;;
3913     python )
3914     echo >>$file "##"
3915     echo >>$file "## ${file} -- Version Information for ${name} (syntax: Python)"
3916     echo >>$file "## [automatically generated and maintained by GNU shtool]"
3917     echo >>$file "##"
3918     echo >>$file ""
3919     echo >>$file "class ${prefix}version:"
3920     echo >>$file " v_hex = ${vHex}"
3921     echo >>$file " v_short = \"${vShort}\""
3922     echo >>$file " v_long = \"${vLong}\""
3923     echo >>$file " v_tex = \"${vTeX}\""
3924     echo >>$file " v_gnu = \"${vGNU}\""
3925     echo >>$file " v_web = \"${vWeb}\""
3926     echo >>$file " v_sccs = \"${vSCCS}\""
3927     echo >>$file " v_rcs = \"${vRCS}\""
3928     echo >>$file ""
3929     ;;
3930     * ) echo "$msgprefix:Error: invalid argument to option \`-l': \`$opt_l'" 1>&2
3931     shtool_exit 1
3932     ;;
3933     esac
3934     fi
3935    
3936     shtool_exit 0
3937     ;;
3938    
3939 gezelter 1385 path )
3940     ##
3941     ## path -- Deal with program paths
3942 gezelter 1395 ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com>
3943 gezelter 1385 ##
3944    
3945     namelist="$*"
3946    
3947     # check whether the test command supports the -x option
3948     if [ -x /bin/sh ] 2>/dev/null; then
3949     minusx="-x"
3950     else
3951     minusx="-r"
3952     fi
3953    
3954     # split path string
3955     paths="`echo $opt_p |\
3956     sed -e 's/^:/.:/' \
3957     -e 's/::/:.:/g' \
3958     -e 's/:$/:./' \
3959     -e 's/:/ /g'`"
3960    
3961     # SPECIAL REQUEST
3962     # translate forward to reverse path
3963     if [ ".$opt_r" = .yes ]; then
3964     if [ "x$namelist" = "x." ]; then
3965     rp='.'
3966     else
3967     rp=''
3968     for pe in `IFS="$IFS/"; echo $namelist`; do
3969     rp="../$rp"
3970     done
3971     fi
3972     echo $rp | sed -e 's:/$::'
3973     shtool_exit 0
3974     fi
3975    
3976     # SPECIAL REQUEST
3977     # strip out directory or base name
3978     if [ ".$opt_d" = .yes ]; then
3979     echo "$namelist" |\
3980     sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;'
3981     shtool_exit 0
3982     fi
3983     if [ ".$opt_b" = .yes ]; then
3984     echo "$namelist" |\
3985     sed -e 's;.*/\([^/]*\)$;\1;'
3986     shtool_exit 0
3987     fi
3988    
3989     # MAGIC SITUATION
3990     # Perl Interpreter (perl)
3991     if [ ".$opt_m" = .yes ] && [ ".$namelist" = .perl ]; then
3992     rm -f $tmpfile >/dev/null 2>&1
3993     touch $tmpfile
3994     found=0
3995     pc=99
3996     for dir in $paths; do
3997     dir=`echo $dir | sed -e 's;/*$;;'`
3998     nc=99
3999     for name in perl perl5 miniperl; do
4000     if [ $minusx "$dir/$name" ] && [ ! -d "$dir/$name" ]; then
4001     perl="$dir/$name"
4002     pv=`$perl -e 'printf("%.3f", $]);'`
4003     echo "$pv:$pc:$nc:$perl" >>$tmpfile
4004     found=1
4005     fi
4006     nc=`expr $nc - 1`
4007     done
4008     pc=`expr $pc - 1`
4009     done
4010     if [ $found = 1 ]; then
4011     perl="`cat $tmpfile | sort -r -u | sed -e 'q' | cut -d: -f4`"
4012     rm -f $tmpfile >/dev/null 2>&1
4013     echo "$perl"
4014     shtool_exit 0
4015     fi
4016     rm -f $tmpfile >/dev/null 2>&1
4017     shtool_exit 1
4018     fi
4019    
4020     # MAGIC SITUATION
4021     # C pre-processor (cpp)
4022     if [ ".$opt_m" = .yes ] && [ ".$namelist" = .cpp ]; then
4023     echo >$tmpfile.c "#include <assert.h>"
4024     echo >>$tmpfile.c "Syntax Error"
4025     # 1. try the standard cc -E approach
4026     cpp="${CC-cc} -E"
4027     (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out
4028     my_error=`grep -v '^ *+' $tmpfile.out`
4029     if [ ".$my_error" != . ]; then
4030     # 2. try the cc -E approach and GCC's -traditional-ccp option
4031     cpp="${CC-cc} -E -traditional-cpp"
4032     (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out
4033     my_error=`grep -v '^ *+' $tmpfile.out`
4034     if [ ".$my_error" != . ]; then
4035     # 3. try a standalone cpp command in path and lib dirs
4036     for path in $paths /lib /usr/lib /usr/local/lib; do
4037     path=`echo $path | sed -e 's;/*$;;'`
4038     if [ $minusx "$path/cpp" ] && [ ! -d "$path/cpp" ]; then
4039     cpp="$path/cpp"
4040     break
4041     fi
4042     done
4043     if [ ".$cpp" != . ]; then
4044     (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out
4045     my_error=`grep -v '^ *+' $tmpfile.out`
4046     if [ ".$my_error" != . ]; then
4047     # ok, we gave up...
4048     cpp=''
4049     fi
4050     fi
4051     fi
4052     fi
4053     rm -f $tmpfile >/dev/null 2>&1
4054     rm -f $tmpfile.c $tmpfile.out >/dev/null 2>&1
4055     if [ ".$cpp" != . ]; then
4056     echo "$cpp"
4057     shtool_exit 0
4058     fi
4059     shtool_exit 1
4060     fi
4061    
4062     # STANDARD SITUATION
4063     # iterate over names
4064     for name in $namelist; do
4065     # iterate over paths
4066     for path in $paths; do
4067     path=`echo $path | sed -e 's;/*$;;'`
4068     if [ $minusx "$path/$name" ] && [ ! -d "$path/$name" ]; then
4069     if [ ".$opt_s" != .yes ]; then
4070     echo "$path/$name"
4071     fi
4072     shtool_exit 0
4073     fi
4074     done
4075     done
4076    
4077     shtool_exit 1
4078     ;;
4079    
4080     esac
4081    
4082     shtool_exit 0
4083    

Properties

Name Value
svn:executable *