rem: const OpenType::Font &family_otf, const Cff::Font *family_cff, String tfm_filename, String vf_filename, ErrorHandler *errh)
add: const FontInfo &finfo, String tfm_filename, String vf_filename, ErrorHandler *errh)
context: output_tfm(const Metrics &metrics, const String &ps_name, int boundary_char,	   const OpenType::Font &family_otf, const Cff::Font *family_cff,	   String tfm_filename, String vf_filename, ErrorHandler *errh){    String pl_filename;    int pl_fd = temporary_file(pl_filename, errh);    if (pl_fd < 0)	return;    bool vpl = vf_filename;    if (no_create) {	errh->message("would write %s to temporary file", (vpl ? "VPL" : "PL"));	pl_filename = "<temporary>";    } else {	if (verbose)	    errh->message("writing %s to temporary file", (vpl ? "VPL" : "PL"));	FILE *f = fdopen(pl_fd, "w");	output_pl(metrics, ps_name, boundary_char, family_otf, family_cff, vpl, f);	fclose(f);    }    StringAccum command;    if (vpl)	command << "vptovf " << shell_quote(pl_filename) << ' ' << shell_quote(vf_filename) << ' ' << shell_quote(tfm_filename) << " >&2";    else	command << "pltotf " << shell_quote(pl_filename) << ' ' << shell_quote(tfm_filename) << " >&2";        int status = mysystem(command.c_str(), errh);    if (!no_create)	unlink(pl_filename.c_str());        if (status != 0)	errh->fatal("%s execution failed", (vpl ? "vptovf" : "pltotf"));    else {	update_odir(O_TFM, tfm_filename, errh);	if (vpl)	    update_odir(O_VF, vf_filename, errh);    }}