#!/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" "$@"