#! /bin/sh
# usage: mkf input_file.mkf
#
# description:	mkf generates a makefile to generate a series of fonts
#		based on a small input file consisting of key=value pairs
#
#		dpi - dots per inch
#		maxmag - dpi * maximum magstep (ie. dpi * 1.2^9) for LaTeX
#		mode - mode for Metafont
#		mf - command for Metafont that includes "mode"
#		mfbin - path for "mf"
#		mkt - if non-null makes the standard TeX CM fonts
#		mkl - if non-null makes the LaTeX and SliTeX CM fonts
#
# example:	the file junk.mkf could contain
#
#			dpi = 300
#			maxmag = 1548
#			mode = localfont
#			mfbin = /usr/local/bin
#			mf = cmmf
#			mkt = "mkt"
#			mkl =
#
#		to execute in the directory with the *.mf files
#
#			mkf junk.mkf > somefile
#			make -f somefile
#
# still more examples:
#
#	# canoncx.mkf
#	dpi=300
#	maxmag=1548
#	mode=CanonCX
#	mfbin=/usr/local/bin
#	mf=virmf \&cmplain
#	mkt="mkt"
#	mkl="mkl"
#
#	# r4080.mkf
#	dpi=300
#	maxmag=1548
#	mode=RicohFourZeroEightZero
#	mfbin=/usr/local/bin
#	mf=virmf \&cmplain
#	mkt="mkt"
#	mkl="mkl"
#
#	# toshiba.mkf
#	dpi=180
#	maxmag=929
#	mode=toshiba
#	mfbin=/usr/local/bin
#	mf=virmf \&cmplain
#	mkt="mkt"
#	mkl=
#
#
# author:	Harold G. Walters  walters@1.ce.okstate.edu
#
#
# Date: Wed, 24 May 89 12:21:28 cdt
# From: "Harold G. Walters" <walters@1.ce.okstate.edu>
# Subject: Mkf shell script to generate standard fonts
# Keywords: TeX, LaTeX, SliTeX, fonts
#
# What follows is a shell script to generate a makefile to build the
# standard set of TeX and/or LaTeX and SliTeX fonts.  It is driven by a
# small file that contains information like dpi and mode for Metafont.
# Examples are given below.   You can use this script to generate all
# makefiles for your fonts instead of having a zillion different
# makefiles.  It makes life much easier when generating fonts for a new
# printer.
#
# Harold G. Walters			walters@1.ce.okstate.edu
# School of Civil Engineering		okstate!oksce1!walters
# Oklahoma State University		"If all you have is a hammer,
# Stillwater, OK  74078			 everything looks like a nail".
#
# Changes at Utah [Nelson H. F. Beebe]
# [03-Aug-89] -- changed awk to nawk because I added gsub() calls to strip
#		 blanks from fields (it is not convenient to have to suppress
#		 spaces in the assignments)
nawk '\
BEGIN {
	FS = "=";
	dpi = 300;
	maxmag = 1548;
	mfbin = "/usr/local/bin";
	mf = "cmmf";
	mode = "localfont";
	mkt = "";
	mkl = "";
	linelen = 60;
