add: if (warn_missing >= 0) dvipsenc.set_warn_missing(warn_missing);
context: main(int argc, char *argv[]){#ifndef WIN32    handle_sigchld();#endif    String::static_initialize();    Clp_Parser *clp =	Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);    Clp_AddType(clp, CHAR_OPTTYPE, 0, clp_parse_char, 0);    program_name = Clp_ProgramName(clp);#if HAVE_KPATHSEA    kpsei_init(argv[0], "lcdftools");#endif#ifdef HAVE_CTIME    {	time_t t = time(0);	char *c = ctime(&t);	current_time = " on " + String(c).substring(0, -1); // get rid of \n    }#endif    for (int i = 0; i < argc; i++)	invocation << (i ? " " : "") << argv[i];        ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr, String(program_name) + ": "));    const char *input_file = 0;    Vector<String> glyphlist_files;    bool literal_encoding = false;    Vector<String> ligkern;    Vector<String> pos;    Vector<String> unicoding;    bool no_ecommand = false, default_ligkern = true;    String codingscheme;    GlyphFilter current_substitution_filter;    GlyphFilter current_alternate_filter;    GlyphFilter* current_filter_ptr = &null_filter;        while (1) {	int opt = Clp_Next(clp);	switch (opt) {	  case SCRIPT_OPT: {	      String arg = clp->arg;	      int period = arg.find_left('.');	      OpenType::Tag scr(period <= 0 ? arg : arg.substring(0, period));	      if (scr.valid() && period > 0) {		  OpenType::Tag lang(arg.substring(period + 1));		  if (lang.valid()) {		      interesting_scripts.push_back(scr);		      interesting_scripts.push_back(lang);		  } else		      usage_error(errh, "bad language tag");	      } else if (scr.valid()) {		  interesting_scripts.push_back(scr);		  interesting_scripts.push_back(OpenType::Tag());	      } else		  usage_error(errh, "bad script tag");	      break;	  }	  case FEATURE_OPT: {	      OpenType::Tag t(clp->arg);	      if (!t.valid())		  usage_error(errh, "bad feature tag");	      else if (feature_filters[t])		  usage_error(errh, "feature '%s' included twice", t.text().c_str());	      else {		  if (!current_filter_ptr)		      current_filter_ptr = new GlyphFilter(current_substitution_filter + current_alternate_filter);		  interesting_features.push_back(t);		  feature_filters.insert(t, current_filter_ptr);	      }	      break;	  }      	  case LETTER_FEATURE_OPT: {	      OpenType::Tag t(clp->arg);	      if (!t.valid())		  usage_error(errh, "bad feature tag");	      else if (feature_filters[t])		  usage_error(errh, "feature '%s' included twice", t.text().c_str());	      else {		  interesting_features.push_back(t);		  GlyphFilter* gf = new GlyphFilter;		  gf->add_substitution_filter("<Letter>", false, errh);		  *gf += current_alternate_filter;		  feature_filters.insert(t, gf); 	      }	      break;	  }	  case SUBS_FILTER_OPT:	    current_substitution_filter = null_filter;	    /* fallthru */	  case EXCLUDE_SUBS_OPT:	  case INCLUDE_SUBS_OPT:	    current_substitution_filter.add_substitution_filter(clp->arg, opt == EXCLUDE_SUBS_OPT, errh);	    current_filter_ptr = 0;	    break;	  case CLEAR_SUBS_OPT:	    current_substitution_filter = null_filter;	    current_filter_ptr = 0;	    break;	    	  case ENCODING_OPT:	    if (encoding_file)		usage_error(errh, "encoding specified twice");	    encoding_file = clp->arg;	    break;	  case LITERAL_ENCODING_OPT:	    if (encoding_file)		usage_error(errh, "encoding specified twice");	    encoding_file = clp->arg;	    literal_encoding = true;	    break;	  case EXTEND_OPT:	    if (extend)		usage_error(errh, "extend value specified twice");	    extend = clp->val.d;	    break;	  case SLANT_OPT:	    if (slant)		usage_error(errh, "slant value specified twice");	    slant = clp->val.d;	    break;	  case LETTERSPACE_OPT:	    if (letterspace)		usage_error(errh, "letterspacing value specified twice");	    letterspace = clp->val.i;	    break;	  case SPACE_FACTOR_OPT:	    if (space_factor != 1)		usage_error(errh, "space factor specified twice");	    space_factor = clp->val.d;	    break;	  case MATH_SPACING_OPT:	    math_spacing = !clp->negated;	    if (math_spacing && clp->have_arg) {		if (clp->val.i < 0 || clp->val.i > 255)		    usage_error(errh, "--math-spacing skew character must be between 0 and 255");		skew_char = clp->val.i;	    }	    break;	    	  case DESIGN_SIZE_OPT:	    if (design_size > 0)		usage_error(errh, "design size value specified twice");	    else if (clp->val.d <= 0)		usage_error(errh, "design size must be > 0");	    design_size = clp->val.d;	    break;	  case LIGKERN_OPT:	    ligkern.push_back(clp->arg);	    break;	  case POSITION_OPT:	    pos.push_back(clp->arg);	    break;	  case NO_ECOMMAND_OPT:	    no_ecommand = true;	    break;	  case DEFAULT_LIGKERN_OPT:	    default_ligkern = !clp->negated;	    break;	  case BOUNDARY_CHAR_OPT:	    ligkern.push_back(String("|| = ") + String(clp->val.i));	    break;	  case ALTSELECTOR_CHAR_OPT:	    ligkern.push_back(String("^^ = ") + String(clp->val.i));	    break;	  case ALTSELECTOR_FEATURE_OPT: {	      OpenType::Tag t(clp->arg);	      if (!t.valid())		  usage_error(errh, "bad feature tag");	      else if (altselector_feature_filters[t])		  usage_error(errh, "altselector feature '%s' included twice", t.text().c_str());	      else {		  if (!current_filter_ptr)		      current_filter_ptr = new GlyphFilter(current_substitution_filter + current_alternate_filter);		  altselector_features.push_back(t);		  altselector_feature_filters.insert(t, current_filter_ptr);	      }	      break;	  }	  case ALTERNATES_FILTER_OPT:	    current_alternate_filter = null_filter;	    /* fallthru */	  case EXCLUDE_ALTERNATES_OPT:	  case INCLUDE_ALTERNATES_OPT:	    current_alternate_filter.add_alternate_filter(clp->arg, opt == EXCLUDE_ALTERNATES_OPT, errh);	    current_filter_ptr = 0;	    break;	  case CLEAR_ALTERNATES_OPT:	    current_alternate_filter = null_filter;	    current_filter_ptr = 0;	    break;	    	  case UNICODING_OPT:	    unicoding.push_back(clp->arg);	    break;	    	  case CODINGSCHEME_OPT:	    if (codingscheme)		usage_error(errh, "coding scheme specified twice");	    codingscheme = clp->arg;	    if (codingscheme.length() > 39)		errh->warning("only first 39 characters of coding scheme are significant");	    if (codingscheme.find_left('(') >= 0 || codingscheme.find_left(')') >= 0)		usage_error(errh, "coding scheme cannot contain parentheses");	    break;	  case AUTOMATIC_OPT:	    automatic = !clp->negated;	    break;	  case VENDOR_OPT:	    if (!set_vendor(clp->arg))		usage_error(errh, "vendor name specified twice");	    break;	  case TYPEFACE_OPT:	    if (!set_typeface(clp->arg, true))		usage_error(errh, "typeface name specified twice");	    break;	  case VIRTUAL_OPT:	    if (clp->negated)		output_flags &= ~G_VMETRICS;	    else		output_flags |= G_VMETRICS;	    break;	  case NO_ENCODING_OPT:	  case NO_TYPE1_OPT:	  case NO_DOTLESSJ_OPT:	  case NO_UPDMAP_OPT:	    output_flags &= ~(opt - NO_OUTPUT_OPTS);	    break;	  case OUTPUT_ENCODING_OPT:	    if (out_encoding_file)		usage_error(errh, "encoding output file specified twice");	    out_encoding_file = (clp->have_arg ? clp->arg : "-");	    output_flags = G_ENCODING;	    break;	  case MINIMUM_KERN_OPT:	    minimum_kern = clp->val.d;	    break;	    	  case MAP_FILE_OPT:	    if (clp->negated)		output_flags &= ~G_PSFONTSMAP;	    else {		output_flags |= G_PSFONTSMAP;		if (!set_map_file(clp->arg))		    usage_error(errh, "map file specified twice");	    }	    break;	    	  case PL_OPT:	    output_flags = (output_flags & ~G_BINARY) | G_ASCII;	    break;	  case TFM_OPT:	    output_flags = (output_flags & ~G_ASCII) | G_BINARY;	    break;	    	  case ENCODING_DIR_OPT:	  case TFM_DIR_OPT:	  case PL_DIR_OPT:	  case VF_DIR_OPT:	  case VPL_DIR_OPT:	  case TYPE1_DIR_OPT:	    if (!setodir(opt - DIR_OPTS, clp->arg))		usage_error(errh, "%s directory specified twice", odirname(opt - DIR_OPTS));	    break;	    	  case FONT_NAME_OPT:	  font_name:	    if (font_name)		usage_error(errh, "font name specified twice");	    font_name = clp->arg;	    break;	  case GLYPHLIST_OPT:	    glyphlist_files.push_back(clp->arg);	    break;	    	  case QUERY_FEATURES_OPT:	    usage_error(errh, "run 'otfinfo --query-features' instead");	    break;	  case QUERY_SCRIPTS_OPT:	    usage_error(errh, "run 'otfinfo --query-scripts' instead");	    break;	    	  case QUIET_OPT:	    if (clp->negated)		errh = ErrorHandler::default_handler();	    else		errh = ErrorHandler::silent_handler();	    break;	  case VERBOSE_OPT:	    verbose = !clp->negated;	    break;	  case NOCREATE_OPT:	    no_create = clp->negated;	    break;	  case FORCE_OPT:	    force = !clp->negated;	    break;	  case KPATHSEA_DEBUG_OPT:#if HAVE_KPATHSEA	    kpsei_set_debug_flags(clp->val.u);#else	    errh->warning("Not compiled with kpathsea!");#endif	    break;	  case VERSION_OPT:	    printf("otftotfm (LCDF typetools) %s\n", VERSION);	    printf("Copyright (C) 2002-2005 Eddie Kohler\n\This is free software; see the source for copying conditions.\n\There is NO warranty, not even for merchantability or fitness for a\n\particular purpose.\n");	    exit(0);	    break;      	  case HELP_OPT:	    usage();	    exit(0);	    break;	  case Clp_NotOption:	    if (input_file && font_name)		usage_error(errh, "too many arguments");	    else if (input_file)		goto font_name;	    else		input_file = clp->arg;	    break;	  case Clp_Done:	    goto done;      	  case Clp_BadOption:	    usage_error(errh, 0);	    break;	  default:	    break;      	}    }      done:    try {	if (!input_file)	    usage_error(errh, "no font filename provided");	if (!encoding_file) {	    errh->warning("no encoding provided");	    errh->message("(Use '-e ENCODING' to choose an encoding. '-e texnansx' often works,\nor say '-e -' to turn off this warning.)");	} else if (encoding_file == "-")	    encoding_file = "";    	// read font	otf_data = read_file(input_file, errh);	if (errh->nerrors())	    exit(1);	LandmarkErrorHandler cerrh(errh, printable_filename(input_file));	BailErrorHandler bail_errh(&cerrh);	OpenType::Font otf(otf_data, &bail_errh);	assert(otf.ok());	// figure out scripts we care about	if (!interesting_scripts.size()) {	    interesting_scripts.push_back(Efont::OpenType::Tag("latn"));	    interesting_scripts.push_back(Efont::OpenType::Tag());	}	std::sort(interesting_features.begin(), interesting_features.end());	std::sort(altselector_features.begin(), altselector_features.end());	// find glyphlist#if HAVE_KPATHSEA	if (!glyphlist_files.size()) {	    if (String g = kpsei_find_file("glyphlist.txt", KPSEI_FMT_MAP)) {		glyphlist_files.push_back(g);		if (verbose)		    errh->message("glyphlist.txt found with kpathsea at %s", g.c_str());	    }	    if (String g = kpsei_find_file("texglyphlist.txt", KPSEI_FMT_MAP)) {		glyphlist_files.push_back(g);		if (verbose)		    errh->message("texglyphlist.txt found with kpathsea at %s", g.c_str());	    }	}#endif	if (!glyphlist_files.size()) {	    glyphlist_files.push_back(SHAREDIR "/glyphlist.txt");	    glyphlist_files.push_back(SHAREDIR "/texglyphlist.txt");	}		// read glyphlist	for (String *g = glyphlist_files.begin(); g < glyphlist_files.end(); g++)	    if (String s = read_file(*g, errh, true))		DvipsEncoding::add_glyphlist(s);	// read encoding	DvipsEncoding dvipsenc;	if (encoding_file) {	    if (String path = locate_encoding(encoding_file, errh))		dvipsenc.parse(path, no_ecommand, no_ecommand, errh);	    else		errh->fatal("encoding '%s' not found", encoding_file.c_str());	} else {	    // use encoding from font	    Cff cff(otf.table("CFF"), &bail_errh);	    Cff::FontParent *font = cff.font(PermString(), &bail_errh);	    assert(cff.ok() && font->ok());	    if (Type1Encoding *t1e = font->type1_encoding()) {		for (int i = 0; i < 256; i++)		    dvipsenc.encode(i, (*t1e)[i]);	    } else		errh->fatal("font has no encoding, specify one explicitly");	    delete font;	}	// apply default ligkern commands	if (default_ligkern)	    dvipsenc.parse_ligkern(default_ligkerns, 0, ErrorHandler::silent_handler());    	// apply command-line ligkern commands and coding scheme	cerrh.set_landmark("--ligkern command");	for (int i = 0; i < ligkern.size(); i++)	    dvipsenc.parse_ligkern(ligkern[i], 1, &cerrh);	cerrh.set_landmark("--position command");	for (int i = 0; i < pos.size(); i++)	    dvipsenc.parse_position(pos[i], 1, &cerrh);	cerrh.set_landmark("--unicoding command");	for (int i = 0; i < unicoding.size(); i++)	    dvipsenc.parse_unicoding(unicoding[i], 1, &cerrh);	if (codingscheme)	    dvipsenc.set_coding_scheme(codingscheme);	do_file(input_file, otf, dvipsenc, literal_encoding, errh);	    } catch (OpenType::Error e) {	errh->error("unhandled exception '%s'", e.description.c_str());    }        return (errh->nerrors() == 0 ? 0 : 1);}