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