# tex fonts
	tfonts["1S1"] = "cmbsy10";
	tfonts["1S2"] = "cmbx10";
	tfonts["1S3"] = "cmbx12";
	tfonts["1S4"] = "cmbx5";
	tfonts["1S5"] = "cmbx6";
	tfonts["1S6"] = "cmbx7";
	tfonts["1S7"] = "cmbx8";
	tfonts["1S8"] = "cmbx9";
	tfonts["1S9"] = "cmcsc10";
	tfonts["1S10"] = "cmdunh10";
	tfonts["1S11"] = "cmex10";
	tfonts["1S12"] = "cmmi10";
	tfonts["1S13"] = "cmmi12";
	tfonts["1S14"] = "cmmi5";
	tfonts["1S15"] = "cmmi6";
	tfonts["1S16"] = "cmmi7";
	tfonts["1S17"] = "cmmi8";
	tfonts["1S18"] = "cmmi9";
	tfonts["1S19"] = "cmmib10";
	tfonts["1S20"] = "cmr10";
	tfonts["1S21"] = "cmr12";
	tfonts["1S22"] = "cmr17";
	tfonts["1S23"] = "cmr5";
	tfonts["1S24"] = "cmr6";
	tfonts["1S25"] = "cmr7";
	tfonts["1S26"] = "cmr8";
	tfonts["1S27"] = "cmr9";
	tfonts["1S28"] = "cmsl10";
	tfonts["1S29"] = "cmsl12";
	tfonts["1S30"] = "cmsl8";
	tfonts["1S31"] = "cmsl9";
	tfonts["1S32"] = "cmsltt10";
	tfonts["1S33"] = "cmss10";
	tfonts["1S34"] = "cmss12";
	tfonts["1S35"] = "cmss17";
	tfonts["1S36"] = "cmssbx10";
	tfonts["1S37"] = "cmssi10";
	tfonts["1S38"] = "cmssi12";
	tfonts["1S39"] = "cmssi17";
	tfonts["1S40"] = "cmssq8";
	tfonts["1S41"] = "cmssqi8";
	tfonts["1S42"] = "cmsy10";
	tfonts["1S43"] = "cmsy5";
	tfonts["1S44"] = "cmsy6";
	tfonts["1S45"] = "cmsy7";
	tfonts["1S46"] = "cmsy8";
	tfonts["1S47"] = "cmsy9";
	tfonts["1S48"] = "cmtex10";
	tfonts["1S49"] = "cmtex9";
	tfonts["1S50"] = "cmti10";
	tfonts["1S51"] = "cmti12";
	tfonts["1S52"] = "cmti7";
	tfonts["1S53"] = "cmti8";
	tfonts["1S54"] = "cmti9";
	tfonts["1S55"] = "cmtt10";
	tfonts["1S56"] = "cmtt12";
	tfonts["1S57"] = "cmtt8";
	tfonts["1S58"] = "cmtt9";
	tfonts["1S59"] = "cmu10";
	tfonts["1S60"] = "manfnt";
	tfonts_n_mag_j[1] = 60;
	tfonts["2S1"] = "cmbx10";
	tfonts["2S2"] = "cmmi10";
	tfonts["2S3"] = "cmr10";
	tfonts["2S4"] = "cmsl10";
	tfonts["2S5"] = "cmss10";
	tfonts["2S6"] = "cmsy10";
	tfonts["2S7"] = "cmti10";
	tfonts["2S8"] = "cmtt10";
	tfonts["2S9"] = "manfnt";
	tfonts_n_mag_j[2] = 9;
	tfonts["3S1"] = "cmsy10";
	tfonts["3S2"] = "manfnt";
	tfonts_n_mag_j[3] = 2;
	tfonts["4S1"] = "cmbx10";
	tfonts["4S2"] = "cmmi10";
	tfonts["4S3"] = "cmr10";
	tfonts["4S4"] = "cmssbx10";
	tfonts["4S5"] = "cmsy10";
	tfonts["4S6"] = "cmtt10";
	tfonts["4S7"] = "manfnt";
	tfonts_n_mag_j[4] = 7;
	tfonts["5S1"] = "cmbx10";
	tfonts["5S2"] = "cmsy10";
	tfonts["5S3"] = "manfnt";
	tfonts_n_mag_j[5] = 3;
	tfonts["6S1"] = "cmbx10";
	tfonts["6S2"] = "cmmi10";
	tfonts["6S3"] = "cmr10";
	tfonts["6S4"] = "cmr7";
	tfonts["6S5"] = "cmsy10";
	tfonts["6S6"] = "manfnt";
	tfonts_n_mag_j[6] = 6;
	tfonts["7S1"] = "cmbx10";
	tfonts["7S2"] = "cmr10";
	tfonts["7S3"] = "manfnt";
	tfonts_n_mag_j[7] = 3;
	tfonts_n_mag_i = 7;
