########################################################################
#                                                                      #
#               This software is part of the ast package               #
#          Copyright (c) 1994-2011 AT&T Intellectual Property          #
#          Copyright (c) 2020-2024 Contributors to ksh 93u+m           #
#                      and is licensed under the                       #
#                 Eclipse Public License, Version 2.0                  #
#                                                                      #
#                A copy of the License is available at                 #
#      https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html      #
#         (with md5 checksum 84283fa8859daf213bdda5a9f8d1be1d)         #
#                                                                      #
#                 Glenn Fowler <gsf@research.att.com>                  #
#                  Martijn Dekker <martijn@inlv.org>                   #
#                                                                      #
########################################################################
### this script contains archaic constructs that work with all sh variants ###
# mamprobe - generate MAM cc probe info
# Glenn Fowler <gsf@research.att.com>

(command set -o posix) 2>/dev/null && set -o posix

command=mamprobe

bins=$(echo "$DEFPATH:$PATH" | sed 's/:/ /g') || exit

# check the options

opt=

case `(getopts '[-][123:xyz]' opt --xyz; echo 0$opt) 2>/dev/null` in
0123)	USAGE=$'
[-?
@(#)$Id: mamprobe (ksh 93u+m) 2024-03-05 $
]
[+NAME?mamprobe - generate MAM cc probe info]
[+DESCRIPTION?\bmamprobe\b generates MAM (make abstract machine) \bcc\b(1)
	probe information for use by \bmamake\b(1). \acc-path\a is the
	absolute path of the probed compiler and \ainfo-file\a is where
	the information is placed. \ainfo-file\a is usually
	\b$INSTALLROOT/lib/probe/C/mam/\b\ahash\a, where \ahash\a is a hash
	of \acc-path\a. Any \ainfo-file\a directories are created if needed.
	If \ainfo-file\a is \b-\b then the probe information is written to
	the standard output.]
[+?The probed variable names get a \bmam_cc_\b prefix.
	Additional variables are:]{
		[+_hosttype_?the \bpackage\b(1) host type]
		[+STDCAT?command to execute for \bcat\b(1)]
		[+STDCHMOD?command to execute for \bchmod\b(1)]
		[+STDCMP?command to execute for \bcmp\b(1)]
		[+STDCP?command to execute for \bcp\b(1)]
		[+STDED?command to execute for \bed\b(1) or \bex\b(1)]
		[+STDEDFLAGS?flags for \bSTDED\b]
		[+STDLN?command to execute for \bln\b(1)]
		[+STDMV?command to execute for \bmv\b(1)]
		[+STDRM?command to execute for \brm\b(1)]
}
[d:debug?Enable probe script debug trace.]

info-file cc-path

[+SEE ALSO?\bpackage\b(1), \bmamake\b(1), \bprobe\b(1)]
'
	while	getopts -a "$command" "$USAGE" OPT
	do	case $OPT in
		d)	opt=-d ;;
		esac
	done
	shift `expr $OPTIND - 1`
	;;
*)	while	:
	do	case $# in
		0)	break ;;
		esac
		case $1 in
		--)	shift
			break
			;;
		-)	break
			;;
		-d)	opt=-d
			;;
		-*)	echo $command: $1: unknown option >&2
			;;
		*)	break
			;;
		esac
		set ''
		break
	done
	;;
esac

# check the args

case $1 in
-)	;;
/*)	;;
*)	set '' ;;
esac
case $2 in
/*)	;;
*)	set '' ;;
esac
case $# in
0|1)	echo "Usage: $command info-file cc-path" >&2; exit 2 ;;
esac
info=$1
shift
cc=$*

# find the make probe script

ifs=${IFS-'
	 '}
IFS=:
set $PATH
IFS=$ifs
script=lib/probe/C/make/probe
while	:
do	case $# in
	0)	echo "$0: ../$script: probe script not found on PATH" >&2
		exit 1
		;;
	esac
	case $1 in
	'')	continue ;;
	esac
	makeprobe=`echo $1 | sed 's,[^/]*$,'$script,`
	if	test -x $makeprobe
	then	break
	fi
	shift
done

# create the info dir if necessary

case $info in
/*)	i=X$info
	ifs=${IFS-'
	 '}
	IFS=/
	set $i
	IFS=$ifs
	while	:
	do	i=$1
		shift
		case $i in
		X)	break ;;
		esac
	done
	case $info in
	//*)	path=/ ;;
	*)	path= ;;
	esac
	while	:
	do	case $# in
		0|1)	break ;;
		esac
		comp=$1
		shift
		case $comp in
		'')	continue ;;
		esac
		path=$path/$comp
		if	test ! -d $path
		then	mkdir $path || exit
		fi
	done
	;;
esac

# generate info in a tmp file and rename when finished

case $info in
-)	;;
*)	tmp=${TMPDIR:-/tmp}/mam$$
	trap "exec >/dev/null; rm -f $tmp" 0 1 2 3 15
	exec > $tmp
	echo "probing C language processor $cc for mam information" >&2
	;;
esac

echo "note generated by $0 for $cc"

(
	set '' $opt $cc
	shift
	. $makeprobe "$@"

	case " $CC_DIALECT " in
	*" -L "*)	echo "CC.L = 1" ;;
	esac

) | sed \
	-e '/^CC\./!d' \
	-e 's/^CC./setv mam_cc_/' \
	-e 's/^\([^=.]*\)\./\1_/' \
	-e 's/^\([^=.]*\)\./\1_/' \
	-e 's/ =//' \
	-e 's/\$("\([^"]*\)")/\1/g' \
	-e 's/\$(\([^)]*\))/${\1}/g' \
	-e 's/\${CC\./${mam_cc_}/g'

echo 'setv _hosttype_ ${mam_cc_HOSTTYPE}'

# STD* are standard commands/flags
# (Deprecated; kept for backward compatibility)

if	(
ed <<!
q
!
) < /dev/null > /dev/null 2>&1
then	STDED=ed
else	STDED=ex
fi
STDEDFLAGS=-
set STDCAT cat STDCHMOD chmod STDCMP cmp STDCP cp STDLN ln STDMV mv STDRM rm
while	:
do	case $# in
	0|1)	break ;;
	esac
	p=$2
	for d in $bins
	do	if	test -x $d/$p
		then	p=$d/$p
			break
		fi
	done
	eval $1=\$p
	shift
	shift
done
for n in STDCAT STDCHMOD STDCMP STDCP STDED STDEDFLAGS STDLN STDMV STDRM
do	eval echo setv \$n \$$n
done

# all done

case $info in
-)	;;
*)	exec >/dev/null
	test -f "$info" && rm -f "$info"
	cp "$tmp" "$info"
	chmod -w "$info"
	;;
esac
