#!/usr/bin/env python
#
# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
#
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution.  The full text of the license may be found at
#
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#

#
# ARMCC tools do not support cygwin paths. Ths script converts cygwin paths to DOS paths
# in any arguments.
#
# armcc_wrapper.py ToolToExec [command line to convert]
#
# anthing with the / will be converted via cygpath cygwin call or manually.
# -I/cygpath/c/example is a special case as you can not pass -I to cygpath
#
# ExceptionList if a tool takes an argument with a / add it to the exception list
#
from __future__ import print_function
import sys
import os
import subprocess
import pipes

#
# Convert using cygpath command line tool
# Currently not used, but just in case we need it in the future
#
def ConvertCygPathToDosViacygpath(CygPath):
  p = subprocess.Popen("cygpath -m " + pipes.quote(CygPath), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)
  return p.stdout.read().strip()

#
#
#
def ConvertCygPathToDos(CygPath):
  if CygPath.find("/cygdrive/") == 0:
    # convert /cygdrive/c/Xyz to c:/Xyz
    DosPath = CygPath[10] + ':' + CygPath[11:]
  else:
    DosPath = CygPath

  # pipes.quote will add the extra \\ for us.
  return DosPath.replace('/', '\\')


# we receive our options as a list, but we will be passing them to the shell as a line
# this means we have to requote things as they will get one round of unquoting.
# we can't set "shell=False" because we are running commands from the PATH and
# if you don't use the shell you don't get a PATH search.
def main(argv):

  # use 1st argument as name of tool to call
  Command = pipes.quote(sys.argv[1]);

  ExceptionList = ["/interwork"]

  for arg in argv:
    if arg.find('/') == -1:
      # if we don't need to convert just add to the command line
      Command = Command + ' ' + pipes.quote(arg)
    elif arg in ExceptionList:
      # if it is in the list, then don't do a cygpath
      # assembler stuff after --apcs has the /.
      Command = Command + ' ' + pipes.quote(arg)
    else:
      if ((arg[0] == '-') and (arg[1] == 'I' or arg[1] == 'i')):
        CygPath = arg[0] + arg[1] + ConvertCygPathToDos(arg[2:])
      else:
        CygPath = ConvertCygPathToDos(arg)

      Command = Command + ' ' + pipes.quote(CygPath)

  # call the real tool with the converted paths
  return subprocess.call(Command, shell=True)


if __name__ == "__main__":
  try:
     ret = main(sys.argv[2:])

  except:
    print("exiting: exception from " + sys.argv[0])
    ret = 2

  sys.exit(ret)

