xref: /Universal-ctags/main/writer.c (revision c0421c5ec596b5f2a3e1a16a61d6ee3368a68842)
15176f023SMasatake YAMATO /*
25176f023SMasatake YAMATO *   Copyright (c) 2016, Red Hat, Inc.
35176f023SMasatake YAMATO *   Copyright (c) 2016, Masatake YAMATO
45176f023SMasatake YAMATO *
55176f023SMasatake YAMATO *   This source code is released for free distribution under the terms of the
65176f023SMasatake YAMATO *   GNU General Public License version 2 or (at your option) any later version.
75176f023SMasatake YAMATO *
85176f023SMasatake YAMATO */
95176f023SMasatake YAMATO 
105176f023SMasatake YAMATO #include "general.h"
115d8cabe6SMasatake YAMATO 
125d8cabe6SMasatake YAMATO #include "debug.h"
138cbf052bSMasatake YAMATO #include "entry_p.h"
14a7ab3c61SMasatake YAMATO #include "options_p.h"
15285b4dfeSMasatake YAMATO #include "writer_p.h"
165176f023SMasatake YAMATO 
17039bc97fSMasatake YAMATO extern tagWriter uCtagsWriter;
186ccc5fc9SMasatake YAMATO extern tagWriter eCtagsWriter;
195176f023SMasatake YAMATO extern tagWriter etagsWriter;
205176f023SMasatake YAMATO extern tagWriter xrefWriter;
215176f023SMasatake YAMATO extern tagWriter jsonWriter;
225176f023SMasatake YAMATO 
23cb9018caSMasatake YAMATO static tagWriter *writerTable [WRITER_COUNT] = {
24039bc97fSMasatake YAMATO 	[WRITER_U_CTAGS] = &uCtagsWriter,
25039bc97fSMasatake YAMATO 	[WRITER_E_CTAGS] = &eCtagsWriter,
26670c2f83SMasatake YAMATO 	[WRITER_ETAGS] = &etagsWriter,
27670c2f83SMasatake YAMATO 	[WRITER_XREF]  = &xrefWriter,
28670c2f83SMasatake YAMATO 	[WRITER_JSON]  = &jsonWriter,
29d7738cbeSMasatake YAMATO 	[WRITER_CUSTOM] = NULL,
305176f023SMasatake YAMATO };
315176f023SMasatake YAMATO 
325176f023SMasatake YAMATO static tagWriter *writer;
335176f023SMasatake YAMATO 
setTagWriter(writerType wtype,tagWriter * customWriter)34d7738cbeSMasatake YAMATO extern void setTagWriter (writerType wtype, tagWriter *customWriter)
355176f023SMasatake YAMATO {
36d7738cbeSMasatake YAMATO 	if (wtype != WRITER_CUSTOM)
37cb9018caSMasatake YAMATO 		writer = writerTable [wtype];
38d7738cbeSMasatake YAMATO 	else
39d7738cbeSMasatake YAMATO 		writer = customWriter;
40cb9018caSMasatake YAMATO 	writer->type = wtype;
415176f023SMasatake YAMATO }
425176f023SMasatake YAMATO 
writerSetup(MIO * mio,void * clientData)435053d6adSMasatake YAMATO extern void writerSetup (MIO *mio, void *clientData)
445176f023SMasatake YAMATO {
455053d6adSMasatake YAMATO 	writer->clientData = clientData;
465053d6adSMasatake YAMATO 
475176f023SMasatake YAMATO 	if (writer->preWriteEntry)
485053d6adSMasatake YAMATO 		writer->private = writer->preWriteEntry (writer, mio,
495053d6adSMasatake YAMATO 												 writer->clientData);
505176f023SMasatake YAMATO 	else
510479e0a2SMasatake YAMATO 		writer->private = NULL;
525176f023SMasatake YAMATO }
535176f023SMasatake YAMATO 
writerTeardown(MIO * mio,const char * filename)54975c73faSMasatake YAMATO extern bool writerTeardown (MIO *mio, const char *filename)
555176f023SMasatake YAMATO {
565176f023SMasatake YAMATO 	if (writer->postWriteEntry)
575176f023SMasatake YAMATO 	{
58975c73faSMasatake YAMATO 		bool r;
595053d6adSMasatake YAMATO 		r = writer->postWriteEntry (writer, mio, filename,
605053d6adSMasatake YAMATO 									writer->clientData);
610479e0a2SMasatake YAMATO 		writer->private = NULL;
62975c73faSMasatake YAMATO 		return r;
635176f023SMasatake YAMATO 	}
64975c73faSMasatake YAMATO 	return false;
655176f023SMasatake YAMATO }
665176f023SMasatake YAMATO 
writerWriteTag(MIO * mio,const tagEntryInfo * const tag)675176f023SMasatake YAMATO extern int writerWriteTag (MIO * mio, const tagEntryInfo *const tag)
685176f023SMasatake YAMATO {
695053d6adSMasatake YAMATO 	return writer->writeEntry (writer, mio, tag,
705053d6adSMasatake YAMATO 							   writer->clientData);
715176f023SMasatake YAMATO }
725176f023SMasatake YAMATO 
writerWritePtag(MIO * mio,const ptagDesc * desc,const char * const fileName,const char * const pattern,const char * const parserName)735176f023SMasatake YAMATO extern int writerWritePtag (MIO * mio,
745176f023SMasatake YAMATO 					 const ptagDesc *desc,
755176f023SMasatake YAMATO 					 const char *const fileName,
765176f023SMasatake YAMATO 					 const char *const pattern,
775176f023SMasatake YAMATO 					 const char *const parserName)
785176f023SMasatake YAMATO {
795176f023SMasatake YAMATO 	if (writer->writePtagEntry == NULL)
805176f023SMasatake YAMATO 		return -1;
815176f023SMasatake YAMATO 
820925aa59SMasatake YAMATO 	return writer->writePtagEntry (writer, mio, desc, fileName,
835053d6adSMasatake YAMATO 								   pattern, parserName,
845053d6adSMasatake YAMATO 								   writer->clientData);
855176f023SMasatake YAMATO 
865176f023SMasatake YAMATO }
872232c45bSMasatake YAMATO 
writerRescanFailed(unsigned long validTagNum)8867d1f12fSJiří Techet extern void writerRescanFailed (unsigned long validTagNum)
8967d1f12fSJiří Techet {
9067d1f12fSJiří Techet 	if (writer->rescanFailedEntry)
9167d1f12fSJiří Techet 		writer->rescanFailedEntry(writer, validTagNum, writer->clientData);
9267d1f12fSJiří Techet }
9367d1f12fSJiří Techet 
ptagMakeCtagsOutputMode(ptagDesc * desc,langType langType CTAGS_ATTR_UNUSED,const void * data CTAGS_ATTR_UNUSED)94aa53c961SMasatake YAMATO extern bool ptagMakeCtagsOutputMode (ptagDesc *desc, langType langType CTAGS_ATTR_UNUSED,
95aa53c961SMasatake YAMATO 									 const void *data CTAGS_ATTR_UNUSED)
96039bc97fSMasatake YAMATO {
97039bc97fSMasatake YAMATO 	const char *mode ="";
98039bc97fSMasatake YAMATO 
99039bc97fSMasatake YAMATO 	if (&uCtagsWriter == writer)
100039bc97fSMasatake YAMATO 		mode = "u-ctags";
101039bc97fSMasatake YAMATO 	else if (&eCtagsWriter == writer)
102039bc97fSMasatake YAMATO 		mode = "e-ctags";
103039bc97fSMasatake YAMATO 
104039bc97fSMasatake YAMATO 	return writePseudoTag (desc,
105039bc97fSMasatake YAMATO 						   mode,
106039bc97fSMasatake YAMATO 						   "u-ctags or e-ctags",
107039bc97fSMasatake YAMATO 						   NULL);
108039bc97fSMasatake YAMATO }
109039bc97fSMasatake YAMATO 
outputDefaultFileName(void)1104b7a1543SMasatake YAMATO extern const char *outputDefaultFileName (void)
1114b7a1543SMasatake YAMATO {
1124b7a1543SMasatake YAMATO 	return writer->defaultFileName;
1134b7a1543SMasatake YAMATO }
1144b7a1543SMasatake YAMATO 
writerCanPrintPtag(void)11563570e0cSMasatake YAMATO extern bool writerCanPrintPtag (void)
11663570e0cSMasatake YAMATO {
11763570e0cSMasatake YAMATO 	return (writer->writePtagEntry)? true: false;
11863570e0cSMasatake YAMATO }
1198182f840SMasatake YAMATO 
writerDoesTreatFieldAsFixed(int fieldType)1208182f840SMasatake YAMATO extern bool writerDoesTreatFieldAsFixed (int fieldType)
1218182f840SMasatake YAMATO {
1228182f840SMasatake YAMATO 	if (writer->treatFieldAsFixed)
1238182f840SMasatake YAMATO 		return writer->treatFieldAsFixed (fieldType);
1248182f840SMasatake YAMATO 	return false;
1258182f840SMasatake YAMATO }
126f4904b13SMasatake YAMATO 
127f4904b13SMasatake YAMATO #ifdef WIN32
getFilenameSeparator(enum filenameSepOp currentSetting)128f4904b13SMasatake YAMATO extern enum filenameSepOp getFilenameSeparator (enum filenameSepOp currentSetting)
129f4904b13SMasatake YAMATO {
130f4904b13SMasatake YAMATO 	if (writer->overrideFilenameSeparator)
131f4904b13SMasatake YAMATO 		return writer->overrideFilenameSeparator (currentSetting);
132f4904b13SMasatake YAMATO 	return currentSetting;
133f4904b13SMasatake YAMATO }
134f4904b13SMasatake YAMATO #endif
135a7ab3c61SMasatake YAMATO 
ptagMakeCtagsOutputFilesep(ptagDesc * desc,langType language CTAGS_ATTR_UNUSED,const void * data)136aa53c961SMasatake YAMATO extern bool ptagMakeCtagsOutputFilesep (ptagDesc *desc,
137aa53c961SMasatake YAMATO 										langType language CTAGS_ATTR_UNUSED,
138aa53c961SMasatake YAMATO 										const void *data)
139a7ab3c61SMasatake YAMATO {
140a7ab3c61SMasatake YAMATO 	const char *sep = "slash";
141a7ab3c61SMasatake YAMATO #ifdef WIN32
142a7ab3c61SMasatake YAMATO 	const optionValues *opt = data;
143a7ab3c61SMasatake YAMATO 	if (getFilenameSeparator (opt->useSlashAsFilenameSeparator)
144a7ab3c61SMasatake YAMATO 		!= FILENAME_SEP_USE_SLASH)
145a7ab3c61SMasatake YAMATO 		sep = "backslash";
146a7ab3c61SMasatake YAMATO #endif
147a7ab3c61SMasatake YAMATO 	return writePseudoTag (desc, sep, "slash or backslash", NULL);
148a7ab3c61SMasatake YAMATO }
1498701f822SMasatake YAMATO 
ptagMakeCtagsOutputExcmd(ptagDesc * desc,langType language CTAGS_ATTR_UNUSED,const void * data)1505d8cabe6SMasatake YAMATO extern bool ptagMakeCtagsOutputExcmd (ptagDesc *desc,
1515d8cabe6SMasatake YAMATO 									  langType language CTAGS_ATTR_UNUSED,
1525d8cabe6SMasatake YAMATO 									  const void *data)
1535d8cabe6SMasatake YAMATO {
1545d8cabe6SMasatake YAMATO 	const char *excmd;
1555d8cabe6SMasatake YAMATO 	const optionValues *opt = data;
1565d8cabe6SMasatake YAMATO 	switch (opt->locate)
1575d8cabe6SMasatake YAMATO 	{
1585d8cabe6SMasatake YAMATO 	case EX_MIX:
1595d8cabe6SMasatake YAMATO 		excmd = "mixed";
1605d8cabe6SMasatake YAMATO 		break;
1615d8cabe6SMasatake YAMATO 	case EX_LINENUM:
1625d8cabe6SMasatake YAMATO 		excmd = "number";
1635d8cabe6SMasatake YAMATO 		break;
1645d8cabe6SMasatake YAMATO 	case EX_PATTERN:
1655d8cabe6SMasatake YAMATO 		excmd = "pattern";
1665d8cabe6SMasatake YAMATO 		break;
1675d8cabe6SMasatake YAMATO 	case EX_COMBINE:
1684a9f00a1SAmaiKinono 		excmd = "combineV2";
1695d8cabe6SMasatake YAMATO 		break;
1705d8cabe6SMasatake YAMATO 	default:
1715d8cabe6SMasatake YAMATO 		AssertNotReached ();
1725d8cabe6SMasatake YAMATO 		excmd = "bug!";
1735d8cabe6SMasatake YAMATO 		break;
1745d8cabe6SMasatake YAMATO 	}
1755d8cabe6SMasatake YAMATO 	return writePseudoTag (desc, excmd,
1764a9f00a1SAmaiKinono 						   "number, pattern, mixed, or combineV2",
1775d8cabe6SMasatake YAMATO 						   NULL);
1785d8cabe6SMasatake YAMATO }
1795d8cabe6SMasatake YAMATO 
writerCheckOptions(bool fieldsWereReset)180*c0421c5eSMasatake YAMATO extern void writerCheckOptions (bool fieldsWereReset)
1818701f822SMasatake YAMATO {
1828701f822SMasatake YAMATO 	if (writer->checkOptions)
183*c0421c5eSMasatake YAMATO 		writer->checkOptions (writer, fieldsWereReset);
1848701f822SMasatake YAMATO }
185b9636b4dSMasatake YAMATO 
writerPrintPtagByDefault(void)186b9636b4dSMasatake YAMATO extern bool writerPrintPtagByDefault (void)
187b9636b4dSMasatake YAMATO {
188b9636b4dSMasatake YAMATO 	return writer->printPtagByDefault;
189b9636b4dSMasatake YAMATO }
190