add: break;  case KPATHSEA_DEBUG_OPT: #if HAVE_KPATHSEA kpsei_set_debug_flags(clp->val.u); #else errh->warning("Not compiled with kpathsea!"); #endif
context: main(int argc, char **argv){    String::static_initialize();    Clp_Parser *clp =	Clp_NewParser(argc, argv, sizeof(options) / sizeof(options[0]), options);    program_name = Clp_ProgramName(clp);#if HAVE_KPATHSEA    kpsei_init(argv[0]);#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;    const char *glyphlist_file = SHAREDIR "/glyphlist.txt";    bool literal_encoding = false;    bool query_scripts = false;    bool query_features = false;    Vector<String> ligkern;    Vector<String> unicoding;    String codingscheme;      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(0U));	      } else		  usage_error(errh, "bad script tag");	      break;	  }	  case FEATURE_OPT: {	      OpenType::Tag t(clp->arg);	      if (t.valid())		  interesting_features.push_back(t);	      else		  usage_error(errh, "bad feature tag");	      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 LIGKERN_OPT:	    ligkern.push_back(clp->arg);	    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:	    output_flags &= ~(opt - NO_OUTPUT_OPTS);	    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_file = clp->arg;	    break;	    	  case QUERY_FEATURES_OPT:	    query_features = true;	    break;	  case QUERY_SCRIPTS_OPT:	    query_scripts = true;	    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:	    nocreate = clp->negated;	    break;	  case VERSION_OPT:	    printf("otftotfm (LCDF typetools) %s\n", VERSION);	    printf("Copyright (C) 2002-2003 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:    if (!input_file)	usage_error(errh, "no font filename provided");        // read font    String font_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(font_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(0U));    }    if (interesting_features.size())	std::sort(interesting_features.begin(), interesting_features.end());    // read scripts or features    if (query_scripts) {	do_query_scripts(otf, &cerrh);	exit(errh->nerrors() > 0);    } else if (query_features) {	do_query_features(otf, &cerrh);	exit(errh->nerrors() > 0);    }    // read glyphlist    if (String s = read_file(glyphlist_file, errh, true))	DvipsEncoding::parse_glyphlist(s);    // read encoding    DvipsEncoding dvipsenc;    if (encoding_file) {	if (String path = locate_encoding(encoding_file, errh))	    dvipsenc.parse(path, 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::Font font(&cff, 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");    }    // 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], &cerrh);    cerrh.set_landmark("--unicoding command");    for (int i = 0; i < unicoding.size(); i++)	dvipsenc.parse_unicoding(unicoding[i], &cerrh);    if (codingscheme)	dvipsenc.set_coding_scheme(codingscheme);    do_file(input_file, otf, dvipsenc, literal_encoding, errh);        return (errh->nerrors() == 0 ? 0 : 1);}