⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 options.c

📁 Exuberant Ctags is a multilanguage reimplementation of the much-underused ctags(1) program and is i
💻 C
📖 第 1 页 / 共 3 页
字号:
	return (boolean) (argOff (current->args) && ! cArgOptionPending (current));}extern boolean cArgIsOption (cookedArgs* const current){	Assert (current != NULL);	return current->isOption;}extern const char* cArgItem (cookedArgs* const current){	Assert (current != NULL);	return current->item;}extern void cArgForth (cookedArgs* const current){	Assert (current != NULL);	Assert (! cArgOff (current));	if (cArgOptionPending (current))		parseShortOption (current);	else	{		Assert (! argOff (current->args));		argForth (current->args);		if (! argOff (current->args))			cArgRead (current);		else		{			current->isOption = FALSE;			current->longOption = FALSE;			current->shortOptions = NULL;			current->item = NULL;			current->parameter = NULL;		}	}}/* *  File extension and language mapping */static void addExtensionList (		stringList *const slist, const char *const elist, const boolean clear){	char *const extensionList = eStrdup (elist);	const char *extension = NULL;	boolean first = TRUE;	if (clear)	{		verbose ("      clearing\n");		stringListClear (slist);	}	verbose ("      adding: ");	if (elist != NULL  &&  *elist != '\0')	{		extension = extensionList;		if (elist [0] == EXTENSION_SEPARATOR)			++extension;	}	while (extension != NULL)	{		char *separator = strchr (extension, EXTENSION_SEPARATOR);		if (separator != NULL)			*separator = '\0';		verbose ("%s%s", first ? "" : ", ",				*extension == '\0' ? "(NONE)" : extension);		stringListAdd (slist, vStringNewInit (extension));		first = FALSE;		if (separator == NULL)			extension = NULL;		else			extension = separator + 1;	}	if (Option.verbose)	{		printf ("\n      now: ");		stringListPrint (slist);		putchar ('\n');	}	eFree (extensionList);}static boolean isFalse (const char *parameter){	return (boolean) (		strcasecmp (parameter, "0"  ) == 0  ||		strcasecmp (parameter, "n"  ) == 0  ||		strcasecmp (parameter, "no" ) == 0  ||		strcasecmp (parameter, "off") == 0);}static boolean isTrue (const char *parameter){	return (boolean) (		strcasecmp (parameter, "1"  ) == 0  ||		strcasecmp (parameter, "y"  ) == 0  ||		strcasecmp (parameter, "yes") == 0  ||		strcasecmp (parameter, "on" ) == 0);}/*  Determines whether the specified file name is considered to be a header *  file for the purposes of determining whether enclosed tags are global or *  static. */extern boolean isIncludeFile (const char *const fileName){	boolean result = FALSE;	const char *const extension = fileExtension (fileName);	if (Option.headerExt != NULL)		result = stringListExtensionMatched (Option.headerExt, extension);	return result;}/* *  Specific option processing */static void processEtagsInclude (		const char *const option, const char *const parameter){	if (! Option.etags)		error (FATAL, "Etags must be enabled to use \"%s\" option", option);	else	{		vString *const file = vStringNewInit (parameter);		if (Option.etagsInclude == NULL)			Option.etagsInclude = stringListNew ();		stringListAdd (Option.etagsInclude, file);		FilesRequired = FALSE;	}}static void processExcludeOption (		const char *const option __unused__, const char *const parameter){	const char *const fileName = parameter + 1;	if (parameter [0] == '\0')		freeList (&Excluded);	else if (parameter [0] == '@')	{		stringList* const sl = stringListNewFromFile (fileName);		if (sl == NULL)			error (FATAL | PERROR, "cannot open \"%s\"", fileName);		if (Excluded == NULL)			Excluded = sl;		else			stringListCombine (Excluded, sl);		verbose ("    adding exclude patterns from %s\n", fileName);	}	else	{		vString *const item = vStringNewInit (parameter);		if (Excluded == NULL)			Excluded = stringListNew ();		stringListAdd (Excluded, item);		verbose ("    adding exclude pattern: %s\n", parameter);	}}extern boolean isExcludedFile (const char* const name){	const char* base = baseFilename (name);	boolean result = FALSE;	if (Excluded != NULL)	{		result = stringListFileMatched (Excluded, base);		if (! result  &&  name != base)			result = stringListFileMatched (Excluded, name);	}#ifdef AMIGA	/* not a good solution, but the only one which works often */	if (! result)		result = (boolean) (strcmp (name, TagFile.name) == 0);#endif	return result;}static void processExcmdOption (		const char *const option, const char *const parameter){	switch (*parameter)	{		case 'm': Option.locate = EX_MIX;     break;		case 'n': Option.locate = EX_LINENUM; break;		case 'p': Option.locate = EX_PATTERN; break;		default:			error (FATAL, "Invalid value for \"%s\" option", option);			break;	}}static void processExtraTagsOption (		const char *const option, const char *const parameter){	struct sInclude *const inc = &Option.include;	const char *p = parameter;	boolean mode = TRUE;	int c;	if (*p != '+'  &&  *p != '-')	{		inc->fileNames     = FALSE;		inc->qualifiedTags = FALSE;#if 0		inc->fileScope     = FALSE;#endif	}	while ((c = *p++) != '\0') switch (c)	{		case '+': mode = TRUE;                break;		case '-': mode = FALSE;               break;		case 'f': inc->fileNames     = mode;  break;		case 'q': inc->qualifiedTags = mode;  break;#if 0		case 'F': inc->fileScope     = mode;  break;#endif		default: error(WARNING, "Unsupported parameter '%c' for \"%s\" option",					   c, option);			break;	}}static void processFieldsOption (		const char *const option, const char *const parameter){	struct sExtFields *field = &Option.extensionFields;	const char *p = parameter;	boolean mode = TRUE;	int c;	if (*p != '+'  &&  *p != '-')	{		field->access           = FALSE;		field->fileScope        = FALSE;		field->implementation   = FALSE;		field->inheritance      = FALSE;		field->kind             = FALSE;		field->kindKey          = FALSE;		field->kindLong         = FALSE;		field->language         = FALSE;		field->scope            = FALSE;		field->typeRef          = FALSE;	}	while ((c = *p++) != '\0') switch (c)	{		case '+': mode = TRUE;                  break;		case '-': mode = FALSE;                 break;		case 'a': field->access         = mode; break;		case 'f': field->fileScope      = mode; break;		case 'm': field->implementation = mode; break;		case 'i': field->inheritance    = mode; break;		case 'k': field->kind           = mode; break;		case 'K': field->kindLong       = mode; break;		case 'l': field->language       = mode; break;		case 'n': field->lineNumber     = mode; break;		case 's': field->scope          = mode; break;		case 'S': field->signature      = mode; break;		case 'z': field->kindKey        = mode; break;		case 't': field->typeRef        = mode; break;		default: error(WARNING, "Unsupported parameter '%c' for \"%s\" option",					c, option);			break;	}}static void processFilterTerminatorOption (		const char *const option __unused__, const char *const parameter){	freeString (&Option.filterTerminator);	Option.filterTerminator = stringCopy (parameter);}static void processFormatOption (		const char *const option, const char *const parameter){	unsigned int format;	if (sscanf (parameter, "%u", &format) < 1)		error (FATAL, "Invalid value for \"%s\" option",option);	else if (format <= (unsigned int) MaxSupportedTagFormat)		Option.tagFileFormat = format;	else		error (FATAL, "Unsupported value for \"%s\" option", option);}static void printInvocationDescription (void){	printf (INVOCATION, getExecutableName ());}static void printOptionDescriptions (const optionDescription *const optDesc){	int i;	for (i = 0 ; optDesc [i].description != NULL ; ++i)	{		if (! Option.etags || optDesc [i].usedByEtags)			puts (optDesc [i].description);	}}static void printFeatureList (void){	int i;	for (i = 0 ; Features [i] != NULL ; ++i)	{		if (i == 0)			printf ("  Optional compiled features: ");		printf ("%s+%s", (i>0 ? ", " : ""), Features [i]);#ifdef CUSTOM_CONFIGURATION_FILE		if (strcmp (Features [i], "custom-conf") == 0)			printf ("=%s", CUSTOM_CONFIGURATION_FILE);#endif	}	if (i > 0)		putchar ('\n');}static void printProgramIdentification (void){	printf ("%s %s, Copyright (C) 1996-2004 %s\n",			PROGRAM_NAME, PROGRAM_VERSION, AUTHOR_NAME);	printf ("  Compiled: %s, %s\n", __DATE__, __TIME__);	printf ("  Addresses: <%s>, %s\n", AUTHOR_EMAIL, PROGRAM_URL);	printFeatureList ();}static void processHelpOption (		const char *const option __unused__,		const char *const parameter __unused__){	printProgramIdentification ();	putchar ('\n');	printInvocationDescription ();	putchar ('\n');	printOptionDescriptions (LongOptionDescription);	exit (0);}static void processLanguageForceOption (		const char *const option, const char *const parameter){	langType language;	if (strcasecmp (parameter, "auto") == 0)		language = LANG_AUTO;	else		language = getNamedLanguage (parameter);	if (strcmp (option, "lang") == 0  ||  strcmp (option, "language") == 0)		error (WARNING,			   "\"--%s\" option is obsolete; use \"--language-force\" instead",			   option);	if (language == LANG_IGNORE)		error (FATAL, "Unknown language specified in \"%s\" option", option);	else		Option.language = language;}static char* skipPastMap (char* p){	while (*p != EXTENSION_SEPARATOR  &&			*p != PATTERN_START  &&  *p != ','  &&  *p != '\0')		++p;	return p;}/* Parses the mapping beginning at `map', adds it to the language map, and * returns first character past the map. */static char* addLanguageMap (const langType language, char* map){	char* p = NULL;	const char first = *map;	if (first == EXTENSION_SEPARATOR)  /* extension map */	{		++map;		p = skipPastMap (map);		if (*p == '\0')		{			verbose (" .%s", map);			addLanguageExtensionMap (language, map);			p = map + strlen (map);		}		else		{			const char separator = *p;			*p = '\0';			verbose (" .%s", map);			addLanguageExtensionMap (language, map);			*p = separator;		}	}	else if (first == PATTERN_START)  /* pattern map */	{		++map;		for (p = map  ;  *p != PATTERN_STOP  &&  *p != '\0'  ;  ++p)		{			if (*p == '\\'  &&  *(p + 1) == PATTERN_STOP)				++p;		}		if (*p == '\0')			error (FATAL, "Unterminated file name pattern for %s language",			   getLanguageName (language));		else		{			*p++ = '\0';			verbose (" (%s)", map);			addLanguagePatternMap (language, map);		}	}	else		error (FATAL, "Badly formed language map for %s language",				getLanguageName (language));	return p;}static char* processLanguageMap (char* map){	char* const separator = strchr (map, ':');	char* result = NULL;	if (separator != NULL)	{		langType language;		char *list = separator + 1;		boolean clear = FALSE;		*separator = '\0';		language = getNamedLanguage (map);		if (language != LANG_IGNORE)		{			const char *const deflt = "default";			char* p;			if (*list == '+')				++list;			else				clear = TRUE;			for (p = list  ;  *p != ','  &&  *p != '\0'  ;  ++p)  /*no-op*/ ;			if ((size_t) (p - list) == strlen (deflt) &&				strncasecmp (list, deflt, p - list) == 0)			{				verbose ("    Restoring default %s language map: ", getLanguageName (language));				installLanguageMapDefault (language);				list = p;			}			else			{				if (clear)				{					verbose ("    Setting %s language map:", getLanguageName (language));					clearLanguageMap (language);				}				else					verbose ("    Adding to %s language map:", getLanguageName (language));				while (list != NULL  &&  *list != '\0'  &&  *list != ',')					list = addLanguageMap (language, list);				verbose ("\n");			}			if (list != NULL  &&  *list == ',')				++list;			result = list;		}	}	return result;}static void processLanguageMapOption (		const char *const option, const char *const parameter){	char *const maps = eStrdup (parameter);	char *map = maps;	if (strcmp (parameter, "default") == 0)	{		verbose ("    Restoring default language maps:\n");		installLanguageMapDefaults ();	}	else while (map != NULL  &&  *map != '\0')	{		char* const next = processLanguageMap (map);		if (next == NULL)			error (WARNING, "Unknown language specified in \"%s\" option", option);		map = next;	}	eFree (maps);}static void processLanguagesOption (		const char *const option, const char *const parameter){	char *const langs = eStrdup (parameter);	enum { Add, Remove, Replace } mode = Replace;	boolean first = TRUE;	char *lang = langs;	const char* prefix = "";	verbose ("    Enabled languages: ");	while (lang != NULL)	{		char *const end = strchr (lang, ',');		if (lang [0] == '+')		{			++lang;			mode = Add;			prefix = "+ ";		}		else if (lang [0] == '-')		{			++lang;			mode = Remove;			prefix = "- ";		}		if (mode == Replace)			enableLanguages (FALSE);		if (end != NULL)			*end = '\0';		if (lang [0] != '\0')		{			if (strcmp (lang, "all") == 0)				enableLanguages ((boolean) (mode != Remove));			else			{				const langType language = getNamedLanguage (lang);				if (language == LANG_IGNORE)					error (WARNING, "Unknown language specified in \"%s\" option", option);				else					enableLanguage (language, (boolean) (mode != Remove));			}			verbose ("%s%s%s", (first ? "" : ", "), prefix, lang);			prefix = "";			first = FALSE;			if (mode == Replace)				mode = Add;		}		lang = (end != NULL ? end + 1 : NULL);	}	verbose ("\n");	eFree (langs);}static void processLicenseOption (		const char *const option __unused__,		const char *const parameter __unused__){	printProgramIdentification ();	puts ("");	puts (License1);	puts (License2);	exit (0);}static void processListKindsOption (		const char *const option, const char *const parameter){	if (parameter [0] == '\0' || strcasecmp (parameter, "all") == 0)	    printLanguageKinds (LANG_AUTO);	else	{		langType language = getNamedLanguage (parameter);		if (language == LANG_IGNORE)			error (FATAL, "Unknown language specified in \"%s\" option",option);		else			printLanguageKinds (language);	}	exit (0);}static void processListMapsOption (		const char *const __unused__ option,		const char *const __unused__ parameter){	if (parameter [0] == '\0' || strcasecmp (parameter, "all") == 0)	    printLanguageMaps (LANG_AUTO);	else	{		langType language = getNamedLanguage (parameter);		if (language == LANG_IGNORE)			error (FATAL, "Unknown language specified in \"%s\" option",option);		else			printLanguageMaps (language);	}	exit (0);}static void processListLanguagesOption (		const char *const option __unused__,		const char *const parameter __unused__){	printLanguageList ();	exit (0);}static void processOptionFile (

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -