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

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

#
# Either the AIR_HOME environment variable must be set or
# or the env.AIR_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 asdoc 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 asdoc 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="-Xmx1024m -Dsun.io.useCanonCaches=false "

java $VMARGS $D32 -Xbootclasspath/p:"$FLEX_HOME/lib/xalan.jar" -classpath "$FLEX_HOME/lib/asdoc.jar" flex2.tools.ASDoc +flexlib="$FLEX_HOME/frameworks" "$@"