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

📄 parse.c

📁 ctags的最新版5.7,可以比较5.6版看看,免费下载
💻 C
📖 第 1 页 / 共 2 页
字号:
					   def->name);			else				accepted = TRUE;			if (accepted)			{				verbose ("%s%s", i > 0 ? ", " : "", def->name);				def->id = LanguageCount++;				LanguageTable [def->id] = def;			}		}	}	verbose ("\n");	enableLanguages (TRUE);	initializeParsers ();}extern void freeParserResources (void){	unsigned int i;	for (i = 0  ;  i < LanguageCount  ;  ++i)	{		parserDefinition* const lang = LanguageTable [i];		freeList (&lang->currentPatterns);		freeList (&lang->currentExtensions);		eFree (lang->name);		lang->name = NULL;		eFree (lang);	}	if (LanguageTable != NULL)		eFree (LanguageTable);	LanguageTable = NULL;	LanguageCount = 0;}/**   Option parsing*/extern void processLanguageDefineOption (		const char *const option, const char *const parameter __unused__){#ifdef HAVE_REGEX	if (parameter [0] == '\0')		error (WARNING, "No language specified for \"%s\" option", option);	else if (getNamedLanguage (parameter) != LANG_IGNORE)		error (WARNING, "Language \"%s\" already defined", parameter);	else	{		unsigned int i = LanguageCount++;		parserDefinition* const def = parserNew (parameter);		def->parser            = findRegexTags;		def->currentPatterns   = stringListNew ();		def->currentExtensions = stringListNew ();		def->regex             = TRUE;		def->enabled           = TRUE;		def->id                = i;		LanguageTable = xRealloc (LanguageTable, i + 1, parserDefinition*);		LanguageTable [i] = def;	}#else	error (WARNING, "regex support not available; required for --%s option",		   option);#endif}static kindOption *langKindOption (const langType language, const int flag){	unsigned int i;	kindOption* result = NULL;	const parserDefinition* lang;	Assert (0 <= language  &&  language < (int) LanguageCount);	lang = LanguageTable [language];	for (i=0  ;  i < lang->kindCount  &&  result == NULL  ;  ++i)		if (lang->kinds [i].letter == flag)			result = &lang->kinds [i];	return result;}static void disableLanguageKinds (const langType language){	const parserDefinition* lang;	Assert (0 <= language  &&  language < (int) LanguageCount);	lang = LanguageTable [language];	if (lang->regex)		disableRegexKinds (language);	else	{		unsigned int i;		for (i = 0  ;  i < lang->kindCount  ;  ++i)			lang->kinds [i].enabled = FALSE;	}}static boolean enableLanguageKind (		const langType language, const int kind, const boolean mode){	boolean result = FALSE;	if (LanguageTable [language]->regex)		result = enableRegexKind (language, kind, mode);	else	{		kindOption* const opt = langKindOption (language, kind);		if (opt != NULL)		{			opt->enabled = mode;			result = TRUE;		}	}	return result;}static void processLangKindOption (		const langType language, const char *const option,		const char *const parameter){	const char *p = parameter;	boolean mode = TRUE;	int c;	Assert (0 <= language  &&  language < (int) LanguageCount);	if (*p != '+'  &&  *p != '-')		disableLanguageKinds (language);	while ((c = *p++) != '\0') switch (c)	{		case '+': mode = TRUE;  break;		case '-': mode = FALSE; break;		default:			if (! enableLanguageKind (language, c, mode))				error (WARNING, "Unsupported parameter '%c' for --%s option",					c, option);			break;	}}extern boolean processKindOption (		const char *const option, const char *const parameter){	boolean handled = FALSE;	const char* const dash = strchr (option, '-');	if (dash != NULL  &&		(strcmp (dash + 1, "kinds") == 0  ||  strcmp (dash + 1, "types") == 0))	{		langType language;		vString* langName = vStringNew ();		vStringNCopyS (langName, option, dash - option);		language = getNamedLanguage (vStringValue (langName));		if (language == LANG_IGNORE)			error (WARNING, "Unknown language \"%s\" in \"%s\" option", vStringValue (langName), option);		else			processLangKindOption (language, option, parameter);		vStringDelete (langName);		handled = TRUE;	}	return handled;}static void printLanguageKind (const kindOption* const kind, boolean indent){	const char *const indentation = indent ? "    " : "";	printf ("%s%c  %s%s\n", indentation, kind->letter,		kind->description != NULL ? kind->description :			(kind->name != NULL ? kind->name : ""),		kind->enabled ? "" : " [off]");}static void printKinds (langType language, boolean indent){	const parserDefinition* lang;	Assert (0 <= language  &&  language < (int) LanguageCount);	lang = LanguageTable [language];	if (lang->kinds != NULL  ||  lang->regex)	{		unsigned int i;		for (i = 0  ;  i < lang->kindCount  ;  ++i)			printLanguageKind (lang->kinds + i, indent);		printRegexKinds (language, indent);	}}extern void printLanguageKinds (const langType language){	if (language == LANG_AUTO)	{		unsigned int i;		for (i = 0  ;  i < LanguageCount  ;  ++i)		{			const parserDefinition* const lang = LanguageTable [i];			printf ("%s%s\n", lang->name, lang->enabled ? "" : " [disabled]");			printKinds (i, TRUE);		}	}	else		printKinds (language, FALSE);}static void printMaps (const langType language){	const parserDefinition* lang;	unsigned int i;	Assert (0 <= language  &&  language < (int) LanguageCount);	lang = LanguageTable [language];	printf ("%-8s", lang->name);	if (lang->currentExtensions != NULL)		for (i = 0  ;  i < stringListCount (lang->currentExtensions)  ;  ++i)			printf (" *.%s", vStringValue (						stringListItem (lang->currentExtensions, i)));	if (lang->currentPatterns != NULL)		for (i = 0  ;  i < stringListCount (lang->currentPatterns)  ;  ++i)			printf (" %s", vStringValue (						stringListItem (lang->currentPatterns, i)));	putchar ('\n');}extern void printLanguageMaps (const langType language){	if (language == LANG_AUTO)	{		unsigned int i;		for (i = 0  ;  i < LanguageCount  ;  ++i)			printMaps (i);	}	else		printMaps (language);}static void printLanguage (const langType language){	const parserDefinition* lang;	Assert (0 <= language  &&  language < (int) LanguageCount);	lang = LanguageTable [language];	if (lang->kinds != NULL  ||  lang->regex)		printf ("%s%s\n", lang->name, lang->enabled ? "" : " [disabled]");}	    extern void printLanguageList (void){	unsigned int i;	for (i = 0  ;  i < LanguageCount  ;  ++i)		printLanguage (i);}/**   File parsing*/static void makeFileTag (const char *const fileName){	if (Option.include.fileNames)	{		tagEntryInfo tag;		initTagEntry (&tag, baseFilename (fileName));		tag.isFileEntry     = TRUE;		tag.lineNumberEntry = TRUE;		tag.lineNumber      = 1;		tag.kindName        = "file";		tag.kind            = 'F';		makeTagEntry (&tag);	}}static boolean createTagsForFile (		const char *const fileName, const langType language,		const unsigned int passCount){	boolean retried = FALSE;	Assert (0 <= language  &&  language < (int) LanguageCount);	if (fileOpen (fileName, language))	{		const parserDefinition* const lang = LanguageTable [language];		if (Option.etags)			beginEtagsFile ();		makeFileTag (fileName);		if (lang->parser != NULL)			lang->parser ();		else if (lang->parser2 != NULL)			retried = lang->parser2 (passCount);		if (Option.etags)			endEtagsFile (getSourceFileTagPath ());		fileClose ();	}	return retried;}static boolean createTagsWithFallback (		const char *const fileName, const langType language){	const unsigned long numTags	= TagFile.numTags.added;	fpos_t tagFilePosition;	unsigned int passCount = 0;	boolean tagFileResized = FALSE;	fgetpos (TagFile.fp, &tagFilePosition);	while (createTagsForFile (fileName, language, ++passCount))	{		/*  Restore prior state of tag file.		 */		fsetpos (TagFile.fp, &tagFilePosition);		TagFile.numTags.added = numTags;		tagFileResized = TRUE;	}	return tagFileResized;}extern boolean parseFile (const char *const fileName){	boolean tagFileResized = FALSE;	langType language = Option.language;	if (Option.language == LANG_AUTO)		language = getFileLanguage (fileName);	Assert (language != LANG_AUTO);	if (language == LANG_IGNORE)		verbose ("ignoring %s (unknown language)\n", fileName);	else if (! LanguageTable [language]->enabled)		verbose ("ignoring %s (language disabled)\n", fileName);	else	{		if (Option.filter)			openTagFile ();		tagFileResized = createTagsWithFallback (fileName, language);		if (Option.filter)			closeTagFile (tagFileResized);		addTotals (1, 0L, 0L);		return tagFileResized;	}	return tagFileResized;}/* vi:set tabstop=4 shiftwidth=4 nowrap: */

⌨️ 快捷键说明

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