Groups | Search | Server Info | Login | Register


Groups > comp.unix.shell > #1792

Re: The First Pure Shell Contest (PUSH): relativepath

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.

Show all headers | View raw


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 | NextPrevious in thread | Next in thread | Find similar


Thread

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