#!/bin/sh

################################################################################
##
##  Licensed to the Apache Software Foundation (ASF) under one or more
##  contributor license agreements.  See the NOTICE file distributed with
##  this work for additional information regarding copyright ownership.
##  The ASF licenses this file to You under the Apache License, Version 2.0
##  (the "License"); you may not use this file except in compliance with
##  the License.  You may obtain a copy of the License at
##
##      http://www.apache.org/licenses/LICENSE-2.0
##
##  Unless required by applicable law or agreed to in writing, software
##  distributed under the License is distributed on an "AS IS" BASIS,
##  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
##  See the License for the specific language governing permissions and
##  limitations under the License.
##
################################################################################

#
# swcdepends launch script for unix. On windows, swcdepends.bat is used instead.
#

case `uname` in
		CYGWIN*)
			OS="Windows"
		;;
		*)
			OS=Unix
esac

if [ $OS = "Windows" ]; then
	# set FLEX_HOME relative to swcdepends if not set
	test "$FLEX_HOME" = "" && {
	FLEX_HOME=`dirname $0`/..
    	FLEX_HOME=`cygpath -m $FLEX_HOME`
	}

elif [ $OS = "Unix" ]; then

	# set FLEX_HOME relative to swcdepends if not set
	test "$FLEX_HOME" = "" && {
	FLEX_HOME=`dirname "$0"`/..
	}

fi

# don't use $FLEX_HOME in this variable because it may contain spaces,
# instead put it on the java args directly, with double-quotes around it
VMARGS="-Xmx384m -Dsun.io.useCanonCaches=false"

java $VMARGS -jar "$FLEX_HOME/lib/swcdepends.jar" +flexlib="$FLEX_HOME/frameworks" "$@"
