ctags.rb 1.1.3 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/ext/extconf.rb +1 -1
- data/ext/vendor/ctags/Tmain/input-encoding-option.d/tags-expected.txt +1 -0
- data/ext/vendor/ctags/Tmain/interactive-mode.d/run.sh +4 -1
- data/ext/vendor/ctags/Tmain/json-output-format.d/input.go +4 -0
- data/ext/vendor/ctags/Tmain/json-output-format.d/stdout-expected.txt +10 -2
- data/ext/vendor/ctags/Tmain/list-pseudo-tags.d/stdout-expected.txt +1 -0
- data/ext/vendor/ctags/Tmain/output-encoding-option.d/tags-expected.txt +1 -0
- data/ext/vendor/ctags/Tmain/output-format-option.d/run.sh +1 -1
- data/ext/vendor/ctags/Tmain/output-format-option.d/stdout-expected.txt +1 -1
- data/ext/vendor/ctags/Tmain/output-input-field-with-no-escape.d/run.sh +20 -0
- data/ext/vendor/ctags/Tmain/output-input-field-with-no-escape.d/stdout-expected.txt +6 -0
- data/ext/vendor/ctags/Tmain/ptag-kind-desc.d/stdout-expected.txt +2 -0
- data/ext/vendor/ctags/Tmain/tags-pseudo-tags.d/stdout-expected.txt +1 -0
- data/ext/vendor/ctags/Tmain/utils.sh +12 -2
- data/ext/vendor/ctags/Units/parser-php.r/php-full-qualified-tags-no-esc.d/args.ctags +4 -0
- data/ext/vendor/ctags/Units/parser-php.r/php-full-qualified-tags-no-esc.d/expected.tags +6 -0
- data/ext/vendor/ctags/Units/parser-php.r/php-full-qualified-tags-no-esc.d/input.php +10 -0
- data/ext/vendor/ctags/docs/contributions.rst +1 -0
- data/ext/vendor/ctags/docs/format.rst +13 -0
- data/ext/vendor/ctags/docs/interactive-mode.rst +61 -0
- data/ext/vendor/ctags/docs/news.rst +16 -1
- data/ext/vendor/ctags/docs/output-format.rst +1 -0
- data/ext/vendor/ctags/docs/output-xref.rst +10 -0
- data/ext/vendor/ctags/main/entry.c +6 -10
- data/ext/vendor/ctags/main/entry.h +1 -1
- data/ext/vendor/ctags/main/field.c +163 -72
- data/ext/vendor/ctags/main/field.h +4 -2
- data/ext/vendor/ctags/main/fmt.c +2 -2
- data/ext/vendor/ctags/main/main.c +5 -5
- data/ext/vendor/ctags/main/options.c +6 -3
- data/ext/vendor/ctags/main/parse.c +1 -1
- data/ext/vendor/ctags/main/ptag.c +4 -0
- data/ext/vendor/ctags/main/ptag.h +1 -0
- data/ext/vendor/ctags/main/writer-ctags.c +110 -34
- data/ext/vendor/ctags/main/writer-etags.c +11 -8
- data/ext/vendor/ctags/main/writer-json.c +18 -8
- data/ext/vendor/ctags/main/writer-xref.c +4 -2
- data/ext/vendor/ctags/main/writer.c +38 -11
- data/ext/vendor/ctags/main/writer.h +19 -7
- data/lib/ctags/universal.rb +1 -1
- data/lib/ctags/version.rb +1 -1
- metadata +10 -2
@@ -55,7 +55,8 @@ typedef enum eFieldType { /* extension field content control */
|
|
55
55
|
|
56
56
|
typedef const char* (* renderEscaped) (const tagEntryInfo *const tag,
|
57
57
|
const char *value,
|
58
|
-
vString * buffer
|
58
|
+
vString * buffer,
|
59
|
+
bool *rejected);
|
59
60
|
typedef bool (* isValueAvailable) (const struct sTagEntryInfo *const tag);
|
60
61
|
|
61
62
|
#define FIELD_LETTER_NO_USE '\0'
|
@@ -99,7 +100,8 @@ extern void printFields (int language);
|
|
99
100
|
extern bool isFieldRenderable (fieldType type);
|
100
101
|
|
101
102
|
extern bool doesFieldHaveValue (fieldType type, const tagEntryInfo *tag);
|
102
|
-
extern const char* renderFieldEscaped (writerType writer, fieldType type, const tagEntryInfo *tag, int index
|
103
|
+
extern const char* renderFieldEscaped (writerType writer, fieldType type, const tagEntryInfo *tag, int index,
|
104
|
+
bool *rejected);
|
103
105
|
|
104
106
|
extern void initFieldDescs (void);
|
105
107
|
extern int countFields (void);
|
data/ext/vendor/ctags/main/fmt.c
CHANGED
@@ -60,7 +60,7 @@ static int printTagField (fmtSpec* fspec, MIO* fp, const tagEntryInfo * tag)
|
|
60
60
|
|
61
61
|
if (isCommonField (ftype))
|
62
62
|
/* TODO: Don't use WRITER_XREF directly */
|
63
|
-
str = renderFieldEscaped (WRITER_XREF, ftype, tag, NO_PARSER_FIELD);
|
63
|
+
str = renderFieldEscaped (WRITER_XREF, ftype, tag, NO_PARSER_FIELD, NULL);
|
64
64
|
else
|
65
65
|
{
|
66
66
|
unsigned int findex;
|
@@ -76,7 +76,7 @@ static int printTagField (fmtSpec* fspec, MIO* fp, const tagEntryInfo * tag)
|
|
76
76
|
else if (isFieldEnabled (tag->parserFields [findex].ftype))
|
77
77
|
/* TODO: Don't use WRITER_XREF directly */
|
78
78
|
str = renderFieldEscaped (WRITER_XREF, tag->parserFields [findex].ftype,
|
79
|
-
tag, findex);
|
79
|
+
tag, findex, NULL);
|
80
80
|
}
|
81
81
|
|
82
82
|
if (str == NULL)
|
@@ -516,17 +516,17 @@ void interactiveLoop (cookedArgs *args, void *user CTAGS_ATTR_UNUSED)
|
|
516
516
|
goto next;
|
517
517
|
}
|
518
518
|
|
519
|
-
if (!strcmp ("
|
520
|
-
/* todo */
|
521
|
-
} else if (!strcmp ("generate-tags", json_string_value (command))) {
|
519
|
+
if (!strcmp ("generate-tags", json_string_value (command))) {
|
522
520
|
json_int_t size = -1;
|
523
521
|
const char *filename;
|
524
522
|
|
525
|
-
if (json_unpack (request, "{
|
523
|
+
if (json_unpack (request, "{ss}", "filename", &filename) == -1) {
|
526
524
|
error (FATAL, "invalid generate-tags request");
|
527
525
|
goto next;
|
528
526
|
}
|
529
527
|
|
528
|
+
json_unpack (request, "{sI}", "size", &size);
|
529
|
+
|
530
530
|
openTagFile ();
|
531
531
|
if (size == -1) { /* read from disk */
|
532
532
|
createTagsForEntry (filename);
|
@@ -614,7 +614,7 @@ extern int main (int argc CTAGS_ATTR_UNUSED, char **argv)
|
|
614
614
|
|
615
615
|
setErrorPrinter (stderrDefaultErrorPrinter, NULL);
|
616
616
|
setMainLoop (batchMakeTags, NULL);
|
617
|
-
setTagWriter (
|
617
|
+
setTagWriter (WRITER_U_CTAGS);
|
618
618
|
|
619
619
|
setCurrentDirectory ();
|
620
620
|
setExecutableName (*argv++);
|
@@ -360,12 +360,12 @@ static optionDescription LongOptionDescription [] = {
|
|
360
360
|
{1," The encoding to write the tag file in. Defaults to UTF-8 if --input-encoding"},
|
361
361
|
{1," is specified, otherwise no conversion is performed."},
|
362
362
|
#endif
|
363
|
-
{0," --output-format=ctags|etags|xref"
|
363
|
+
{0," --output-format=u-ctags|e-ctags|etags|xref"
|
364
364
|
#ifdef HAVE_JANSSON
|
365
365
|
"|json"
|
366
366
|
#endif
|
367
367
|
},
|
368
|
-
{0," Specify the output format. [ctags]"},
|
368
|
+
{0," Specify the output format. [u-ctags]"},
|
369
369
|
{1," --param-<LANG>=name:argument"},
|
370
370
|
{1," Set <LANG> specific parameter. Available parameters can be listed with --list-params."},
|
371
371
|
{0," --pattern-length-limit=N"},
|
@@ -763,6 +763,7 @@ static void setXrefMode (void)
|
|
763
763
|
static void setJsonMode (void)
|
764
764
|
{
|
765
765
|
enablePtag (PTAG_JSON_OUTPUT_VERSION, true);
|
766
|
+
enablePtag (PTAG_OUTPUT_MODE, false);
|
766
767
|
setTagWriter (WRITER_JSON);
|
767
768
|
}
|
768
769
|
#endif
|
@@ -2090,8 +2091,10 @@ static void processOutputFormat (const char *const option CTAGS_ATTR_UNUSED,
|
|
2090
2091
|
if (parameter [0] == '\0')
|
2091
2092
|
error (FATAL, "no output format name supplied for \"%s\"", option);
|
2092
2093
|
|
2093
|
-
if (strcmp (parameter, "ctags") == 0)
|
2094
|
+
if (strcmp (parameter, "u-ctags") == 0)
|
2094
2095
|
;
|
2096
|
+
else if (strcmp (parameter, "e-ctags") == 0)
|
2097
|
+
setTagWriter (WRITER_E_CTAGS);
|
2095
2098
|
else if (strcmp (parameter, "etags") == 0)
|
2096
2099
|
setEtagsMode ();
|
2097
2100
|
else if (strcmp (parameter, "xref") == 0)
|
@@ -2436,7 +2436,7 @@ extern bool parseFileWithMio (const char *const fileName, MIO *mio)
|
|
2436
2436
|
tagFileResized = createTagsWithXcmd (fileName, language, mio)? true: tagFileResized;
|
2437
2437
|
#endif
|
2438
2438
|
|
2439
|
-
teardownWriter (fileName);
|
2439
|
+
tagFileResized = teardownWriter (fileName)? true: tagFileResized;
|
2440
2440
|
|
2441
2441
|
if (Option.filter && ! Option.interactive)
|
2442
2442
|
closeTagFile (tagFileResized);
|
@@ -160,6 +160,10 @@ static ptagDesc ptagDescs [] = {
|
|
160
160
|
"the letters, names and descriptions of kinds in a parser",
|
161
161
|
ptagMakeKindDescriptions,
|
162
162
|
false },
|
163
|
+
{ true, "TAG_OUTPUT_MODE",
|
164
|
+
"the output mode: u-ctags or e-ctags",
|
165
|
+
ptagMakeCtagsOutputMode,
|
166
|
+
true },
|
163
167
|
};
|
164
168
|
|
165
169
|
extern bool makePtagIfEnabled (ptagType type, void *data)
|
@@ -17,33 +17,73 @@
|
|
17
17
|
#include "writer.h"
|
18
18
|
|
19
19
|
|
20
|
-
static int writeCtagsEntry (
|
21
|
-
|
20
|
+
static int writeCtagsEntry (tagWriter *writer CTAGS_ATTR_UNUSED,
|
21
|
+
MIO * mio, const tagEntryInfo *const tag);
|
22
|
+
static int writeCtagsPtagEntry (tagWriter *writer CTAGS_ATTR_UNUSED,
|
23
|
+
MIO * mio, const ptagDesc *desc,
|
22
24
|
const char *const fileName,
|
23
25
|
const char *const pattern,
|
24
|
-
const char *const parserName
|
26
|
+
const char *const parserName);
|
27
|
+
static void buildCtagsFqTagCache (tagWriter *writer CTAGS_ATTR_UNUSED, tagEntryInfo *const tag);
|
25
28
|
|
26
|
-
|
29
|
+
struct rejection {
|
30
|
+
bool rejectedInThisRendering;
|
31
|
+
bool rejectedInThisInput;
|
32
|
+
};
|
33
|
+
|
34
|
+
tagWriter uCtagsWriter = {
|
27
35
|
.writeEntry = writeCtagsEntry,
|
28
36
|
.writePtagEntry = writeCtagsPtagEntry,
|
29
37
|
.preWriteEntry = NULL,
|
30
38
|
.postWriteEntry = NULL,
|
39
|
+
.buildFqTagCache = buildCtagsFqTagCache,
|
31
40
|
.useStdoutByDefault = false,
|
32
41
|
};
|
33
42
|
|
34
|
-
static
|
43
|
+
static void *beginECtagsFile (tagWriter *writer, MIO * mio)
|
35
44
|
{
|
36
|
-
|
45
|
+
static struct rejection rej;
|
46
|
+
|
47
|
+
rej.rejectedInThisInput = false;;
|
48
|
+
|
49
|
+
return &rej;
|
50
|
+
}
|
51
|
+
|
52
|
+
static bool endECTagsFile (tagWriter *writer, MIO * mio, const char* filename)
|
53
|
+
{
|
54
|
+
struct rejection *rej = writer->private;
|
55
|
+
return rej->rejectedInThisInput;
|
56
|
+
}
|
57
|
+
|
58
|
+
tagWriter eCtagsWriter = {
|
59
|
+
.writeEntry = writeCtagsEntry,
|
60
|
+
.writePtagEntry = writeCtagsPtagEntry,
|
61
|
+
.preWriteEntry = beginECtagsFile,
|
62
|
+
.postWriteEntry = endECTagsFile,
|
63
|
+
.buildFqTagCache = buildCtagsFqTagCache,
|
64
|
+
.useStdoutByDefault = false,
|
65
|
+
};
|
66
|
+
|
67
|
+
static const char* escapeFieldValue (tagWriter *writer, const tagEntryInfo * tag, fieldType ftype)
|
68
|
+
{
|
69
|
+
bool *reject = NULL;
|
70
|
+
|
71
|
+
if (writer->private)
|
72
|
+
{
|
73
|
+
struct rejection * rej = writer->private;
|
74
|
+
reject = &rej->rejectedInThisRendering;
|
75
|
+
}
|
76
|
+
return renderFieldEscaped (writer->type, ftype, tag, NO_PARSER_FIELD, reject);
|
37
77
|
}
|
38
78
|
|
39
|
-
static int renderExtensionFieldMaybe (int xftype, const tagEntryInfo *const tag, char sep[2], MIO *mio)
|
79
|
+
static int renderExtensionFieldMaybe (tagWriter *writer, int xftype, const tagEntryInfo *const tag, char sep[2], MIO *mio)
|
40
80
|
{
|
41
81
|
if (isFieldEnabled (xftype) && doesFieldHaveValue (xftype, tag))
|
42
82
|
{
|
43
83
|
int len;
|
44
84
|
len = mio_printf (mio, "%s\t%s:%s", sep,
|
45
85
|
getFieldName (xftype),
|
46
|
-
escapeFieldValue (tag, xftype));
|
86
|
+
escapeFieldValue (writer, tag, xftype));
|
47
87
|
sep[0] = '\0';
|
48
88
|
return len;
|
49
89
|
}
|
@@ -51,11 +91,18 @@ static int renderExtensionFieldMaybe (int xftype, const tagEntryInfo *const tag,
|
|
51
91
|
return 0;
|
52
92
|
}
|
53
93
|
|
54
|
-
static int addParserFields (MIO * mio, const tagEntryInfo *const tag)
|
94
|
+
static int addParserFields (tagWriter *writer, MIO * mio, const tagEntryInfo *const tag)
|
55
95
|
{
|
56
96
|
unsigned int i;
|
57
97
|
unsigned int ftype;
|
58
98
|
int length = 0;
|
99
|
+
bool *reject = NULL;
|
100
|
+
|
101
|
+
if (writer->private)
|
102
|
+
{
|
103
|
+
struct rejection *rej = writer->private;
|
104
|
+
reject = &rej->rejectedInThisRendering;
|
105
|
+
}
|
59
106
|
|
60
107
|
for (i = 0; i < tag->usedParserFields; i++)
|
61
108
|
{
|
@@ -65,16 +112,16 @@ static int addParserFields (MIO * mio, const tagEntryInfo *const tag)
|
|
65
112
|
|
66
113
|
length += mio_printf(mio, "\t%s:%s",
|
67
114
|
getFieldName (ftype),
|
68
|
-
renderFieldEscaped (
|
69
|
-
tag->parserFields [i].ftype, tag, i));
|
115
|
+
renderFieldEscaped (writer->type,
|
116
|
+
tag->parserFields [i].ftype, tag, i, reject));
|
70
117
|
}
|
71
118
|
return length;
|
72
119
|
}
|
73
120
|
|
74
|
-
static int writeLineNumberEntry (MIO * mio, const tagEntryInfo *const tag)
|
121
|
+
static int writeLineNumberEntry (tagWriter *writer, MIO * mio, const tagEntryInfo *const tag)
|
75
122
|
{
|
76
123
|
if (Option.lineDirectives)
|
77
|
-
return mio_printf (mio, "%s", escapeFieldValue (tag, FIELD_LINE_NUMBER));
|
124
|
+
return mio_printf (mio, "%s", escapeFieldValue (writer, tag, FIELD_LINE_NUMBER));
|
78
125
|
else
|
79
126
|
return mio_printf (mio, "%lu", tag->lineNumber);
|
80
127
|
}
|
@@ -92,7 +139,7 @@ static int file_puts (const char* s, void *data)
|
|
92
139
|
return mio_puts (fp, s);
|
93
140
|
}
|
94
141
|
|
95
|
-
static int addExtensionFields (MIO *mio, const tagEntryInfo *const tag)
|
142
|
+
static int addExtensionFields (tagWriter *writer, MIO *mio, const tagEntryInfo *const tag)
|
96
143
|
{
|
97
144
|
bool isKindKeyEnabled = isFieldEnabled (FIELD_KIND_KEY);
|
98
145
|
bool isScopeEnabled = isFieldEnabled (FIELD_SCOPE_KEY);
|
@@ -135,14 +182,14 @@ static int addExtensionFields (MIO *mio, const tagEntryInfo *const tag)
|
|
135
182
|
sep [0] = '\0';
|
136
183
|
}
|
137
184
|
|
138
|
-
length += renderExtensionFieldMaybe (FIELD_LANGUAGE, tag, sep, mio);
|
185
|
+
length += renderExtensionFieldMaybe (writer, FIELD_LANGUAGE, tag, sep, mio);
|
139
186
|
|
140
187
|
if (isFieldEnabled (FIELD_SCOPE))
|
141
188
|
{
|
142
189
|
const char* k = NULL, *v = NULL;
|
143
190
|
|
144
|
-
k = escapeFieldValue (tag, FIELD_SCOPE_KIND_LONG);
|
145
|
-
v = escapeFieldValue (tag, FIELD_SCOPE);
|
191
|
+
k = escapeFieldValue (writer, tag, FIELD_SCOPE_KIND_LONG);
|
192
|
+
v = escapeFieldValue (writer, tag, FIELD_SCOPE);
|
146
193
|
if (k && v)
|
147
194
|
{
|
148
195
|
length += mio_printf (mio, scopeFmt, sep, scopeKey, k, v);
|
@@ -155,7 +202,7 @@ static int addExtensionFields (MIO *mio, const tagEntryInfo *const tag)
|
|
155
202
|
length += mio_printf (mio, "%s\t%s:%s:%s", sep,
|
156
203
|
getFieldName (FIELD_TYPE_REF),
|
157
204
|
tag->extensionFields.typeRef [0],
|
158
|
-
escapeFieldValue (tag, FIELD_TYPE_REF));
|
205
|
+
escapeFieldValue (writer, tag, FIELD_TYPE_REF));
|
159
206
|
sep [0] = '\0';
|
160
207
|
}
|
161
208
|
|
@@ -166,14 +213,14 @@ static int addExtensionFields (MIO *mio, const tagEntryInfo *const tag)
|
|
166
213
|
sep [0] = '\0';
|
167
214
|
}
|
168
215
|
|
169
|
-
length += renderExtensionFieldMaybe (FIELD_INHERITANCE, tag, sep, mio);
|
170
|
-
length += renderExtensionFieldMaybe (FIELD_ACCESS, tag, sep, mio);
|
171
|
-
length += renderExtensionFieldMaybe (FIELD_IMPLEMENTATION, tag, sep, mio);
|
172
|
-
length += renderExtensionFieldMaybe (FIELD_SIGNATURE, tag, sep, mio);
|
173
|
-
length += renderExtensionFieldMaybe (FIELD_ROLE, tag, sep, mio);
|
174
|
-
length += renderExtensionFieldMaybe (FIELD_EXTRA, tag, sep, mio);
|
175
|
-
length += renderExtensionFieldMaybe (FIELD_XPATH, tag, sep, mio);
|
176
|
-
length += renderExtensionFieldMaybe (FIELD_END, tag, sep, mio);
|
216
|
+
length += renderExtensionFieldMaybe (writer, FIELD_INHERITANCE, tag, sep, mio);
|
217
|
+
length += renderExtensionFieldMaybe (writer, FIELD_ACCESS, tag, sep, mio);
|
218
|
+
length += renderExtensionFieldMaybe (writer, FIELD_IMPLEMENTATION, tag, sep, mio);
|
219
|
+
length += renderExtensionFieldMaybe (writer, FIELD_SIGNATURE, tag, sep, mio);
|
220
|
+
length += renderExtensionFieldMaybe (writer, FIELD_ROLE, tag, sep, mio);
|
221
|
+
length += renderExtensionFieldMaybe (writer, FIELD_EXTRA, tag, sep, mio);
|
222
|
+
length += renderExtensionFieldMaybe (writer, FIELD_XPATH, tag, sep, mio);
|
223
|
+
length += renderExtensionFieldMaybe (writer, FIELD_END, tag, sep, mio);
|
177
224
|
|
178
225
|
return length;
|
179
226
|
}
|
@@ -183,14 +230,26 @@ static int writePatternEntry (MIO *mio, const tagEntryInfo *const tag)
|
|
183
230
|
return makePatternStringCommon (tag, file_putc, file_puts, mio);
|
184
231
|
}
|
185
232
|
|
186
|
-
static int writeCtagsEntry (
|
233
|
+
static int writeCtagsEntry (tagWriter *writer,
|
234
|
+
MIO * mio, const tagEntryInfo *const tag)
|
187
235
|
{
|
236
|
+
long origin = 0;
|
237
|
+
|
238
|
+
if (writer->private)
|
239
|
+
{
|
240
|
+
struct rejection *rej = writer->private;
|
241
|
+
|
242
|
+
origin = mio_tell (mio);
|
243
|
+
rej->rejectedInThisRendering = false;
|
244
|
+
|
245
|
+
}
|
246
|
+
|
188
247
|
int length = mio_printf (mio, "%s\t%s\t",
|
189
|
-
escapeFieldValue (tag, FIELD_NAME),
|
190
|
-
escapeFieldValue (tag, FIELD_INPUT_FILE));
|
248
|
+
escapeFieldValue (writer, tag, FIELD_NAME),
|
249
|
+
escapeFieldValue (writer, tag, FIELD_INPUT_FILE));
|
191
250
|
|
192
251
|
if (tag->lineNumberEntry)
|
193
|
-
length += writeLineNumberEntry (mio, tag);
|
252
|
+
length += writeLineNumberEntry (writer, mio, tag);
|
194
253
|
else if (tag->pattern)
|
195
254
|
length += mio_printf(mio, "%s", tag->pattern);
|
196
255
|
else
|
@@ -198,19 +257,30 @@ static int writeCtagsEntry (MIO * mio, const tagEntryInfo *const tag, void *data
|
|
198
257
|
|
199
258
|
if (includeExtensionFlags ())
|
200
259
|
{
|
201
|
-
length += addExtensionFields (mio, tag);
|
202
|
-
length += addParserFields (mio, tag);
|
260
|
+
length += addExtensionFields (writer, mio, tag);
|
261
|
+
length += addParserFields (writer, mio, tag);
|
203
262
|
}
|
204
263
|
|
205
264
|
length += mio_printf (mio, "\n");
|
206
265
|
|
266
|
+
if (writer->private
|
267
|
+
&& ((struct rejection *)(writer->private))->rejectedInThisRendering)
|
268
|
+
{
|
269
|
+
mio_seek (mio, origin, SEEK_SET);
|
270
|
+
|
271
|
+
/* Truncation is needed. */
|
272
|
+
((struct rejection *)(writer->private))->rejectedInThisInput = true;
|
273
|
+
|
274
|
+
length = 0;
|
275
|
+
}
|
207
276
|
return length;
|
208
277
|
}
|
209
278
|
|
210
|
-
static int writeCtagsPtagEntry (
|
279
|
+
static int writeCtagsPtagEntry (tagWriter *writer CTAGS_ATTR_UNUSED,
|
280
|
+
MIO * mio, const ptagDesc *desc,
|
211
281
|
const char *const fileName,
|
212
282
|
const char *const pattern,
|
213
|
-
const char *const parserName
|
283
|
+
const char *const parserName)
|
214
284
|
{
|
215
285
|
return parserName
|
216
286
|
|
@@ -223,3 +293,9 @@ static int writeCtagsPtagEntry (MIO * mio, const ptagDesc *desc,
|
|
223
293
|
OPT(fileName), OPT(pattern));
|
224
294
|
#undef OPT
|
225
295
|
}
|
296
|
+
|
297
|
+
static void buildCtagsFqTagCache (tagWriter *writer CTAGS_ATTR_UNUSED, tagEntryInfo *const tag)
|
298
|
+
{
|
299
|
+
escapeFieldValue (writer, tag, FIELD_SCOPE_KIND_LONG);
|
300
|
+
escapeFieldValue (writer, tag, FIELD_SCOPE);
|
301
|
+
}
|
@@ -20,9 +20,9 @@
|
|
20
20
|
#include "writer.h"
|
21
21
|
|
22
22
|
|
23
|
-
static int writeEtagsEntry
|
24
|
-
static void *beginEtagsFile (MIO * mio);
|
25
|
-
static
|
23
|
+
static int writeEtagsEntry (tagWriter *writer, MIO * mio, const tagEntryInfo *const tag);
|
24
|
+
static void *beginEtagsFile (tagWriter *writer, MIO * mio);
|
25
|
+
static bool endEtagsFile (tagWriter *writer, MIO * mio, const char* filename);
|
26
26
|
|
27
27
|
tagWriter etagsWriter = {
|
28
28
|
.writeEntry = writeEtagsEntry,
|
@@ -40,7 +40,7 @@ struct sEtags {
|
|
40
40
|
|
41
41
|
|
42
42
|
|
43
|
-
static void *beginEtagsFile (MIO *mio)
|
43
|
+
static void *beginEtagsFile (tagWriter *writer CTAGS_ATTR_UNUSED, MIO *mio)
|
44
44
|
{
|
45
45
|
static struct sEtags etags = { NULL, NULL, 0, NULL };
|
46
46
|
|
@@ -50,10 +50,11 @@ static void *beginEtagsFile (MIO *mio)
|
|
50
50
|
return &etags;
|
51
51
|
}
|
52
52
|
|
53
|
-
static
|
53
|
+
static bool endEtagsFile (tagWriter *writer,
|
54
|
+
MIO *mainfp, const char *filename)
|
54
55
|
{
|
55
56
|
const char *line;
|
56
|
-
struct sEtags *etags =
|
57
|
+
struct sEtags *etags = writer->private;
|
57
58
|
|
58
59
|
mio_printf (mainfp, "\f\n%s,%ld\n", filename, (long) etags->byteCount);
|
59
60
|
abort_if_ferror (mainfp);
|
@@ -73,12 +74,14 @@ static void endEtagsFile (MIO *mainfp, const char *filename, void *data)
|
|
73
74
|
etags->mio = NULL;
|
74
75
|
etags->name = NULL;
|
75
76
|
}
|
77
|
+
return false;
|
76
78
|
}
|
77
79
|
|
78
|
-
static int writeEtagsEntry (
|
80
|
+
static int writeEtagsEntry (tagWriter *writer,
|
81
|
+
MIO * mio, const tagEntryInfo *const tag)
|
79
82
|
{
|
80
83
|
int length;
|
81
|
-
struct sEtags *etags =
|
84
|
+
struct sEtags *etags = writer->private;
|
82
85
|
|
83
86
|
mio = etags->mio;
|
84
87
|
|
@@ -24,12 +24,14 @@
|
|
24
24
|
#endif
|
25
25
|
|
26
26
|
|
27
|
-
static int writeJsonEntry (
|
27
|
+
static int writeJsonEntry (tagWriter *writer CTAGS_ATTR_UNUSED,
|
28
|
+
MIO * mio, const tagEntryInfo *const tag);
|
28
29
|
|
29
|
-
static int writeJsonPtagEntry (
|
30
|
+
static int writeJsonPtagEntry (tagWriter *writer CTAGS_ATTR_UNUSED,
|
31
|
+
MIO * mio, const ptagDesc *desc,
|
30
32
|
const char *const fileName,
|
31
33
|
const char *const pattern,
|
32
|
-
const char *const parserName
|
34
|
+
const char *const parserName);
|
33
35
|
|
34
36
|
tagWriter jsonWriter = {
|
35
37
|
.writeEntry = writeJsonEntry,
|
@@ -42,7 +44,7 @@ tagWriter jsonWriter = {
|
|
42
44
|
|
43
45
|
static json_t* escapeFieldValue (const tagEntryInfo * tag, fieldType ftype)
|
44
46
|
{
|
45
|
-
const char *str = renderFieldEscaped (jsonWriter.type, ftype, tag, NO_PARSER_FIELD);
|
47
|
+
const char *str = renderFieldEscaped (jsonWriter.type, ftype, tag, NO_PARSER_FIELD, NULL);
|
46
48
|
if (str)
|
47
49
|
return json_string (str);
|
48
50
|
else
|
@@ -111,14 +113,21 @@ static void addExtensionFields (json_t *response, const tagEntryInfo *const tag)
|
|
111
113
|
renderExtensionFieldMaybe (k, tag, response);
|
112
114
|
}
|
113
115
|
|
114
|
-
static int writeJsonEntry (
|
116
|
+
static int writeJsonEntry (tagWriter *writer CTAGS_ATTR_UNUSED,
|
117
|
+
MIO * mio, const tagEntryInfo *const tag)
|
115
118
|
{
|
119
|
+
const char *pattern = tag->pattern;
|
120
|
+
if (!pattern)
|
121
|
+
{
|
122
|
+
pattern = makePatternString (tag);
|
123
|
+
}
|
124
|
+
|
116
125
|
json_t *response = json_pack ("{ss ss ss ss}",
|
117
126
|
"_type", "tag",
|
118
127
|
"name", tag->name,
|
119
128
|
"path", tag->sourceFileName,
|
120
129
|
/* --extra=f option can generates a tag with NULL pattern. */
|
121
|
-
"pattern",
|
130
|
+
"pattern", pattern? pattern: ""
|
122
131
|
);
|
123
132
|
|
124
133
|
if (includeExtensionFlags ())
|
@@ -136,10 +145,11 @@ static int writeJsonEntry (MIO * mio, const tagEntryInfo *const tag, void *data
|
|
136
145
|
return length;
|
137
146
|
}
|
138
147
|
|
139
|
-
static int writeJsonPtagEntry (
|
148
|
+
static int writeJsonPtagEntry (tagWriter *writer CTAGS_ATTR_UNUSED,
|
149
|
+
MIO * mio, const ptagDesc *desc,
|
140
150
|
const char *const fileName,
|
141
151
|
const char *const pattern,
|
142
|
-
const char *const parserName
|
152
|
+
const char *const parserName)
|
143
153
|
{
|
144
154
|
#define OPT(X) ((X)?(X):"")
|
145
155
|
json_t *response;
|