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