Fix missing initializer for field warnings
[geany-mirror.git] / ctags / main / xtag.c
blob105a3657d6f6030fd6eb16b54f06d612cf840c28
1 /*
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 */
14 #include "debug.h"
15 #include "main.h"
16 #include "options.h"
17 #include "routines.h"
18 #include "xtag.h"
20 #include <string.h>
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",
35 isPseudoTagsEnabled},
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)
53 int i;
55 for (i = 0; i < XTAG_COUNT; i++)
57 if (predicate (xtagDescs + i, user_data))
58 return i;
60 return XTAG_UNKNOWN;
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) \
93 " " \
94 PR_XTAG_FMT (NAME,s) \
95 " " \
96 PR_XTAG_FMT (ENABLED,s) \
97 " " \
98 PR_XTAG_FMT (DESC,s) \
99 "\n"
101 static void printXtag (xtagType i)
103 printf((Option.machinable? "%c\t%s\t%s\t%s\n": MAKE_XTAG_FMT(c)),
104 xtagDescs[i].letter,
105 xtagDescs[i].name,
106 getXtagDesc (i)->enabled? "TRUE": "FALSE",
107 xtagDescs[i].description? xtagDescs[i].description: "NONE");
110 extern void printXtags (void)
112 unsigned int i;
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++)
119 printXtag (i);
122 extern bool isXtagEnabled (xtagType type)
124 xtagDesc* desc = getXtagDesc (type);
126 Assert (desc);
128 if (desc->isEnabled)
129 return desc->isEnabled (desc);
130 else
131 return desc->enabled;
134 extern bool enableXtag (xtagType type, bool state)
136 bool old;
137 xtagDesc* desc = getXtagDesc (type);
139 Assert (desc);
141 old = isXtagEnabled (type);
142 desc->enabled = state;
143 desc->isEnabled = NULL;;
145 return old;
148 const char* getXtagName (xtagType type)
150 xtagDesc* desc = getXtagDesc (type);
151 if (desc)
152 return desc->name;
153 else
154 return NULL;