#!/bin/sh
#
# set_strategy_parameters <strat> <param> <source>
#
# Sets the parallelization strategy and its parameter in the given
# program source code (which has to be a result of automatic parallelization).
# The resulting source code is written to stdout.
#
# Parameters:
# 	<strat>		Strategy: KEEP, ACTIVE, DEPTH, ALWAYS, FIRST,
#			 NEVER, NEVEREVER
#	<param>		Strategy's parameter (positive integer)
#	<source>	Program C source code
#
# Stefan U. Haenssgen  05-nov-97
#
# 05-nov-97	1st version
# 10-nov-97	always/never/neverever again as general strategies,
#		 locking is now avoided in #defines of parallelziation
#

if [ $# -lt 3 -o $# -gt 4 ]
then
    echo "Usage: "
    head -13 $0 | tail +2 | cut -c2-
    exit 1
fi

strat="$1"
param="$2"
source="$3"

if [ ! -f "$source" ]
then
    echo "Error, source code file '$source' not found"
    exit 2
fi

stratname=""		# strategy name as listed in defines
generaldepth=""		# 1 if general, 0 if depth
neverever=""		# 1 if neverever active, 0 else
case "$strat" in
k|K|keep|KEEP) 
    stratname="USE_KEEP_N"
    generaldepth="1"
    neverever="0"
    ;;
a|A|active|ACTIVE)
    stratname="USE_ACTIVE_N"
    generaldepth="1"
    neverever="0"
    ;;
f|F|first|FIRST)
    stratname="USE_FIRST_N"
    generaldepth="1"
    neverever="0"
    ;;
al|AL|always|ALWAYS)
    stratname="USE_ALWAYS"
    generaldepth="1"
    neverever="0"
    ;;
n|N|never|NEVER)
    stratname="USE_NEVER"
    generaldepth="1"
    neverever="0"
    ;;
ne|NE|neverever|NEVEREVER)
    stratname="USE_NEVER"
    generaldepth="1"
    neverever="1"
    ;;
d|D|depth|DEPTH)
    stratname="USE_DEPTH"
    generaldepth="0"
    neverever="0"
    ;;
*)
    echo "Error, unknown strategy '$strat'"
    exit 3
    ;;
esac

if [ $param -lt 1 ]
then
    echo "Error, strategy parameter '$param' must be >= 1"
    exit 4
fi


awk '
{
    if ($1 == "#define") {
        # 
        # #define THREAD_NUMBER       7           /* R */
        #
        if ($2 == "THREAD_NUMBER") {		# Add parameter
            print $1,$2, '$param', $4,$5,$6
        } else
        #
        # #define THREADS_REALLY_DISABLED 0
        #
        if ($2 == "THREADS_REALLY_DISABLED") {	# Add neverever setting
            print $1,$2, '$neverever'
        } else
        #
        # #define USE_DEPTH_P   1                 /* R */
        # #define USE_GENERAL_P 0                 /* R */
        #
        if ($2 == "USE_DEPTH_P") {		# Set depth OR general
            print $1,$2, (1-'$generaldepth'), $4, $5, $6
        } else
        if ($2 == "USE_GENERAL_P") {
            print $1,$2, '$generaldepth', $4, $5, $6
        } else
        #
        # #define USE_FIRST_N  0                  /* R */
	# #define USE_KEEP_N   0                  /* R */
	# #define USE_ACTIVE_N 0                  /* R */
	# #define USE_ALWAYS   0                  /* R */
	# #define USE_NEVER    0                  /* R */
	# #define USE_DEPTH    1                  /* R */
        #
        if ($2 ~ /USE_(FIRST_N|KEEP_N|ACTIVE_N|ALWAYS|NEVER|DEPTH)/) {
            if ($2 == "'"$stratname"'") {
                print $1,$2, 1, $4, $5, $6
            } else {				# Set exact strategy
                print $1,$2, 0, $4, $5, $6
            }
        } else
        #
        # #define DEPTH_NUMBER_nqueens        6   /* R */
        #
        if ($2 ~ /DEPTH_NUMBER_.+/) {		# Set ALL depths
            print $1,$2, '$param', $4,$5,$6
        } else {
            print
        }
    } else {
        print
    }
}
' < "$source"