# latex fonts
	lfonts["1S1"] = "lasy10";
	lfonts["1S2"] = "lasy5";
	lfonts["1S3"] = "lasy6";
	lfonts["1S4"] = "lasy7";
	lfonts["1S5"] = "lasy8";
	lfonts["1S6"] = "lasy9";
	lfonts["1S7"] = "lasyb10";
	lfonts["1S8"] = "lcircle10";
	lfonts["1S9"] = "lcirclew10";
	lfonts["1S10"] = "line10";
	lfonts["1S11"] = "linew10";
	lfonts_n_mag_j[1] = 11;
	lfonts["2S1"] = "lasy10";
	lfonts["2S2"] = "lasy5";
	lfonts["2S3"] = "lasy7";
	lfonts["2S4"] = "lasyb10";
	lfonts_n_mag_j[2] = 4;
	lfonts["3S1"] = "lasy10";
	lfonts["3S2"] = "lasy5";
	lfonts["3S3"] = "lasy7";
	lfonts["3S4"] = "lasyb10";
	lfonts_n_mag_j[3] = 4;
	lfonts["4S1"] = "lasy10";
	lfonts["4S2"] = "lasy5";
	lfonts["4S3"] = "lasy7";
	lfonts["4S4"] = "lasyb10";
	lfonts_n_mag_j[4] = 4;
	lfonts["5S1"] = "cmex10";
	lfonts["5S2"] = "cmmi8";
	lfonts["5S3"] = "cmsy8";
	lfonts["5S4"] = "cmtt8";
	lfonts["5S5"] = "icmex10";
	lfonts["5S6"] = "icmmi8";
	lfonts["5S7"] = "icmsy8";
	lfonts["5S8"] = "icmtt8";
	lfonts["5S9"] = "ilasy8";
	lfonts["5S10"] = "ilcmss8";
	lfonts["5S11"] = "ilcmssb8";
	lfonts["5S12"] = "ilcmssi8";
	lfonts["5S13"] = "lasy10";
	lfonts["5S14"] = "lasy5";
	lfonts["5S15"] = "lasy7";
	lfonts["5S16"] = "lasy8";
	lfonts["5S17"] = "lasyb10";
	lfonts["5S18"] = "lcmss8";
	lfonts["5S19"] = "lcmssb8";
	lfonts["5S20"] = "lcmssi8";
	lfonts_n_mag_j[5] = 20;
	lfonts["6S1"] = "cmmi8";
	lfonts["6S2"] = "cmsy8";
	lfonts["6S3"] = "cmtt8";
	lfonts["6S4"] = "icmmi8";
	lfonts["6S5"] = "icmsy8";
	lfonts["6S6"] = "icmtt8";
	lfonts["6S7"] = "ilasy8";
	lfonts["6S8"] = "ilcmss8";
	lfonts["6S9"] = "ilcmssb8";
	lfonts["6S10"] = "ilcmssi8";
	lfonts["6S11"] = "lasy10";
	lfonts["6S12"] = "lasy5";
	lfonts["6S13"] = "lasy7";
	lfonts["6S14"] = "lasy8";
	lfonts["6S15"] = "lasyb10";
	lfonts["6S16"] = "lcmss8";
	lfonts["6S17"] = "lcmssb8";
	lfonts["6S18"] = "lcmssi8";
	lfonts_n_mag_j[6] = 18;
	lfonts["7S1"] = "cmmi8";
	lfonts["7S2"] = "cmsy8";
	lfonts["7S3"] = "cmtt8";
	lfonts["7S4"] = "icmmi8";
	lfonts["7S5"] = "icmsy8";
	lfonts["7S6"] = "icmtt8";
	lfonts["7S7"] = "ilasy8";
	lfonts["7S8"] = "ilcmss8";
	lfonts["7S9"] = "ilcmssb8";
	lfonts["7S10"] = "ilcmssi8";
	lfonts["7S11"] = "lasy10";
	lfonts["7S12"] = "lasy5";
	lfonts["7S13"] = "lasy7";
	lfonts["7S14"] = "lasy8";
	lfonts["7S15"] = "lasyb10";
	lfonts["7S16"] = "lcmss8";
	lfonts["7S17"] = "lcmssb8";
	lfonts["7S18"] = "lcmssi8";
	lfonts_n_mag_j[7] = 18;
	lfonts["8S1"] = "cmmi8";
	lfonts["8S2"] = "cmsy8";
	lfonts["8S3"] = "cmtt8";
	lfonts["8S4"] = "icmmi8";
	lfonts["8S5"] = "icmsy8";
	lfonts["8S6"] = "icmtt8";
	lfonts["8S7"] = "ilasy8";
	lfonts["8S8"] = "ilcmss8";
	lfonts["8S9"] = "ilcmssb8";
	lfonts["8S10"] = "ilcmssi8";
	lfonts["8S11"] = "lasy8";
	lfonts["8S12"] = "lcmss8";
	lfonts["8S13"] = "lcmssb8";
	lfonts["8S14"] = "lcmssi8";
	lfonts_n_mag_j[8] = 14;
	lfonts["9S1"] = "cmmi8";
	lfonts["9S2"] = "cmsy8";
	lfonts["9S3"] = "cmtt8";
	lfonts["9S4"] = "icmmi8";
	lfonts["9S5"] = "icmsy8";
	lfonts["9S6"] = "icmtt8";
	lfonts["9S7"] = "ilasy8";
	lfonts["9S8"] = "ilcmss8";
	lfonts["9S9"] = "ilcmssb8";
	lfonts["9S10"] = "ilcmssi8";
	lfonts["9S11"] = "lasy8";
	lfonts["9S12"] = "lcmss8";
	lfonts["9S13"] = "lcmssb8";
	lfonts["9S14"] = "lcmssi8";
	lfonts_n_mag_j[9] = 14;
	lfonts["10S1"] = "cmmi8";
	lfonts["10S2"] = "cmsy8";
	lfonts["10S3"] = "cmtt8";
	lfonts["10S4"] = "icmmi8";
	lfonts["10S5"] = "icmsy8";
	lfonts["10S6"] = "icmtt8";
	lfonts["10S7"] = "ilasy8";
	lfonts["10S8"] = "ilcmss8";
	lfonts["10S9"] = "ilcmssb8";
	lfonts["10S10"] = "ilcmssi8";
	lfonts["10S11"] = "lasy8";
	lfonts["10S12"] = "lcmss8";
	lfonts["10S13"] = "lcmssb8";
	lfonts["10S14"] = "lcmssi8";
	lfonts_n_mag_j[10] = 14;
	lfonts["11S1"] = "ilcmss8";
	lfonts["11S2"] = "lcmss8";
	lfonts_n_mag_j[11] = 2;
	lfonts_n_mag_i = 11;
}
/^[ 	]*dpi/ {
	dpi = $2 + 0;
}
/^[ 	]*maxmag/ {
	maxmag = $2 + 0;
}
/^[ 	]*mfbin/ {
	gsub(/[ \t]/,"",$2);
	mfbin = $2;
}
/^[ 	]*mf/ {
	gsub(/[ \t]/,"",$2);
	mf = $2;
}
/^[ 	]*mode/ {
	gsub(/[ \t]/,"",$2);
	mode = $2;
}
/^[ 	]*mkt/ {
	gsub(/[ \t]/,"",$2);
	mkt = $2;
}
/^[ 	]*mkl/ {
	gsub(/[ \t]/,"",$2);
	mkl = $2;
}
END {
# calc magsteps
# NOMAG
	magst[1] = 0;
	mags[1] = dpi;
# HALFMAG
	magst[2] = 0.5;
	mags[2] = dpi * sqrt(1.2);
# MAGONE
	magst[3] = 1;
	mags[3] = dpi * 1.2;
# MAGetc.
	for (i = 4; (i <= lfonts_n_mag_i) && (mags[i] < maxmag); i++)
	{
		mags[i] = mags[i-1] * 1.2;
		magst[i] = i-2;
	}
	n_mag = i - 1;
# round
	dpi = int(dpi + 0.5);
	for (i = 1; i <= n_mag; i++)
	{
		mags[i] = int(mags[i] + 0.5);
	}
	"date" | getline date;
	"pwd" | getline pwd;
	"echo \"<`whoami`@`hostname`>\"" | getline user;
# print out the makefile
	printf "#============================================================\n";
	printf "# WARNING:  Do NOT edit this file.\n";
	printf "# It was created automatically by mkf on " date "\n";

	printf "# by " user " in " pwd "\n";
	printf "#============================================================\n\n";
	printf "GFTOPK = gftopk\n";
	printf "MF = " mfbin "/" mf "\n";
	printf "MFFLAGS = \"\\mode:="  mode ";\" \"batchmode;\"\n\n";
	printf ".SUFFIXES:\n";
	printf ".SUFFIXES: .mf ";
	for (i = 1; i <= n_mag; i++)
	{
		printf ".%dpk ", mags[i];
	}
	printf "\n\n";
	cmdline = "$(MF) $(MFFLAGS) ";
	dpnd = "\n.mf.%dpk:\n\t";
	inpt = "input $*\n";
	for (i = 1; i <= n_mag; i++)
	{
		if (magst[i] == 0)
		{
			cmd = dpnd cmdline inpt;
			printf cmd,dpi;
		}
		else
		{
			cmd = dpnd cmdline "\"mag:=magstep(%2.1f);\" " inpt;
			printf cmd,mags[i],magst[i];
		}
		printf "\t-  $(GFTOPK) $*.%dgf\n", mags[i];
		printf "\t@- rm -f $*.%dgf\n", mags[i];
	}
	printf "\nall:\t";
# tex fonts
	len = 0;
	if (mkt != "")
	{
		for (i = 1; i <= tfonts_n_mag_i; i++)
		{
			for (j = 1; j <= tfonts_n_mag_j[i]; j++)
			{
				ind = i "S" j;
				l = sprintf("%s.%dpk ", tfonts[ind], mags[i]);
				len += length(l);
				if (len > linelen)
				{
					printf "\\\n\t";
					len = 8;
				}
				printf "%s", l;
			}
		}
	}
# latex cm fonts
	len = 0;
	if (mkl != "")
	{
		if (mkt != "")
			printf "\\\n\t";
		for (i = 1; i <= n_mag; i++)
		{
			for (j = 1; j <= lfonts_n_mag_j[i]; j++)
			{
				ind = i "S" j;

				# These 2 fonts are obsolete
				if ((lfonts[ind] == "lcircle10") ||
					(lfonts[ind] == "lcirclew10"))
					continue;

				l = sprintf("%s.%dpk ", lfonts[ind], mags[i]);
				len += length(l);
				if (len > linelen)
				{
					len = 0;
					printf "\\\n\t";
				}
				printf "%s", l;
			}
		}
	}
}' < $1
exit 0
