#!/bin/ksh93

VERSION='$Id: mktexmf 34656 2014-07-18 23:38:50Z karl $'
typeset -r FPROG=${.sh.file}
typeset -r PROG=${FPROG##*/}
SDIR=${FPROG%/*}

# preferentially use subprograms from our own directory.
PATH="${SDIR}:${PATH}"

function showUsage {
	[[ -z $1 ]] && X='--man' || X='-?'
	getopts -a ${PROG} "${ print ${USAGE} ; }" OPT $X
}

typeset -x MT_TEXMFMAIN KPSE_DOT		# cache its value globally
[[ -z ${KPSE_DOT} ]] && KPSE_DOT="${PWD}"

function getTexMake {
	typeset -n VAR=$2
	[[ -n ${VAR} ]] && return 0

	[[ -z ${MT_TEXMFMAIN} ]] && \
		MT_TEXMFMAIN=${ kpsewhich --expand-path='$TEXMFMAIN' ; }
	typeset WHAT=
	case "$1" in
		name)	WHAT='mktexnam' ;;
		update)	WHAT='mktexupd' ;;
		dir)	WHAT='mktexdir' ;;
		*) return 1 
	esac

	VAR=${ kpsewhich --format='web2c files' ${WHAT} ; }
	[[ -z ${VAR} ]] && VAR="${MT_TEXMFMAIN}/web2c/${WHAT}"
	return 0
}

function doMain {
	[[ -z $1 ]] && showUsage 1 && return 1

	typeset NAME ROOTNAME ROOTFILE= MT_MFNAME MFNAME DESTDIR X
	# See comments in mktexpk
	NAME="${1##*/}"						# basename
	NAME="${NAME%.mf}"					# rm trailing .mf
	ROOTNAME="${NAME%%+([0-9])}"		# rm trailing pointsize
	float SZ="${.sh.match}"				# trailing pointsize

	if (( ! ${SZ} )); then
		print -u2 "${PROG}: Font file name contains no valid pointsize."
		return 1
	fi

	X=${ kpsewhich b-${ROOTNAME}.mf 2>/dev/null ; }	# SauterRoot
	if [[ -n $X ]]; then
		ROOTFILE="$X"
		ROOTNAME="b-${ROOTNAME}"
	elif [[ ${NAME} == csso12[0-5][0-9] ]]; then
		print -u2 'csso12[0-5][0-9] from CJK package are unsupported by mktexmf'
		return 1
	elif [[ ${ROOTNAME} =~ ^(cs|lcsss|icscsc|icstt|ilcsss) ]]; then
		X='cscode.mf'
	elif [[ ${ROOTNAME} =~ ^(wn[bcdfirstuv]|rx[bcdfiorstuvx][bcfhilmostx]$|l[abcdhl][bcdfiorstuvx]) ]]
	then
		X="${NAME:0:2}codes.mf"
	else
		X="${ROOTNAME}.mf"
	fi
	if [[ -z ${ROOTFILE} ]]; then
		ROOTFILE=${ kpsewhich "$X" 2>/dev/null ; }
		[[ -z ${ROOTFILE} ]] && print -u2 "file '$X' not found" && return 1
		[[ ! -f ${ROOTFILE} ]] && \
			print -u2 "file '${ROOTNAME}.mf' not found" && return 1
	fi

	typeset -x MT_MKTEXNAM MT_MKTEXUPD MT_MKTEXDIR
	getTexMake name MT_MKTEXNAM
	getTexMake update MT_MKTEXUPD
	getTexMake dir MT_MKTEXDIR

	X=${ "${MT_MKTEXNAM}" ${NAME} ; }
	A=${X//:/ }
	MT_MFNAME="${A[3]}"

	DESTDIR=${MT_MFNAME%/*}
	[[ -n ${DESTDIR} && -d ${DESTDIR} ]] && "${MT_MKTEXDIR}" "${DESTDIR}" && \
		cd ${DESTDIR} || return 1

	# adjust to real size
	case "${SZ}" in
		11) SZ=10.95 ;;	# \magstephalf
		14) SZ=14.40 ;;	# \magstep2
		17) SZ=17.28 ;;	# \magstep3
		20) SZ=20.74 ;;	# \magstep4
		25) SZ=24.88 ;;	# \magstep5
		30) SZ=29.86 ;;	# \magstep6
		36) SZ=35.83 ;;	# \magstep7
		# The new convention is to have three or four letters for the font name
		# and four digits for the pointsize. The number is pointsize * 100.
		????|?????) (( SZ/=100.0 ))
		# otherwise keep as is
	esac

	MFNAME="${NAME}.mf"
	if [[ -f ${MFNAME} ]]; then
		print -u2 "${PROG}: '${DESTDIR}/${MFNAME}' already exists."
		print "${DESTDIR}/${MFNAME}"
		"${MT_MKTEXUPD}" "${DESTDIR}" "${MFNAME}" 1>&2
		return 0
	elif [[ -e ${MFNAME} ]]; then
		print -u2 "'${MFNAME}' exists but is not a file - exiting"
		return 1
	fi

	if [[ ${NAME:0:2} == 'ec' || ${NAME:0:2} == 'tc' ]]; then
    	X="if unknown exbase: input exbase fi;\ngensize:=${SZ};\ngenerate ${ROOTNAME};"
	elif [[ ${NAME:0:2} == 'dc' ]]; then
		X="if unknown dxbase: input dxbase fi;\ngensize:=${SZ};generate ${ROOTNAME};"
	elif [[ ${NAME} =~ ^(cs|lcsss|icscsc|icstt|ilcsss) ]]; then
		# Czech/Slovak fonts
		X='input cscode\nuse_driver;'
	elif [[ ${NAME} =~ ^(wn[bcdfirstuv]|rx[bcdfiorstuvx][bcfhilmostx]|l[abcdhl][bcdfiorstuvx]) ]]; then
		# LH fonts
		X='input fikparm;'
	elif [[ ${NAME} == g[lmorst][bijmtwx][cilnoru]* ]]; then
		# A small superset of the names of the cbgreek fonts.
		X='% generated by mktexmf\ninput cbgreek;'
	else
		X="design_size := ${SZ};\ninput ${ROOTNAME};"
	fi

	print "$X" >mf$$.tmp || return 1
	chmod 0644 mf$$.tmp
	mv mf$$.tmp "${MFNAME}" || return 1

	print "${DESTDIR}/${MFNAME}"
	print -u2 "${PROG}: '${DESTDIR}/${MFNAME}' successfully generated."
	"${MT_MKTEXUPD}" "${DESTDIR}" "${MFNAME}" 1>&2
	return 0
}

USAGE='[-?'"${VERSION}"' ]
[-author?Thomas Esser (original)]
[-author?Jens Elkner (2015 ksh93 port/cleanup)]
[-license?Public domain.]
[+NAME?'"${PROG}"' - make a Metafont source file]
[+DESCRIPTION?'"${PROG}"' makes the Metafont source file for \afont\a, if possible. It gets usually invoked, if the required  MF file could not be found. For example, "ecr12" or "cmr11". The only thing, which gets written to the stdout is the name of the related metafont file. Everything else gets redirected to the stder.]
[+?'"${PROG}"' is typically called by other programs, rather than from the command line. Therefore it will only print the path of the created font file to stdout, everything else goes to stderr.]
[+BUGS?Report bugs to: tex-k@tug.org]
[+?TeX Live home page: \bhttp://tug.org/texlive/\b]
[h:help?Print this help and exit.]
[F:functions?Print a list of all functions available.]
[T:trace]:[fnList?A comma separated list of functions of this script to trace (convinience for troubleshooting).]
\n\n\afont\a
'
X="${ print ${USAGE} ; }"
while getopts "${X}" OPT ; do
	case ${OPT} in
		h) showUsage ; exit 0 ;;
		T)	if [[ ${OPTARG} == 'ALL' ]]; then
				typeset -ft ${ typeset +f ; }
			else
				typeset -ft ${OPTARG//,/ }
			fi
			;;
		F) typeset +f && exit 0 ;;
		*) showUsage 1 ; exit 1 ;
	esac
done
X=$((OPTIND-1))
shift $X && OPTIND=1
unset X

doMain "$@" </dev/null
