#!/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.
##
################################################################################

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

#
# Either the PLAYERGLOBAL_HOME environment variable must be set or
# or the env.PLAYERGLOBAL_HOME property must be set in %FLEX_HOME%/env.properties.
# If both are set the property takes precedence.
#

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

D32=''

if [ $OS = "Windows" ]; then
    # set FLEX_HOME relative to compc 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 compc if not set
    test "$FLEX_HOME" = "" && {
        FLEX_HOME=`dirname "$0"`/..
    }
    
    check64="`java -version 2>&1 | grep -i 64-Bit`"
    isOSX="`uname | grep -i Darwin`"
    javaVersion="`java -version 2>&1 | awk -F '[ ".]+' 'NR==1 {print $3 "." $4}'`"
    
    if [ "$isOSX" != "" -a "$HOSTTYPE" = "x86_64" -a "$check64" != "" -a "$javaVersion" = "1.6" ]; then
        D32='-d32'
    fi
    
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 $D32 $SETUP_SH_VMARGS -jar "$FLEX_HOME/lib/compc.jar" +flexlib="$FLEX_HOME/frameworks" "$@"
