xref: /Universal-ctags/main/writer-xref.c (revision b9636b4db0e6c3e3f42ed1bd4be16b5c270315eb)
15176f023SMasatake YAMATO /*
25176f023SMasatake YAMATO *   Copyright (c) 1998-2002, Darren Hiebert
35176f023SMasatake YAMATO *
45176f023SMasatake YAMATO *   This source code is released for free distribution under the terms of the
55176f023SMasatake YAMATO *   GNU General Public License version 2 or (at your option) any later version.
65176f023SMasatake YAMATO *
75176f023SMasatake YAMATO *   External interface to entry.c
85176f023SMasatake YAMATO */
95176f023SMasatake YAMATO 
105176f023SMasatake YAMATO #include "general.h"  /* must always come first */
115176f023SMasatake YAMATO 
125176f023SMasatake YAMATO #include "entry.h"
13c08c70d0SMasatake YAMATO #include "field_p.h"
14d45725c1SMasatake YAMATO #include "fmt_p.h"
155176f023SMasatake YAMATO #include "mio.h"
1621996d92SMasatake YAMATO #include "options_p.h"
17*b9636b4dSMasatake YAMATO #include "ptag_p.h"
18285b4dfeSMasatake YAMATO #include "writer_p.h"
195176f023SMasatake YAMATO 
20*b9636b4dSMasatake YAMATO #include <string.h>
21*b9636b4dSMasatake YAMATO 
225176f023SMasatake YAMATO 
230925aa59SMasatake YAMATO static int writeXrefEntry  (tagWriter *writer CTAGS_ATTR_UNUSED,
245053d6adSMasatake YAMATO 							MIO * mio, const tagEntryInfo *const tag,
255053d6adSMasatake YAMATO 							void *clientData CTAGS_ATTR_UNUSED);
26*b9636b4dSMasatake YAMATO static int writeXrefPtagEntry (tagWriter *writer, MIO * mio, const ptagDesc *desc,
27*b9636b4dSMasatake YAMATO 							   const char *const fileName,
28*b9636b4dSMasatake YAMATO 							   const char *const pattern,
29*b9636b4dSMasatake YAMATO 							   const char *const parserName,
30*b9636b4dSMasatake YAMATO 							   void *clientData);
315176f023SMasatake YAMATO 
325176f023SMasatake YAMATO tagWriter xrefWriter = {
335176f023SMasatake YAMATO 	.writeEntry = writeXrefEntry,
34*b9636b4dSMasatake YAMATO 	.writePtagEntry = writeXrefPtagEntry,
35*b9636b4dSMasatake YAMATO 	.printPtagByDefault = false,
365176f023SMasatake YAMATO 	.preWriteEntry = NULL,
375176f023SMasatake YAMATO 	.postWriteEntry = NULL,
3867d1f12fSJiří Techet 	.rescanFailedEntry = NULL,
398182f840SMasatake YAMATO 	.treatFieldAsFixed = NULL,
404b7a1543SMasatake YAMATO 	.defaultFileName = NULL,
415176f023SMasatake YAMATO };
425176f023SMasatake YAMATO 
writeXrefPtagEntry(tagWriter * writer,MIO * mio,const ptagDesc * desc,const char * const fileName,const char * const pattern,const char * const parserName,void * clientData)43*b9636b4dSMasatake YAMATO static int writeXrefPtagEntry (tagWriter *writer, MIO * mio, const ptagDesc *desc,
44*b9636b4dSMasatake YAMATO 							   const char *const fileName,
45*b9636b4dSMasatake YAMATO 							   const char *const pattern,
46*b9636b4dSMasatake YAMATO 							   const char *const parserName,
47*b9636b4dSMasatake YAMATO 							   void *clientData)
48*b9636b4dSMasatake YAMATO {
49*b9636b4dSMasatake YAMATO 	tagEntryInfo e;
50*b9636b4dSMasatake YAMATO 	vString *name = vStringNewInit(PSEUDO_TAG_PREFIX);
51*b9636b4dSMasatake YAMATO 
52*b9636b4dSMasatake YAMATO 	memset (&e, 0, sizeof(e));
53*b9636b4dSMasatake YAMATO 
54*b9636b4dSMasatake YAMATO 	e.isPseudoTag = 1;
55*b9636b4dSMasatake YAMATO 
56*b9636b4dSMasatake YAMATO 	vStringCatS (name, desc->name);
57*b9636b4dSMasatake YAMATO 	if (parserName)
58*b9636b4dSMasatake YAMATO 	{
59*b9636b4dSMasatake YAMATO 		vStringCatS (name, PSEUDO_TAG_SEPARATOR);
60*b9636b4dSMasatake YAMATO 		vStringCatS (name, parserName);
61*b9636b4dSMasatake YAMATO 	}
62*b9636b4dSMasatake YAMATO 	e.name = vStringValue (name);
63*b9636b4dSMasatake YAMATO 	e.inputFileName = fileName;
64*b9636b4dSMasatake YAMATO 	e.pattern = pattern;
65*b9636b4dSMasatake YAMATO 
66*b9636b4dSMasatake YAMATO 	int length = writeXrefEntry (writer, mio, &e, clientData);
67*b9636b4dSMasatake YAMATO 
68*b9636b4dSMasatake YAMATO 	vStringDelete (name);
69*b9636b4dSMasatake YAMATO 
70*b9636b4dSMasatake YAMATO 	return length;
71*b9636b4dSMasatake YAMATO }
72*b9636b4dSMasatake YAMATO 
writeXrefEntry(tagWriter * writer CTAGS_ATTR_UNUSED,MIO * mio,const tagEntryInfo * const tag,void * clientData CTAGS_ATTR_UNUSED)730925aa59SMasatake YAMATO static int writeXrefEntry (tagWriter *writer CTAGS_ATTR_UNUSED,
745053d6adSMasatake YAMATO 						   MIO * mio, const tagEntryInfo *const tag,
755053d6adSMasatake YAMATO 						   void *clientData CTAGS_ATTR_UNUSED)
765176f023SMasatake YAMATO {
775176f023SMasatake YAMATO 	int length;
785176f023SMasatake YAMATO 	static fmtElement *fmt1;
795176f023SMasatake YAMATO 	static fmtElement *fmt2;
805176f023SMasatake YAMATO 
815176f023SMasatake YAMATO 	if (Option.customXfmt)
825176f023SMasatake YAMATO 		length = fmtPrint (Option.customXfmt, mio, tag);
835176f023SMasatake YAMATO 	else
845176f023SMasatake YAMATO 	{
855176f023SMasatake YAMATO 		if (tag->isFileEntry)
865176f023SMasatake YAMATO 			return 0;
875176f023SMasatake YAMATO 
885176f023SMasatake YAMATO 		if (Option.tagFileFormat == 1)
895176f023SMasatake YAMATO 		{
905176f023SMasatake YAMATO 			if (fmt1 == NULL)
915176f023SMasatake YAMATO 				fmt1 = fmtNew ("%-16N %4n %-16F %C");
925176f023SMasatake YAMATO 			length = fmtPrint (fmt1, mio, tag);
935176f023SMasatake YAMATO 		}
945176f023SMasatake YAMATO 		else
955176f023SMasatake YAMATO 		{
965176f023SMasatake YAMATO 			if (fmt2 == NULL)
975176f023SMasatake YAMATO 				fmt2 = fmtNew ("%-16N %-10K %4n %-16F %C");
985176f023SMasatake YAMATO 			length = fmtPrint (fmt2, mio, tag);
995176f023SMasatake YAMATO 		}
1005176f023SMasatake YAMATO 	}
1015176f023SMasatake YAMATO 
1025176f023SMasatake YAMATO 	mio_putc (mio, '\n');
1035176f023SMasatake YAMATO 	length++;
1045176f023SMasatake YAMATO 
1055176f023SMasatake YAMATO 	return length;
1065176f023SMasatake YAMATO }
107