xref: /Universal-ctags/main/ptag.c (revision cea85fadf7cf99e1279d706fe757df84f4730426)
19e21fd2fSMasatake YAMATO /*
29e21fd2fSMasatake YAMATO  *
39e21fd2fSMasatake YAMATO  *  Copyright (c) 1996-2002, Darren Hiebert
49e21fd2fSMasatake YAMATO  *  Copyright (c) 2016, Red Hat, Inc.
59e21fd2fSMasatake YAMATO  *  Copyright (c) 2016, Masatake YAMATO
69e21fd2fSMasatake YAMATO  *
79e21fd2fSMasatake YAMATO  *  Author: Masatake YAMATO <yamato@redhat.com>
89e21fd2fSMasatake YAMATO  *
99e21fd2fSMasatake YAMATO  *   This source code is released for free distribution under the terms of the
109e21fd2fSMasatake YAMATO  *   GNU General Public License version 2 or (at your option) any later version.
119e21fd2fSMasatake YAMATO  *
129e21fd2fSMasatake YAMATO  */
139e21fd2fSMasatake YAMATO 
149e21fd2fSMasatake YAMATO #include "general.h"  /* must always come first */
159e21fd2fSMasatake YAMATO 
16c2a93c9fSMasatake YAMATO #include "colprint_p.h"
179e21fd2fSMasatake YAMATO #include "ctags.h"
189e21fd2fSMasatake YAMATO #include "debug.h"
198cbf052bSMasatake YAMATO #include "entry_p.h"
2021996d92SMasatake YAMATO #include "options_p.h"
210d502ef0SMasatake YAMATO #include "parse_p.h"
220d81da14SMasatake YAMATO #include "ptag_p.h"
233692a8c5SMasatake YAMATO #include "routines_p.h"
24285b4dfeSMasatake YAMATO #include "writer_p.h"
25d1c41d33SMasatake YAMATO #include <string.h>
26d1c41d33SMasatake YAMATO 
279e21fd2fSMasatake YAMATO 
ptagMakeFormat(ptagDesc * desc,langType language CTAGS_ATTR_UNUSED,const void * data CTAGS_ATTR_UNUSED)28aa53c961SMasatake YAMATO static bool ptagMakeFormat (ptagDesc *desc, langType language CTAGS_ATTR_UNUSED,
29aa53c961SMasatake YAMATO 							const void *data CTAGS_ATTR_UNUSED)
309e21fd2fSMasatake YAMATO {
319e21fd2fSMasatake YAMATO 	char format [11];
329e21fd2fSMasatake YAMATO 	const char *formatComment = "unknown format";
3389835ba0SMasatake YAMATO 	const optionValues *opt = data;
349e21fd2fSMasatake YAMATO 
3589835ba0SMasatake YAMATO 	sprintf (format, "%u", opt->tagFileFormat);
3689835ba0SMasatake YAMATO 	if (opt->tagFileFormat == 1)
379e21fd2fSMasatake YAMATO 		formatComment = "original ctags format";
3889835ba0SMasatake YAMATO 	else if (opt->tagFileFormat == 2)
399e21fd2fSMasatake YAMATO 		formatComment =
409e21fd2fSMasatake YAMATO 			"extended format; --format=1 will not append ;\" to lines";
41ab9fd29dSMasatake YAMATO 	return writePseudoTag (desc, format, formatComment, NULL);
429e21fd2fSMasatake YAMATO }
439e21fd2fSMasatake YAMATO 
ptagMakeHowSorted(ptagDesc * desc,langType language CTAGS_ATTR_UNUSED,const void * data CTAGS_ATTR_UNUSED)44aa53c961SMasatake YAMATO static bool ptagMakeHowSorted (ptagDesc *desc, langType language CTAGS_ATTR_UNUSED,
45aa53c961SMasatake YAMATO 							   const void *data CTAGS_ATTR_UNUSED)
469e21fd2fSMasatake YAMATO {
4789835ba0SMasatake YAMATO 	const optionValues *opt = data;
48ab9fd29dSMasatake YAMATO 	return writePseudoTag (desc,
4989835ba0SMasatake YAMATO 			       opt->sorted == SO_FOLDSORTED ? "2" :
5089835ba0SMasatake YAMATO 			       (opt->sorted == SO_SORTED ? "1" : "0"),
519e21fd2fSMasatake YAMATO 			       "0=unsorted, 1=sorted, 2=foldcase",
529e21fd2fSMasatake YAMATO 			       NULL);
539e21fd2fSMasatake YAMATO }
549e21fd2fSMasatake YAMATO 
ptagMakeAuthor(ptagDesc * desc,langType language CTAGS_ATTR_UNUSED,const void * data CTAGS_ATTR_UNUSED)55aa53c961SMasatake YAMATO static bool ptagMakeAuthor (ptagDesc *desc, langType language CTAGS_ATTR_UNUSED,
56aa53c961SMasatake YAMATO 							const void *data CTAGS_ATTR_UNUSED)
579e21fd2fSMasatake YAMATO {
58ab9fd29dSMasatake YAMATO 	return writePseudoTag (desc,
599e21fd2fSMasatake YAMATO 						   AUTHOR_NAME,  "", NULL);
609e21fd2fSMasatake YAMATO }
619e21fd2fSMasatake YAMATO 
ptagMakeProgName(ptagDesc * desc,langType language CTAGS_ATTR_UNUSED,const void * data CTAGS_ATTR_UNUSED)62aa53c961SMasatake YAMATO static bool ptagMakeProgName (ptagDesc *desc, langType language CTAGS_ATTR_UNUSED,
63aa53c961SMasatake YAMATO 							  const void *data CTAGS_ATTR_UNUSED)
649e21fd2fSMasatake YAMATO {
65ab9fd29dSMasatake YAMATO 	return writePseudoTag (desc,
669e21fd2fSMasatake YAMATO 						   PROGRAM_NAME,  "Derived from Exuberant Ctags", NULL);
679e21fd2fSMasatake YAMATO }
689e21fd2fSMasatake YAMATO 
ptagMakeProgURL(ptagDesc * desc,langType language CTAGS_ATTR_UNUSED,const void * data CTAGS_ATTR_UNUSED)69aa53c961SMasatake YAMATO static bool ptagMakeProgURL (ptagDesc *desc, langType language CTAGS_ATTR_UNUSED,
70aa53c961SMasatake YAMATO 							 const void *data CTAGS_ATTR_UNUSED)
719e21fd2fSMasatake YAMATO {
72ab9fd29dSMasatake YAMATO 	return writePseudoTag (desc,
739e21fd2fSMasatake YAMATO 						   PROGRAM_URL, "official site", NULL);
749e21fd2fSMasatake YAMATO }
759e21fd2fSMasatake YAMATO 
ptagMakeProgVersion(ptagDesc * desc,langType language CTAGS_ATTR_UNUSED,const void * data CTAGS_ATTR_UNUSED)76aa53c961SMasatake YAMATO static bool ptagMakeProgVersion (ptagDesc *desc, langType language CTAGS_ATTR_UNUSED,
77aa53c961SMasatake YAMATO 								 const void *data CTAGS_ATTR_UNUSED)
789e21fd2fSMasatake YAMATO {
799e21fd2fSMasatake YAMATO 	const char* repoinfo = ctags_repoinfo? ctags_repoinfo: "";
80ab9fd29dSMasatake YAMATO 	return writePseudoTag (desc, PROGRAM_VERSION, repoinfo, NULL);
819e21fd2fSMasatake YAMATO }
829e21fd2fSMasatake YAMATO 
839e21fd2fSMasatake YAMATO #ifdef HAVE_ICONV
ptagMakeFileEncoding(ptagDesc * desc,langType language CTAGS_ATTR_UNUSED,const void * data)84aa53c961SMasatake YAMATO static bool ptagMakeFileEncoding (ptagDesc *desc, langType language CTAGS_ATTR_UNUSED,
85aa53c961SMasatake YAMATO 								  const void *data)
869e21fd2fSMasatake YAMATO {
8789835ba0SMasatake YAMATO 	const optionValues *opt = data;
8889835ba0SMasatake YAMATO 	if (! opt->outputEncoding)
89ce990805SThomas Braun 		return false;
909e21fd2fSMasatake YAMATO 
9189835ba0SMasatake YAMATO 	return writePseudoTag (desc, opt->outputEncoding, "", NULL);
929e21fd2fSMasatake YAMATO }
939e21fd2fSMasatake YAMATO #endif
949e21fd2fSMasatake YAMATO 
ptagMakeKindSeparators(ptagDesc * desc,langType language,const void * data CTAGS_ATTR_UNUSED)95aa53c961SMasatake YAMATO static bool ptagMakeKindSeparators (ptagDesc *desc, langType language,
96aa53c961SMasatake YAMATO 									const void *data CTAGS_ATTR_UNUSED)
97ce8d2e8fSMasatake YAMATO {
98aa53c961SMasatake YAMATO 	return makeKindSeparatorsPseudoTags (language, desc);
99e362e918SMasatake YAMATO }
100e362e918SMasatake YAMATO 
ptagMakeKindDescriptions(ptagDesc * desc,langType language,const void * data CTAGS_ATTR_UNUSED)101aa53c961SMasatake YAMATO static bool ptagMakeKindDescriptions (ptagDesc *desc, langType language,
102aa53c961SMasatake YAMATO 									  const void *data CTAGS_ATTR_UNUSED)
103e362e918SMasatake YAMATO {
104aa53c961SMasatake YAMATO 	return makeKindDescriptionsPseudoTags (language, desc);
105ce8d2e8fSMasatake YAMATO }
106ce8d2e8fSMasatake YAMATO 
ptagMakeFieldDescriptions(ptagDesc * desc,langType language,const void * data CTAGS_ATTR_UNUSED)1079ab0e076SMasatake YAMATO static bool ptagMakeFieldDescriptions (ptagDesc *desc, langType language,
1089ab0e076SMasatake YAMATO 									   const void *data CTAGS_ATTR_UNUSED)
1099ab0e076SMasatake YAMATO {
1109ab0e076SMasatake YAMATO 	return makeFieldDescriptionsPseudoTags (language, desc);
1119ab0e076SMasatake YAMATO }
1129ab0e076SMasatake YAMATO 
ptagMakeExtraDescriptions(ptagDesc * desc,langType language,const void * data CTAGS_ATTR_UNUSED)113726cac0cSMasatake YAMATO static bool ptagMakeExtraDescriptions (ptagDesc *desc, langType language,
114726cac0cSMasatake YAMATO 									   const void *data CTAGS_ATTR_UNUSED)
115726cac0cSMasatake YAMATO {
116726cac0cSMasatake YAMATO 	return makeExtraDescriptionsPseudoTags (language, desc);
117726cac0cSMasatake YAMATO }
118726cac0cSMasatake YAMATO 
ptagMakeRoleDescriptions(ptagDesc * desc,langType language,const void * data CTAGS_ATTR_UNUSED)119*cea85fadSMasatake YAMATO static bool ptagMakeRoleDescriptions (ptagDesc *desc, langType language,
120*cea85fadSMasatake YAMATO 									  const void *data CTAGS_ATTR_UNUSED)
121*cea85fadSMasatake YAMATO {
122*cea85fadSMasatake YAMATO 	return makeRoleDescriptionsPseudoTags (language, desc);
123*cea85fadSMasatake YAMATO }
124*cea85fadSMasatake YAMATO 
ptagMakeProcCwd(ptagDesc * desc,langType language,const void * data CTAGS_ATTR_UNUSED)1253692a8c5SMasatake YAMATO static bool ptagMakeProcCwd (ptagDesc *desc, langType language,
1263692a8c5SMasatake YAMATO 									   const void *data CTAGS_ATTR_UNUSED)
1273692a8c5SMasatake YAMATO {
1283692a8c5SMasatake YAMATO 	return writePseudoTag (desc, CurrentDirectory, "", NULL);
1293692a8c5SMasatake YAMATO }
1303692a8c5SMasatake YAMATO 
1319e21fd2fSMasatake YAMATO static ptagDesc ptagDescs [] = {
13277e46e68SMasatake YAMATO 	{
13377e46e68SMasatake YAMATO 	  /* The prefix is not "TAG_".
13477e46e68SMasatake YAMATO 	     Only --output-format=json use this ptag. */
135ce990805SThomas Braun 	  false, "JSON_OUTPUT_VERSION",
13677e46e68SMasatake YAMATO 	  "the version of json output stream format",
13777e46e68SMasatake YAMATO 	  ptagMakeJsonOutputVersion,
1389c9dd99bSMasatake YAMATO 	  PTAGF_COMMON },
139ce990805SThomas Braun 	{ true, "TAG_FILE_FORMAT",
1409e21fd2fSMasatake YAMATO 	  "the version of tags file format",
141785713bbSMasatake YAMATO 	  ptagMakeFormat,
1429c9dd99bSMasatake YAMATO 	  PTAGF_COMMON },
143ce990805SThomas Braun 	{ true, "TAG_FILE_SORTED",
1449e21fd2fSMasatake YAMATO 	  "how tags are sorted",
145785713bbSMasatake YAMATO 	  ptagMakeHowSorted,
1469c9dd99bSMasatake YAMATO 	  PTAGF_COMMON },
147ce990805SThomas Braun 	{ true, "TAG_PROGRAM_AUTHOR",
1489e21fd2fSMasatake YAMATO 	  "the author of this ctags implementation",
149785713bbSMasatake YAMATO 	  ptagMakeAuthor,
1509c9dd99bSMasatake YAMATO 	  PTAGF_COMMON },
151ce990805SThomas Braun 	{ true, "TAG_PROGRAM_NAME",
1529e21fd2fSMasatake YAMATO 	  "the name of this ctags implementation",
153785713bbSMasatake YAMATO 	  ptagMakeProgName,
1549c9dd99bSMasatake YAMATO 	  PTAGF_COMMON },
155ce990805SThomas Braun 	{ true, "TAG_PROGRAM_URL",
1569e21fd2fSMasatake YAMATO 	  "the official site URL of this ctags implementation",
157785713bbSMasatake YAMATO 	  ptagMakeProgURL,
1589c9dd99bSMasatake YAMATO 	  PTAGF_COMMON },
159ce990805SThomas Braun 	{ true, "TAG_PROGRAM_VERSION",
1609e21fd2fSMasatake YAMATO 	  "the version of this ctags implementation",
161785713bbSMasatake YAMATO 	  ptagMakeProgVersion,
1629c9dd99bSMasatake YAMATO 	  PTAGF_COMMON },
1639e21fd2fSMasatake YAMATO #ifdef HAVE_ICONV
164ce990805SThomas Braun 	{ true, "TAG_FILE_ENCODING",
1659e21fd2fSMasatake YAMATO 	  "the encoding used in output tags file",
166785713bbSMasatake YAMATO 	  ptagMakeFileEncoding,
1679c9dd99bSMasatake YAMATO 	  PTAGF_COMMON },
1689e21fd2fSMasatake YAMATO #endif
169ce990805SThomas Braun 	{ false, "TAG_KIND_SEPARATOR",
170ce8d2e8fSMasatake YAMATO 	  "the separators used in kinds",
171ce8d2e8fSMasatake YAMATO 	  ptagMakeKindSeparators,
1729c9dd99bSMasatake YAMATO 	  PTAGF_PARSER },
173ce990805SThomas Braun 	{ false, "TAG_KIND_DESCRIPTION",
174fd0af0cfSMasatake YAMATO 	  "the letters, names and descriptions of enabled kinds in the language",
175e362e918SMasatake YAMATO 	  ptagMakeKindDescriptions,
1769c9dd99bSMasatake YAMATO 	  PTAGF_PARSER },
1779ab0e076SMasatake YAMATO 	{ false, "TAG_FIELD_DESCRIPTION",
1789ab0e076SMasatake YAMATO 	  "the names and descriptions of enabled fields",
1799ab0e076SMasatake YAMATO 	  ptagMakeFieldDescriptions,
1809c9dd99bSMasatake YAMATO 	  PTAGF_COMMON|PTAGF_PARSER },
181726cac0cSMasatake YAMATO 	{ false, "TAG_EXTRA_DESCRIPTION",
182726cac0cSMasatake YAMATO 	  "the names and descriptions of enabled extras",
183726cac0cSMasatake YAMATO 	  ptagMakeExtraDescriptions,
1849c9dd99bSMasatake YAMATO 	  PTAGF_COMMON|PTAGF_PARSER },
185*cea85fadSMasatake YAMATO 	{ false, "TAG_ROLE_DESCRIPTION",
186*cea85fadSMasatake YAMATO 	  "the names and descriptions of enabled roles",
187*cea85fadSMasatake YAMATO 	  ptagMakeRoleDescriptions,
188*cea85fadSMasatake YAMATO 	  PTAGF_PARSER },
189039bc97fSMasatake YAMATO 	{ true, "TAG_OUTPUT_MODE",
190039bc97fSMasatake YAMATO 	  "the output mode: u-ctags or e-ctags",
191039bc97fSMasatake YAMATO 	  ptagMakeCtagsOutputMode,
1929c9dd99bSMasatake YAMATO 	  PTAGF_COMMON },
193a7ab3c61SMasatake YAMATO 	{ true, "TAG_OUTPUT_FILESEP",
194a7ab3c61SMasatake YAMATO 	  "the separator used in file name (slash or backslash)",
195a7ab3c61SMasatake YAMATO 	  ptagMakeCtagsOutputFilesep,
1969c9dd99bSMasatake YAMATO 	  PTAGF_COMMON },
19739da75bcSMasatake YAMATO 	{ true, "TAG_PATTERN_LENGTH_LIMIT",
19839da75bcSMasatake YAMATO 	  "the limit of pattern length",
19939da75bcSMasatake YAMATO 	  ptagMakePatternLengthLimit,
2009c9dd99bSMasatake YAMATO 	  PTAGF_COMMON },
2010ee87767SMasatake YAMATO 	{ true, "TAG_PROC_CWD",
2023692a8c5SMasatake YAMATO 	  "the current working directory of the tags generator",
2033692a8c5SMasatake YAMATO 	  ptagMakeProcCwd,
2049c9dd99bSMasatake YAMATO 	  PTAGF_COMMON },
2055d8cabe6SMasatake YAMATO 	{ true, "TAG_OUTPUT_EXCMD",
2065d8cabe6SMasatake YAMATO 	  "the excmd: number, pattern, mixed, or combine",
2075d8cabe6SMasatake YAMATO 	  ptagMakeCtagsOutputExcmd,
2085d8cabe6SMasatake YAMATO 	  PTAGF_COMMON },
2099e21fd2fSMasatake YAMATO };
2109e21fd2fSMasatake YAMATO 
makePtagIfEnabled(ptagType type,langType language,const void * data)211aa53c961SMasatake YAMATO extern bool makePtagIfEnabled (ptagType type, langType language, const void *data)
2129e21fd2fSMasatake YAMATO {
2139e21fd2fSMasatake YAMATO 	ptagDesc *desc;
2149e21fd2fSMasatake YAMATO 
2159e21fd2fSMasatake YAMATO 	Assert (0 <= type && type < PTAG_COUNT);
2169e21fd2fSMasatake YAMATO 
2179e21fd2fSMasatake YAMATO 	desc = ptagDescs + type;
21877939cdcSMasatake YAMATO 	if (desc->enabled)
219aa53c961SMasatake YAMATO 		return desc->makeTag (desc, language, data);
2209e21fd2fSMasatake YAMATO 	else
221ce990805SThomas Braun 		return false;
2229e21fd2fSMasatake YAMATO }
2239e21fd2fSMasatake YAMATO 
isPtagEnabled(ptagType type)224ce990805SThomas Braun extern bool isPtagEnabled (ptagType type)
2259e21fd2fSMasatake YAMATO {
2269e21fd2fSMasatake YAMATO 	ptagDesc *desc;
2279e21fd2fSMasatake YAMATO 
2289e21fd2fSMasatake YAMATO 	Assert (0 <= type && type < PTAG_COUNT);
2299e21fd2fSMasatake YAMATO 
2309e21fd2fSMasatake YAMATO 	desc = ptagDescs + type;
2319e21fd2fSMasatake YAMATO 	return desc->enabled;
2329e21fd2fSMasatake YAMATO 
2339e21fd2fSMasatake YAMATO }
2349e21fd2fSMasatake YAMATO 
enablePtag(ptagType type,bool state)235ce990805SThomas Braun extern bool enablePtag (ptagType type, bool state)
2369e21fd2fSMasatake YAMATO {
237ce990805SThomas Braun 	bool oldstate;
2389e21fd2fSMasatake YAMATO 	ptagDesc *desc;
2399e21fd2fSMasatake YAMATO 
2409e21fd2fSMasatake YAMATO 	Assert (0 <= type && type < PTAG_COUNT);
2419e21fd2fSMasatake YAMATO 
2429e21fd2fSMasatake YAMATO 	desc = ptagDescs + type;
2439e21fd2fSMasatake YAMATO 	oldstate = desc->enabled;
2449e21fd2fSMasatake YAMATO 	desc->enabled = state;
2459e21fd2fSMasatake YAMATO 	return oldstate;
2469e21fd2fSMasatake YAMATO }
247d1c41d33SMasatake YAMATO 
getPtagDesc(ptagType type)248d1c41d33SMasatake YAMATO extern ptagDesc* getPtagDesc (ptagType type)
249d1c41d33SMasatake YAMATO {
250d1c41d33SMasatake YAMATO 	if (type == PTAG_UNKNOWN
251d1c41d33SMasatake YAMATO 	    || type >= PTAG_COUNT)
252d1c41d33SMasatake YAMATO 		return NULL;
253d1c41d33SMasatake YAMATO 
254d1c41d33SMasatake YAMATO 	return ptagDescs + type;
255d1c41d33SMasatake YAMATO }
256d1c41d33SMasatake YAMATO 
getPtagTypeForName(const char * name)257d1c41d33SMasatake YAMATO extern ptagType getPtagTypeForName (const char *name)
258d1c41d33SMasatake YAMATO {
259d1c41d33SMasatake YAMATO 	int i;
260d1c41d33SMasatake YAMATO 
261d1c41d33SMasatake YAMATO 	Assert (name);
262d1c41d33SMasatake YAMATO 	for (i = 0; i < PTAG_COUNT; i++)
263d1c41d33SMasatake YAMATO 		if (strcmp (ptagDescs [i].name, name) == 0)
264d1c41d33SMasatake YAMATO 			return i;
265d1c41d33SMasatake YAMATO 	return PTAG_UNKNOWN;
266d1c41d33SMasatake YAMATO }
267d1c41d33SMasatake YAMATO 
isPtagCommonInParsers(ptagType type)268ce990805SThomas Braun extern bool isPtagCommonInParsers  (ptagType type)
269785713bbSMasatake YAMATO {
270785713bbSMasatake YAMATO 	ptagDesc* pdesc = getPtagDesc (type);
2719c9dd99bSMasatake YAMATO 	return pdesc->flags & PTAGF_COMMON;
2729c9dd99bSMasatake YAMATO }
2739c9dd99bSMasatake YAMATO 
isPtagParserSpecific(ptagType type)2749c9dd99bSMasatake YAMATO extern bool isPtagParserSpecific (ptagType type)
2759c9dd99bSMasatake YAMATO {
2769c9dd99bSMasatake YAMATO 	ptagDesc* pdesc = getPtagDesc (type);
2779c9dd99bSMasatake YAMATO 	return pdesc->flags & PTAGF_PARSER;
278785713bbSMasatake YAMATO }
279785713bbSMasatake YAMATO 
ptagCompare(struct colprintLine * a,struct colprintLine * b)280000cabf5SMasatake YAMATO static int ptagCompare (struct colprintLine *a, struct colprintLine *b)
281d1c41d33SMasatake YAMATO {
282000cabf5SMasatake YAMATO 	const char *a_name = colprintLineGetColumn (a, 0);
283000cabf5SMasatake YAMATO 	const char *b_name = colprintLineGetColumn (b, 0);
284000cabf5SMasatake YAMATO 	return strcmp(a_name, b_name);
285000cabf5SMasatake YAMATO }
286000cabf5SMasatake YAMATO 
printPtags(bool withListHeader,bool machinable,FILE * fp)287000cabf5SMasatake YAMATO extern void printPtags (bool withListHeader, bool machinable, FILE *fp)
288000cabf5SMasatake YAMATO {
289000cabf5SMasatake YAMATO 	struct colprintTable *table = colprintTableNew ("L:NAME",
290000cabf5SMasatake YAMATO 													"L:ENABLED",
291000cabf5SMasatake YAMATO 													"L:DESCRIPTION",
292000cabf5SMasatake YAMATO 													NULL);
293000cabf5SMasatake YAMATO 	for (unsigned int i = 0; i < PTAG_COUNT; i++)
294000cabf5SMasatake YAMATO 	{
295000cabf5SMasatake YAMATO 		struct colprintLine *line = colprintTableGetNewLine (table);
296000cabf5SMasatake YAMATO 		colprintLineAppendColumnCString (line, ptagDescs[i].name);
297000cabf5SMasatake YAMATO 		colprintLineAppendColumnCString (line, ptagDescs[i].enabled
298000cabf5SMasatake YAMATO 										 ? "on"
299000cabf5SMasatake YAMATO 										 : "off");
300000cabf5SMasatake YAMATO 		colprintLineAppendColumnCString (line, ptagDescs[i].description);
301000cabf5SMasatake YAMATO 	}
302000cabf5SMasatake YAMATO 
303000cabf5SMasatake YAMATO 	colprintTableSort (table, ptagCompare);
304000cabf5SMasatake YAMATO 	colprintTablePrint (table, 0, withListHeader, machinable, fp);
305000cabf5SMasatake YAMATO 	colprintTableDelete (table);
306d1c41d33SMasatake YAMATO }
307