162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# Copyright (C) 2011 The Android Open Source Project
262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# Licensed under the Apache License, Version 2.0 (the "License");
462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# you may not use this file except in compliance with the License.
562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# You may obtain a copy of the License at
662e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
762e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#      http://www.apache.org/licenses/LICENSE-2.0
862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# Unless required by applicable law or agreed to in writing, software
1062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# distributed under the License is distributed on an "AS IS" BASIS,
1162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# See the License for the specific language governing permissions and
1362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# limitations under the License.
1462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
1562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner
1662e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# This script is used to generate a shell script that will be
1762e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# run by the NDK build system to process dependency files generated by
1862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# GCC on Windows, and convert them to a format that is suitable for
1962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# Cygwin's GNU Make.
2062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
2162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# The main issue to solve here is that the dependency files generated
2262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# by GCC use native windows path names, as in:
2362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
2462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#    C:/Foo/foo.o: \
2562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#      C:/Foo/src/foo.h \
2662e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#      C:/Foo/src/foo.c \
2762e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#      D:/Bar/bar/bar.h
2862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
2962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# And the file needs to be processed to convert each such path into
3062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# a Cygwin-specific one, as in:
3162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
3262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#    /cygdrive/c/Foo/foo.o: \
3362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#      /cygdrive/c/Foo/src/foo.h \
3462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#      /cygdrive/c/Foo/src/foo.c \
3562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#      /cygdrive/d/Bar/bar/bar.h
3662e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
3762e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# Previously, this conversion was done with an awk script that assumed
3862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# that the cygwin drive prefix was always 'cygdrive'. This didn't work
3962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# well when this was not the case, or when using drive-less mounts
4062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# (e.g. when  /home/mnt would map to //server/subdir)
4162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
4262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# To solve the issue correctly, we need to parse the output of the
4362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# Cygwin mount table (i.e. the output of the 'mount' command), and
4462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# build a sed script that will properly replace host paths into the
4562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# corresponding cygwin equivalent.
4662e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
4762e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# NOTE: The sed script will be run during command execution, not during the
4862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# parse phase.
4962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
5062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# This awk script expects its input to be the output of the Cygwin "mount" command
5162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# as in:
5262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
5362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  C:/cygwin/bin on /usr/bin type ntfs (binary,auto)
5462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  C:/cygwin/lib on /usr/lib type ntfs (binary,auto)
5562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  C:/cygwin on / type ntfs (binary,auto)
5662e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  C: on /cygdrive/c type ntfs (binary,posix=0,user,noumount,auto)
5762e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  D: on /cygdrive/d type udf (binary,posix=0,user,noumount,auto)
5862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  //server/subdir on /home/mnt.2$ type ....
5962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
6062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# It first builds a sed script that convert all windows path in the
6162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# an input file into the cygwin equivalent. For example, this would look
6262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# like the following (but all on a single line):
6362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
6462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  s!^//server/subdir!/home/mnt\.2\$!ig;
6562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  s! //server/subdir! /home/mnt\.2\$!ig;
6662e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  s!^C:/cygwin/bin!/usr/bin!ig;
6762e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  s! C:/cygwin/bin! /usr/bin!ig;
6862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  s!^C:/cygwin/lib!/usr/lib!ig;
6962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  s! C:/cygwin/lib! /usr/lib!ig;
7062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  s!^C:/cygwin/!/!ig;
7162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  s! C:/cygwin/! /!ig;
7262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  s!^C:!/cygdrive/c!ig;
7362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  s! C:! /cygdrive/c!ig;
7462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  s!^D:!/cygdrive/d!ig;
7562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#  s! D:! /cygdrive/d!ig;
765976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner#
7762e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# Note that we properly escape regex meta characters like . or $
7862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# to avoid confusing sed. Also deal with the cases where the path
7962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# is the first in the line, or prefixed with a space in the deps file.
8062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
8162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# After this, the sed invokation is hard-coded into a generated shell
8262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# script that can be invoked directly at build time.
8362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
8462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' TurnerBEGIN {
8562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner  # setup our count
8662e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner  count = 0
8762e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner}
8862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner
8962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner$2 == "on" {
9062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    # record a new (host-path,cygwin-path) pair
9162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    count ++
925976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner
935976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    # Convert backwards slashes into forward ones in the host path.
945976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    # This is to support MSys' mount command, which outputs Windows-style
955976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    # separators, unlike Cygwin's version of the same tool.
965976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    gsub("\\\\","/",$1)
975976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner
9862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    host[count] = $1
9962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    cygwin[count] = $3
10062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner}
10162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner
10262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' TurnerEND {
10362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    # We have recorded all (host,cygwin) path pairs,
10462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    # now try to sort them so that the ones with the longest host path
10562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    # appear first
10662e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    for (ii = 2; ii <= count; ii++) {
10762e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner        for (jj = ii-1; jj > 0; jj--) {
10862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner            if (length(host[jj]) > length(host[jj+1])) {
10962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner                break;
11062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner            }
11162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner            if (length(host[jj]) == length(host[jj+1]) &&
11262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner                host[jj] > host[jj+1]) {
11362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner                break
11462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner            }
11562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner            tmp = cygwin[jj]
11662e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner            cygwin[jj] = cygwin[jj+1]
11762e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner            cygwin[jj+1] = tmp
11862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner            tmp = host[jj]
11962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner            host[jj] = host[jj+1]
12062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner            host[jj+1] = tmp
12162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner        }
12262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    }
12362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner
12462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    # build/core/init.mk defines VERBOSE to 1 when it needs to dump the
12562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    # list of substitutions in a human-friendly format, generally when
12662e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    # NDK_LOG is defined in the environment
12762e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    #
12862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    # Otherwise, just generate the corresponding sed script
12962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    #
13062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    if (VERBOSE == 1) {
13162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner        for (nn = 1; nn <= count; nn++) {
13262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner            printf( "$(info %s => %s)", cygwin[nn], host[nn]);
13362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner        }
13462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    } else {
13562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner        RESULT = ""
13662e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner        for (nn = 1; nn <= count; nn++) {
13762e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner            add_drive_rule(host[nn], cygwin[nn])
13862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner        }
13962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner
14062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner        # Note: the role of the generated shell script is to first check
14162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner        #       that $1.org exists. If this is not the case, this simply
14262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner        #       means that GCC didn't generate a depedency file (e.g. when
14362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner        #       compiling an assembler file).
14462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner        #
14562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner        #       If the file exists, it is processed with our sed script,
14662e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner        #       the output is written to $1, and we remove the original $1.org
14762e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner        #
1485976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner        print "#!/bin/sh"
1495976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner        print "# AUTO-GENERATED FILE, DO NOT EDIT!"
1505976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner        print "if [ -f $1.org ]; then"
1515976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner        print "  sed -e '" RESULT "' $1.org > $1 && rm -f $1.org"
1525976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner        print "fi"
15362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    }
15462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner}
15562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner
15662e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# We need to quote some characters so that 'sed' doesn't
15762e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# believe they are regex operators. For example, if a path
15862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# contains a dot (.), we need to escape it into "\."
15962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
16062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turnerfunction sed_quote_path (str)
16162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner{
16262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    # Windows path names cannot contain any of: <>:"|?*
1635976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    # see msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
1645976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    #
1655976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    # Anything else is valid. The regex meta characters are: ^.[]$()|*+?{}\
1665976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    #
1675976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    # This means we need to escape these when they appear in path names: ^.[]$()+{}\
1685976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    #
1695976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    gsub("\\^","\\^",str)
1705976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    gsub("\\.","\\.",str)
1715976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    gsub("\\[","\\[",str)
1725976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    gsub("\\]","\\]",str)
1735976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    gsub("\\$","\\$",str)
1745976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    gsub("\\(","\\(",str)
1755976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    gsub("\\)","\\)",str)
1765976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    gsub("\\+","\\+",str)
1775976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    gsub("\\{","\\{",str)
1785976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    gsub("\\}","\\}",str)
17962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner
1805976114eee278e6f574cb67e30b28ca5ac99f824David 'Digit' Turner    return str
18162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner}
18262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner
18362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turnerfunction add_drive_rule (hostpath,cygpath)
18462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner{
18562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    hostpath = sed_quote_path(hostpath)
18662e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner	cygpath = sed_quote_path(cygpath)
18762e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner	
18862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    # The root directory is a special case, because we need
18962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner	# to add a slash at the end of the corresponding host path
19062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner	# otherwise c:/cygwin/foo will be translated into //foo
19162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner	# instead of /foo.
19262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner	#
19362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    if (cygpath == "/") {
19462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner        hostpath = hostpath "/"
19562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    }
19662e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner	# when the hostpath starts the line
19762e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner    RESULT = RESULT "s!^" hostpath "!" cygpath "!ig;"
19862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner
19962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner	# when the hostpath does not start the line (it will always be after a space)
20062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner	RESULT = RESULT "s! " hostpath "! " cygpath "!ig;"
20162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner}
202