Groups | Search | Server Info | Login | Register
Groups > comp.unix.shell > #1792
| From | Rainer Weikusat <rweikusat@mssgmbh.com> |
|---|---|
| Newsgroups | comp.unix.shell, comp.unix.programmer, comp.programming.contests |
| Subject | Re: The First Pure Shell Contest (PUSH): relativepath |
| Date | 2011-08-22 21:15 +0100 |
| Message-ID | <87ty99kxtk.fsf@sapphire.mobileactivedefense.com> (permalink) |
| References | <9b7kg7F3njU1@mid.individual.net> |
Cross-posted to 3 groups.
Jens Schweikhardt <schweikh@schweikhardt.net> writes:
> The First Pure Shell Contest (PUSH)
>
> == Motivation ==
>
> The shell is not known for powerful string processing.
For sake of completeness.
NB: I do not claim that this would be good for anything except that
it survives the unit_test() function. Also, it is not supposed to be
'competitive'.
-----------------------------
# Name
split()
{
eval "case \"\$$1\" in
?*/*)
$3=\${$1#/}
$2=\${$3%%/*}
$3=\${$3#*/}
return 0
;;
/*)
$3=\${$1#/}
;;
*)
$3=\"\$$1\"
esac
$2=''"
}
error()
{
echo "<$1> not absolute or canonical"
}
valid()
{
rc=1
test "${1#/}" != "$1" && {
rc=''
case "$1" in
*//*)
rc=1
;;
*?/)
rc=1
;;
*/./*)
rc=1
;;
*/../*)
rc=1
;;
*/..)
rc=1
;;
*/.)
rc=1
;;
esac
}
test -z "$rc" && return 0
result=`error "$1"`
return 1
}
one_up()
{
result="../$result"
}
one_down()
{
eval "result=\"\$result\$$1/\""
}
walk()
{
w="$1"
split w fw rw
while test -n "$fw";
do
$2 fw
w="$rw"
split w fw rw
done
$2 rw
return 0
}
relativepath()
{
d0="$1"
valid "$d0" || return 1
d1="$2"
valid "$d1" || return 1
split d0 fa ra
split d1 fb rb
while test -n "$fa" -a "$fa" = "$fb";
do
a="$ra"
split a fa ra
b="$rb"
split b fb rb
done
result=''
if test -n "$fa";
then
a="$ra"
if test -n "$fb" -o "$fa" != "$rb"
then
a="/$fa/$a"
test -n "$rb" && {
b="$rb"
test -n "$fb" && b="/$fb/$b"
walk "$b" one_down
}
fi
walk "$a" one_up
elif test -n "$fb";
then
b="$rb"
if test "$ra" != "$fb";
then
b="/$fb/$b"
test -n "$ra" && one_up
fi
walk "$b" one_down
else
test "$ra" = "$rb" && {
result=.
return 0
}
result="$rb"
test "$d0" != / && result="../$result"
fi
result="${result%/}"
return 0
}
Back to comp.unix.shell | Previous | Next — Previous in thread | Next in thread | Find similar
The First Pure Shell Contest (PUSH): relativepath Jens Schweikhardt <schweikh@schweikhardt.net> - 2011-08-19 17:23 +0000
Re: The First Pure Shell Contest (PUSH): relativepath Stephane CHAZELAS <stephane_chazelas@yahoo.fr> - 2011-08-19 18:13 +0000
Re: The First Pure Shell Contest (PUSH): relativepath Jens Schweikhardt <usenet@schweikhardt.net> - 2011-08-19 19:12 +0000
Re: The First Pure Shell Contest (PUSH): relativepath pk <pk@pk.invalid> - 2011-08-19 21:14 +0200
Re: The First Pure Shell Contest (PUSH): relativepath Jens Schweikhardt <usenet@schweikhardt.net> - 2011-08-19 19:29 +0000
Re: The First Pure Shell Contest (PUSH): relativepath pk <pk@pk.invalid> - 2011-08-19 21:37 +0200
Re: The First Pure Shell Contest (PUSH): relativepath Jens Schweikhardt <usenet@schweikhardt.net> - 2011-08-19 20:04 +0000
Re: The First Pure Shell Contest (PUSH): relativepath pk <pk@pk.invalid> - 2011-08-19 22:25 +0200
Re: The First Pure Shell Contest (PUSH): relativepath Jens Schweikhardt <usenet@schweikhardt.net> - 2011-08-19 21:08 +0000
Re: The First Pure Shell Contest (PUSH): relativepath Rainer Weikusat <rweikusat@mssgmbh.com> - 2011-08-19 19:58 +0100
Re: The First Pure Shell Contest (PUSH): relativepath Jens Schweikhardt <usenet@schweikhardt.net> - 2011-08-19 19:23 +0000
Re: The First Pure Shell Contest (PUSH): relativepath Rainer Weikusat <rweikusat@mssgmbh.com> - 2011-08-19 22:18 +0100
Re: The First Pure Shell Contest (PUSH): relativepath Stephane CHAZELAS <Stephane.CHAZELAS@free.fr> - 2011-08-20 20:07 +0000
Re: The First Pure Shell Contest (PUSH): relativepath Jens Schweikhardt <usenet@schweikhardt.net> - 2011-08-21 10:43 +0000
Re: The First Pure Shell Contest (PUSH): relativepath Rainer Weikusat <rweikusat@mssgmbh.com> - 2011-08-21 15:14 +0100
Re: The First Pure Shell Contest (PUSH): relativepath Janis Papanagnou <janis_papanagnou@hotmail.com> - 2011-08-21 18:28 +0300
Re: The First Pure Shell Contest (PUSH): relativepath Stephane CHAZELAS <stephane_chazelas@yahoo.fr> - 2011-08-21 16:19 +0000
Re: The First Pure Shell Contest (PUSH): relativepath Stephane CHAZELAS <stephane_chazelas@yahoo.fr> - 2011-08-21 20:12 +0000
Re: The First Pure Shell Contest (PUSH): relativepath Rainer Weikusat <rweikusat@mssgmbh.com> - 2011-08-22 21:15 +0100
Re: The First Pure Shell Contest (PUSH): relativepath Stephane CHAZELAS <stephane_chazelas@yahoo.fr> - 2011-08-23 18:23 +0000
Re: The First Pure Shell Contest (PUSH): relativepath Rainer Weikusat <rweikusat@mssgmbh.com> - 2011-08-23 19:52 +0100
Re: The First Pure Shell Contest (PUSH): relativepath Stephane CHAZELAS <stephane_chazelas@yahoo.fr> - 2011-08-23 21:56 +0000
csiph-web