#!/bin/sh
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

#
# Stupid wrapper to avoid win32 dospath/cygdrive issues
# Try not to spawn programs from within this file. If the stuff in here looks royally 
# confusing, see bug: http://bugzilla.mozilla.org/show_bug.cgi?id=206643
# and look at the older versions of this file that are easier to read, but
# do basically the same thing
#

#
# Taken directly from:
# http://dxr.mozilla.org/mozilla-central/source/nsprpub/build/cygwin-wrapper
#

prog=$1
shift
if test -z "$prog"; then
    exit 0
fi

# If $CYGDRIVE_MOUNT was not set in configure, give $mountpoint the results of mount -p
mountpoint=$CYGDRIVE_MOUNT
if test -z "$mountpoint"; then
    mountpoint=`mount -p`
    if test -z "$mountpoint"; then
       print "Cannot determine cygwin mount points. Exiting"
       exit 1
    fi
fi

# Delete everything but "/cygdrive" (or other mountpoint) from mount=`mount -p`
mountpoint=${mountpoint#*/}
mountpoint=/${mountpoint%%[!A-Za-z0-9_]*}
mountpoint=${mountpoint%/}

args=""
up=""
if test "${prog}" = "-up"; then
    up=1
    prog=${1}
    shift
fi

process=1

# Convert the mountpoint in parameters to Win32 filenames
# For instance: /cygdrive/c/foo -&gt; c:/foo
for i in "${@}"
do
    if test "${i}" = "-wrap"; then
        process=1
    else
        if test "${i}" = "-nowrap"; then
            process=
        else
            if test -n "${process}"; then
                if test -n "${up}"; then
                    pathname=${i#-I[a-zA-Z]:/}
                    if ! test "${pathname}" = "${i}"; then
                        no_i=${i#-I}
                        driveletter=${no_i%%:*}
                        i=-I${mountpoint}/${driveletter}/${pathname}
                    fi
                else
                    eval 'leader=${i%%'${mountpoint}'/[a-zA-Z]/*}'
                    if ! test "${leader}" = "${i}"; then
                        eval 'pathname=${i#'${leader}${mountpoint}'/[a-zA-Z]/}'
                        eval 'no_mountpoint=${i#'${leader}${mountpoint}'/}'
                        driveletter=${no_mountpoint%%/*}
                        i=${leader}${driveletter}:/${pathname}
                    fi
                fi
            fi

            args="${args} ${i}"
        fi
    fi
done

exec $prog $args