3 * Copyright (c) 2015, Red Hat, Inc.
4 * Copyright (c) 2015, Masatake YAMATO
6 * Author: Masatake YAMATO <yamato@redhat.com>
8 * This source code is released for free distribution under the terms of the
9 * GNU General Public License version 2 or (at your option) any later version.
13 #include "general.h" /* must always come first */
23 static bool isPseudoTagsEnabled (xtagDesc
*pdesc CTAGS_ATTR_UNUSED
)
25 return ! isDestinationStdout ();
28 static xtagDesc xtagDescs
[] = {
29 { true, 'F', "fileScope",
30 "Include tags of file scope", NULL
},
31 { false, 'f', "inputFile",
32 "Include an entry for the base file name of every input file", NULL
},
33 { false, 'p', "pseudo",
34 "Include pseudo tags",
36 { false, 'q', "qualified",
37 "Include an extra class-qualified tag entry for each tag", NULL
},
38 { false, 'r', "reference",
39 "Include reference tags", NULL
},
40 { false, 's', "subparser",
41 "Include tags generated by sub parsers", NULL
},
44 extern xtagDesc
* getXtagDesc (xtagType type
)
46 Assert ((0 <= type
) && (type
< XTAG_COUNT
));
47 return xtagDescs
+ type
;
50 typedef bool (* xtagPredicate
) (xtagDesc
*pdesc
, const void *user_data
);
51 static xtagType
getXtagTypeGeneric (xtagPredicate predicate
, const void *user_data
)
55 for (i
= 0; i
< XTAG_COUNT
; i
++)
57 if (predicate (xtagDescs
+ i
, user_data
))
63 static bool xtagEqualByLetter (xtagDesc
*pdesc
, const void *user_data
)
65 return (pdesc
->letter
== *((char *)user_data
))? true: false;
68 extern xtagType
getXtagTypeForLetter (char letter
)
70 return getXtagTypeGeneric (xtagEqualByLetter
, &letter
);
73 static bool xtagEqualByName (xtagDesc
*pdesc
, const void *user_data
)
75 return (strcmp (pdesc
->name
, user_data
) == 0)? true: false;
78 extern xtagType
getXtagTypeForName (const char *name
)
80 return getXtagTypeGeneric (xtagEqualByName
, name
);
84 #define PR_XTAG_WIDTH_LETTER 7
85 #define PR_XTAG_WIDTH_NAME 22
86 #define PR_XTAG_WIDTH_ENABLED 7
87 #define PR_XTAG_WIDTH_DESC 30
89 #define PR_XTAG_STR(X) PR_XTAG_WIDTH_##X
90 #define PR_XTAG_FMT(X,T) "%-" STRINGIFY(PR_XTAG_STR(X)) STRINGIFY(T)
91 #define MAKE_XTAG_FMT(LETTER_SPEC) \
92 PR_XTAG_FMT (LETTER,LETTER_SPEC) \
94 PR_XTAG_FMT (NAME,s) \
96 PR_XTAG_FMT (ENABLED,s) \
98 PR_XTAG_FMT (DESC,s) \
101 static void printXtag (xtagType i
)
103 printf((Option
.machinable
? "%c\t%s\t%s\t%s\n": MAKE_XTAG_FMT(c
)),
106 getXtagDesc (i
)->enabled
? "TRUE": "FALSE",
107 xtagDescs
[i
].description
? xtagDescs
[i
].description
: "NONE");
110 extern void printXtags (void)
114 if (Option
.withListHeader
)
115 printf ((Option
.machinable
? "%s\t%s\t%s\t%s\n": MAKE_XTAG_FMT(s
)),
116 "#LETTER", "NAME", "ENABLED", "DESCRIPTION");
118 for (i
= 0; i
< XTAG_COUNT
; i
++)
122 extern bool isXtagEnabled (xtagType type
)
124 xtagDesc
* desc
= getXtagDesc (type
);
129 return desc
->isEnabled (desc
);
131 return desc
->enabled
;
134 extern bool enableXtag (xtagType type
, bool state
)
137 xtagDesc
* desc
= getXtagDesc (type
);
141 old
= isXtagEnabled (type
);
142 desc
->enabled
= state
;
143 desc
->isEnabled
= NULL
;;
148 const char* getXtagName (xtagType type
)
150 xtagDesc
* desc
= getXtagDesc (type
);