xref: /Universal-ctags/main/field.c (revision 2cd54e43f39d2a0265b53bbc00fc6b5aac30a701)
12894800fSMasatake YAMATO /*
22894800fSMasatake YAMATO  *
32894800fSMasatake YAMATO  *  Copyright (c) 2015, Red Hat, Inc.
42894800fSMasatake YAMATO  *  Copyright (c) 2015, Masatake YAMATO
52894800fSMasatake YAMATO  *
62894800fSMasatake YAMATO  *  Author: Masatake YAMATO <yamato@redhat.com>
72894800fSMasatake YAMATO  *
82894800fSMasatake YAMATO  *   This source code is released for free distribution under the terms of the
92894800fSMasatake YAMATO  *   GNU General Public License version 2 or (at your option) any later version.
102894800fSMasatake YAMATO  *
112894800fSMasatake YAMATO  */
122894800fSMasatake YAMATO 
132894800fSMasatake YAMATO #include "general.h"  /* must always come first */
142894800fSMasatake YAMATO 
152894800fSMasatake YAMATO #include <errno.h>
162894800fSMasatake YAMATO #include <stdlib.h>
172894800fSMasatake YAMATO #include <string.h>
182894800fSMasatake YAMATO 
195ac89ddbSMasatake YAMATO #include "ctags.h"
202894800fSMasatake YAMATO #include "debug.h"
212894800fSMasatake YAMATO #include "entry.h"
228791bb4bSMasatake YAMATO #include "entry_p.h"
232894800fSMasatake YAMATO #include "field.h"
24c08c70d0SMasatake YAMATO #include "field_p.h"
25e2755fdeSMasatake YAMATO #include "kind.h"
2621996d92SMasatake YAMATO #include "options_p.h"
270d502ef0SMasatake YAMATO #include "parse_p.h"
2872b1490cSMasatake YAMATO #include "read.h"
292894800fSMasatake YAMATO #include "routines.h"
3056065e52SMasatake YAMATO #include "trashbox.h"
318182f840SMasatake YAMATO #include "writer_p.h"
32e2a3289bSMasatake YAMATO #include "xtag_p.h"
332894800fSMasatake YAMATO 
34fba3677cSMasatake YAMATO #include "optscript.h"
35*2cd54e43SMasatake YAMATO #include "script_p.h"
36fba3677cSMasatake YAMATO 
37abe66999SMasatake YAMATO #define FIELD_NULL_LETTER_CHAR '-'
38abe66999SMasatake YAMATO #define FIELD_NULL_LETTER_STRING "-"
3928ce6666SMasatake YAMATO 
40f2af3ebdSMasatake YAMATO typedef struct sFieldObject {
4183c59ef1SMasatake YAMATO 	fieldDefinition *def;
4228ce6666SMasatake YAMATO 	vString     *buffer;
4328ce6666SMasatake YAMATO 	const char* nameWithPrefix;
44ad1a3891SMasatake YAMATO 	langType language;
45fe82d0bfSMasatake YAMATO 	fieldType sibling;
46f2af3ebdSMasatake YAMATO } fieldObject;
4728ce6666SMasatake YAMATO 
485e272693SMasatake YAMATO static const char *renderFieldName (const tagEntryInfo *const tag, const char *value, vString* b);
495e272693SMasatake YAMATO static const char *renderFieldNameNoEscape (const tagEntryInfo *const tag, const char *value CTAGS_ATTR_UNUSED, vString* b);
505e272693SMasatake YAMATO static const char *renderFieldInput (const tagEntryInfo *const tag, const char *value, vString* b);
515e272693SMasatake YAMATO static const char *renderFieldInputNoEscape (const tagEntryInfo *const tag, const char *value, vString* b);
525e272693SMasatake YAMATO static const char *renderFieldCompactInputLine (const tagEntryInfo *const tag, const char *value, vString* b);
535e272693SMasatake YAMATO static const char *renderFieldSignature (const tagEntryInfo *const tag, const char *value, vString* b);
54ba82e4f4SMasatake YAMATO static const char *renderFieldSignatureNoEscape (const tagEntryInfo *const tag, const char *value, vString* b);
555e272693SMasatake YAMATO static const char *renderFieldScope (const tagEntryInfo *const tag, const char *value, vString* b);
565e272693SMasatake YAMATO static const char *renderFieldScopeNoEscape (const tagEntryInfo *const tag, const char *value, vString* b);
575e272693SMasatake YAMATO static const char *renderFieldTyperef (const tagEntryInfo *const tag, const char *value, vString* b);
585e272693SMasatake YAMATO static const char *renderFieldInherits (const tagEntryInfo *const tag, const char *value, vString* b);
595e272693SMasatake YAMATO static const char *renderFieldKindName (const tagEntryInfo *const tag, const char *value, vString* b);
605e272693SMasatake YAMATO static const char *renderFieldLineNumber (const tagEntryInfo *const tag, const char *value, vString* b);
615e272693SMasatake YAMATO static const char *renderFieldLanguage (const tagEntryInfo *const tag, const char *value, vString* b);
625e272693SMasatake YAMATO static const char *renderFieldAccess (const tagEntryInfo *const tag, const char *value, vString* b);
635e272693SMasatake YAMATO static const char *renderFieldKindLetter (const tagEntryInfo *const tag, const char *value, vString* b);
645e272693SMasatake YAMATO static const char *renderFieldImplementation (const tagEntryInfo *const tag, const char *value, vString* b);
655e272693SMasatake YAMATO static const char *renderFieldFile (const tagEntryInfo *const tag, const char *value, vString* b);
665e272693SMasatake YAMATO static const char *renderFieldPattern (const tagEntryInfo *const tag, const char *value, vString* b);
675e272693SMasatake YAMATO static const char *renderFieldRoles (const tagEntryInfo *const tag, const char *value, vString* b);
685e272693SMasatake YAMATO static const char *renderFieldRefMarker (const tagEntryInfo *const tag, const char *value, vString* b);
695e272693SMasatake YAMATO static const char *renderFieldExtras (const tagEntryInfo *const tag, const char *value, vString* b);
705e272693SMasatake YAMATO static const char *renderFieldXpath (const tagEntryInfo *const tag, const char *value, vString* b);
715e272693SMasatake YAMATO static const char *renderFieldScopeKindName(const tagEntryInfo *const tag, const char *value, vString* b);
725e272693SMasatake YAMATO static const char *renderFieldEnd (const tagEntryInfo *const tag, const char *value, vString* b);
73c314f261SMasatake YAMATO static const char *renderFieldEpoch (const tagEntryInfo *const tag, const char *value, vString* b);
74f0a23ab8SMasatake YAMATO static const char *renderFieldNth (const tagEntryInfo *const tag, const char *value, vString* b);
755e272693SMasatake YAMATO 
76c54f0614SMasatake YAMATO static bool doesContainAnyCharInName (const tagEntryInfo *const tag, const char *value, const char *chars);
77c54f0614SMasatake YAMATO static bool doesContainAnyCharInInput (const tagEntryInfo *const tag, const char*value, const char *chars);
78c54f0614SMasatake YAMATO static bool doesContainAnyCharInFieldScope (const tagEntryInfo *const tag, const char *value, const char *chars);
79c54f0614SMasatake YAMATO static bool doesContainAnyCharInSignature (const tagEntryInfo *const tag, const char *value, const char *chars);
809022fbb4SMasatake YAMATO 
81ce990805SThomas Braun static bool     isTyperefFieldAvailable   (const tagEntryInfo *const tag);
82ce990805SThomas Braun static bool     isFileFieldAvailable      (const tagEntryInfo *const tag);
83ce990805SThomas Braun static bool     isInheritsFieldAvailable  (const tagEntryInfo *const tag);
84ce990805SThomas Braun static bool     isAccessFieldAvailable    (const tagEntryInfo *const tag);
85ce990805SThomas Braun static bool     isImplementationFieldAvailable (const tagEntryInfo *const tag);
86ce990805SThomas Braun static bool     isSignatureFieldAvailable (const tagEntryInfo *const tag);
8795ad9dc1SMasatake YAMATO static bool     isExtrasFieldAvailable    (const tagEntryInfo *const tag);
88ce990805SThomas Braun static bool     isXpathFieldAvailable     (const tagEntryInfo *const tag);
89ce990805SThomas Braun static bool     isEndFieldAvailable       (const tagEntryInfo *const tag);
907222fbceSMasatake YAMATO static bool     isEpochAvailable          (const tagEntryInfo *const tag);
91f0a23ab8SMasatake YAMATO static bool     isNthAvailable            (const tagEntryInfo *const tag);
925ed65c80SMasatake YAMATO 
93ad51b948SMasatake YAMATO static EsObject* getFieldValueForName (const tagEntryInfo *, const fieldDefinition *);
94ad51b948SMasatake YAMATO static EsObject* setFieldValueForName (tagEntryInfo *, const fieldDefinition *, const EsObject *);
953c63479cSMasatake YAMATO static EsObject* getFieldValueForInput (const tagEntryInfo *, const fieldDefinition *);
963aea379fSMasatake YAMATO static EsObject* getFieldValueForKind (const tagEntryInfo *, const fieldDefinition *);
97170a717fSMasatake YAMATO static EsObject* getFieldValueForTyperef (const tagEntryInfo *, const fieldDefinition *);
98170a717fSMasatake YAMATO static EsObject* setFieldValueForTyperef (tagEntryInfo *, const fieldDefinition *, const EsObject *);
99170a717fSMasatake YAMATO static EsObject* checkFieldValueForTyperef (const fieldDefinition *, const EsObject *);
100cbce4db2SMasatake YAMATO static EsObject* getFieldValueForScope (const tagEntryInfo *, const fieldDefinition *);
101cbce4db2SMasatake YAMATO static EsObject* setFieldValueForScope (tagEntryInfo *, const fieldDefinition *, const EsObject *);
102cbce4db2SMasatake YAMATO static EsObject* checkFieldValueForScope (const fieldDefinition *, const EsObject *);
103821f2c64SMasatake YAMATO static EsObject* getFieldValueForExtras (const tagEntryInfo *, const fieldDefinition *);
1041a38ddbbSMasatake YAMATO static EsObject* getFieldValueForAccess (const tagEntryInfo *, const fieldDefinition *);
1051a38ddbbSMasatake YAMATO static EsObject* setFieldValueForAccess (tagEntryInfo *, const fieldDefinition *, const EsObject *);
10689bad945SMasatake YAMATO static EsObject* getFieldValueForSignature (const tagEntryInfo *, const fieldDefinition *);
10789bad945SMasatake YAMATO static EsObject* setFieldValueForSignature (tagEntryInfo *, const fieldDefinition *, const EsObject *);
108faa51974SMasatake YAMATO static EsObject* getFieldValueForRoles (const tagEntryInfo *, const fieldDefinition *);
10958c76546SMasatake YAMATO static EsObject* getFieldValueForLineCommon (const tagEntryInfo *, const fieldDefinition *);
11058c76546SMasatake YAMATO static EsObject* checkFieldValueForLineCommon (const fieldDefinition *, const EsObject *);
11158c76546SMasatake YAMATO static EsObject* setFieldValueForLineCommon (tagEntryInfo *, const fieldDefinition *, const EsObject *);
11228e43d19SMasatake YAMATO static EsObject* setFieldValueForInherits (tagEntryInfo *, const fieldDefinition *, const EsObject *);
113ad51b948SMasatake YAMATO 
114abe66999SMasatake YAMATO #define WITH_DEFUALT_VALUE(str) ((str)?(str):FIELD_NULL_LETTER_STRING)
1152c3706afSMasatake YAMATO 
116b56bd065SMasatake YAMATO static fieldDefinition fieldDefinitionsFixed [] = {
117eeb8dee7SMasatake YAMATO 	[FIELD_NAME] = {
118eeb8dee7SMasatake YAMATO 		.letter             = 'N',
119eeb8dee7SMasatake YAMATO 		.name               = "name",
120eeb8dee7SMasatake YAMATO 		.description        = "tag name",
121eeb8dee7SMasatake YAMATO 		.enabled            = true,
122eeb8dee7SMasatake YAMATO 		.render             = renderFieldName,
123eeb8dee7SMasatake YAMATO 		.renderNoEscaping   = renderFieldNameNoEscape,
124eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = doesContainAnyCharInName,
125eeb8dee7SMasatake YAMATO 		.isValueAvailable   = NULL,
126eeb8dee7SMasatake YAMATO 		.dataType           = FIELDTYPE_STRING,
127ad51b948SMasatake YAMATO 		.getterValueType    = NULL,
128ad51b948SMasatake YAMATO 		.getValueObject     = getFieldValueForName,
129ad51b948SMasatake YAMATO 		.setterValueType    = NULL,
130ad51b948SMasatake YAMATO 		.checkValueForSetter= NULL,
131ad51b948SMasatake YAMATO 		.setValueObject     = setFieldValueForName,
132eeb8dee7SMasatake YAMATO 	},
133eeb8dee7SMasatake YAMATO 	[FIELD_INPUT_FILE] = {
134eeb8dee7SMasatake YAMATO 		.letter             = 'F',
135eeb8dee7SMasatake YAMATO 		.name               = "input",
136eeb8dee7SMasatake YAMATO 		.description        = "input file",
137eeb8dee7SMasatake YAMATO 		.enabled            = true,
138eeb8dee7SMasatake YAMATO 		.render             = renderFieldInput,
139eeb8dee7SMasatake YAMATO 		.renderNoEscaping   = renderFieldInputNoEscape,
140eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = doesContainAnyCharInInput,
141eeb8dee7SMasatake YAMATO 		.isValueAvailable   = NULL,
142eeb8dee7SMasatake YAMATO 		.dataType           = FIELDTYPE_STRING,
1433c63479cSMasatake YAMATO 		.getterValueType    = NULL,
1443c63479cSMasatake YAMATO 		.getValueObject     = getFieldValueForInput,
1453c63479cSMasatake YAMATO 		.setterValueType    = NULL,
1463c63479cSMasatake YAMATO 		.checkValueForSetter= NULL,
1473c63479cSMasatake YAMATO 		.setValueObject     = NULL,
148eeb8dee7SMasatake YAMATO 	},
149eeb8dee7SMasatake YAMATO 	[FIELD_PATTERN] = {
150eeb8dee7SMasatake YAMATO 		.letter             = 'P',
151eeb8dee7SMasatake YAMATO 		.name               = "pattern",
152eeb8dee7SMasatake YAMATO 		.description        = "pattern",
153eeb8dee7SMasatake YAMATO 		.enabled            = true,
154eeb8dee7SMasatake YAMATO 		.render             = renderFieldPattern,
155eeb8dee7SMasatake YAMATO 		.renderNoEscaping   = NULL,
156eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = NULL,
157eeb8dee7SMasatake YAMATO 		.isValueAvailable   = NULL,
158eeb8dee7SMasatake YAMATO 		.dataType           = FIELDTYPE_STRING|FIELDTYPE_BOOL,
159eeb8dee7SMasatake YAMATO 	},
16022f33d7aSMasatake YAMATO };
16122f33d7aSMasatake YAMATO 
162b56bd065SMasatake YAMATO static fieldDefinition fieldDefinitionsExuberant [] = {
1630b491fdfSMasatake YAMATO 	[FIELD_COMPACT_INPUT_LINE - FIELD_ECTAGS_START] = {
164eeb8dee7SMasatake YAMATO 		.letter             = 'C',
165eeb8dee7SMasatake YAMATO 		.name               = "compact",
166eeb8dee7SMasatake YAMATO 		.description        = "compact input line (used only in xref output)",
167eeb8dee7SMasatake YAMATO 		.enabled            = false,
168eeb8dee7SMasatake YAMATO 		.render             = renderFieldCompactInputLine,
169eeb8dee7SMasatake YAMATO 		.renderNoEscaping   = NULL,
170eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = NULL,
171eeb8dee7SMasatake YAMATO 		.isValueAvailable   = NULL,
172eeb8dee7SMasatake YAMATO 		.dataType           = FIELDTYPE_STRING,
173eeb8dee7SMasatake YAMATO 	},
1740b491fdfSMasatake YAMATO 	[FIELD_FILE_SCOPE - FIELD_ECTAGS_START] = {
175eeb8dee7SMasatake YAMATO 		.letter             = 'f',
176eeb8dee7SMasatake YAMATO 		.name               = "file",
177eeb8dee7SMasatake YAMATO 		.description        = "File-restricted scoping",
178eeb8dee7SMasatake YAMATO 		.enabled            = true,
179eeb8dee7SMasatake YAMATO 		.render             = renderFieldFile,
180eeb8dee7SMasatake YAMATO 		.renderNoEscaping   = NULL,
181eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = NULL,
182eeb8dee7SMasatake YAMATO 		.isValueAvailable   = isFileFieldAvailable,
183eeb8dee7SMasatake YAMATO 		.dataType           = FIELDTYPE_BOOL,
184eeb8dee7SMasatake YAMATO 	},
1850b491fdfSMasatake YAMATO 	[FIELD_KIND_LONG - FIELD_ECTAGS_START] = {
186eeb8dee7SMasatake YAMATO 		.letter             = 'K',
187eeb8dee7SMasatake YAMATO 		.name               = NULL,
188eeb8dee7SMasatake YAMATO 		.description        = "Kind of tag in long-name form",
189eeb8dee7SMasatake YAMATO 		.enabled            = false,
190eeb8dee7SMasatake YAMATO 		.render             = renderFieldKindName,
191eeb8dee7SMasatake YAMATO 		.renderNoEscaping   = NULL,
192eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = NULL,
193eeb8dee7SMasatake YAMATO 		.isValueAvailable   = NULL,
194eeb8dee7SMasatake YAMATO 		.dataType           = FIELDTYPE_STRING,
195eeb8dee7SMasatake YAMATO 	},
1960b491fdfSMasatake YAMATO 	[FIELD_KIND - FIELD_ECTAGS_START] = {
197eeb8dee7SMasatake YAMATO 		.letter             ='k',
198eeb8dee7SMasatake YAMATO 		.name               = NULL,
199eeb8dee7SMasatake YAMATO 		.description        = "Kind of tag in one-letter form",
200eeb8dee7SMasatake YAMATO 		.enabled            = true,
201eeb8dee7SMasatake YAMATO 		.render             = renderFieldKindLetter,
202eeb8dee7SMasatake YAMATO 		.renderNoEscaping   = NULL,
203eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = NULL,
204eeb8dee7SMasatake YAMATO 		.isValueAvailable   = NULL,
205eeb8dee7SMasatake YAMATO 		.dataType           = FIELDTYPE_STRING,
206eeb8dee7SMasatake YAMATO 	},
2070b491fdfSMasatake YAMATO 	[FIELD_LANGUAGE - FIELD_ECTAGS_START] = {
208eeb8dee7SMasatake YAMATO 		.letter             = 'l',
209eeb8dee7SMasatake YAMATO 		.name               = "language",
210eeb8dee7SMasatake YAMATO 		.description        = "Language of input file containing tag",
211eeb8dee7SMasatake YAMATO 		.enabled            = false,
212eeb8dee7SMasatake YAMATO 		.render             = renderFieldLanguage,
213eeb8dee7SMasatake YAMATO 		.renderNoEscaping   = NULL,
214eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = NULL,
215eeb8dee7SMasatake YAMATO 		.dataType           = FIELDTYPE_STRING,
216eeb8dee7SMasatake YAMATO 	},
2170b491fdfSMasatake YAMATO 	[FIELD_LINE_NUMBER - FIELD_ECTAGS_START] = {
218eeb8dee7SMasatake YAMATO 		.letter             = 'n',
219eeb8dee7SMasatake YAMATO 		.name               = "line",
220eeb8dee7SMasatake YAMATO 		.description        = "Line number of tag definition",
221eeb8dee7SMasatake YAMATO 		.enabled            = false,
222eeb8dee7SMasatake YAMATO 		.render             = renderFieldLineNumber,
223eeb8dee7SMasatake YAMATO 		.renderNoEscaping   = NULL,
224eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = NULL,
225eeb8dee7SMasatake YAMATO 		.isValueAvailable   = NULL,
226eeb8dee7SMasatake YAMATO 		.dataType           = FIELDTYPE_INTEGER,
22758c76546SMasatake YAMATO 		.getterValueType    = "int",
22858c76546SMasatake YAMATO 		.getValueObject     = getFieldValueForLineCommon,
229920c936fSMasatake YAMATO 		.setterValueType    = "matchloc|int",
23058c76546SMasatake YAMATO 		.checkValueForSetter= checkFieldValueForLineCommon,
23158c76546SMasatake YAMATO 		.setValueObject     = setFieldValueForLineCommon,
232eeb8dee7SMasatake YAMATO 	},
2330b491fdfSMasatake YAMATO 	[FIELD_SCOPE - FIELD_ECTAGS_START] = {
234eeb8dee7SMasatake YAMATO 		.letter				= 's',
235eeb8dee7SMasatake YAMATO 		.name				= NULL,
236eeb8dee7SMasatake YAMATO 		.description		= "[tags output] scope (kind:name) of tag definition, [xref and json output] name of scope",
237eeb8dee7SMasatake YAMATO 		.enabled			= true,
238eeb8dee7SMasatake YAMATO 		.render				= renderFieldScope,
239eeb8dee7SMasatake YAMATO 		.renderNoEscaping	= renderFieldScopeNoEscape,
240eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = doesContainAnyCharInFieldScope,
241eeb8dee7SMasatake YAMATO 		.isValueAvailable	= NULL,
242eeb8dee7SMasatake YAMATO 		.dataType			= FIELDTYPE_STRING,
243eeb8dee7SMasatake YAMATO 	},
2440b491fdfSMasatake YAMATO 	[FIELD_TYPE_REF - FIELD_ECTAGS_START] = {
245eeb8dee7SMasatake YAMATO 		.letter				= 't',
246eeb8dee7SMasatake YAMATO 		.name				= "typeref",
247eeb8dee7SMasatake YAMATO 		.description		= "Type and name of a variable or typedef",
248eeb8dee7SMasatake YAMATO 		.enabled			= true,
249eeb8dee7SMasatake YAMATO 		.render				= renderFieldTyperef,
250eeb8dee7SMasatake YAMATO 		.renderNoEscaping	= NULL,
251eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = NULL,
252eeb8dee7SMasatake YAMATO 		.isValueAvailable	= isTyperefFieldAvailable,
253eeb8dee7SMasatake YAMATO 		.dataType			= FIELDTYPE_STRING,
254d813f9edSMasatake YAMATO 		.getterValueType    = "[string string]",
255170a717fSMasatake YAMATO 		.getValueObject     = getFieldValueForTyperef,
256d813f9edSMasatake YAMATO 		.setterValueType    = "[string string]|string|index:int|false",
257170a717fSMasatake YAMATO 		.checkValueForSetter= checkFieldValueForTyperef,
258170a717fSMasatake YAMATO 		.setValueObject     = setFieldValueForTyperef,
259eeb8dee7SMasatake YAMATO 	},
2600b491fdfSMasatake YAMATO 	[FIELD_KIND_KEY - FIELD_ECTAGS_START] = {
261eeb8dee7SMasatake YAMATO 		.letter				= 'z',
262eeb8dee7SMasatake YAMATO 		.name				= "kind",
263eeb8dee7SMasatake YAMATO 		.description		= "[tags output] prepend \"kind:\" to k/ (or K/) field output, [xref and json output] kind in long-name form",
264eeb8dee7SMasatake YAMATO 		.enabled			= false,
2652682e1f2SMasatake YAMATO 		/* Following renderer is for handling --_xformat=%{kind};
2662682e1f2SMasatake YAMATO 		   and is not for tags output. */
267eeb8dee7SMasatake YAMATO 		.render				= renderFieldKindName,
268eeb8dee7SMasatake YAMATO 		.renderNoEscaping	= NULL,
269eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = NULL,
270eeb8dee7SMasatake YAMATO 		.isValueAvailable	= NULL,
271eeb8dee7SMasatake YAMATO 		.dataType			= FIELDTYPE_STRING,
2723aea379fSMasatake YAMATO 		.getterValueType    = "name",
2733aea379fSMasatake YAMATO 		.getValueObject     = getFieldValueForKind,
2743aea379fSMasatake YAMATO 		.setterValueType    = NULL,
2753aea379fSMasatake YAMATO 		.checkValueForSetter= NULL,
2763aea379fSMasatake YAMATO 		.setValueObject     = NULL,
277eeb8dee7SMasatake YAMATO 	},
2780b491fdfSMasatake YAMATO 	[FIELD_INHERITANCE - FIELD_ECTAGS_START] = {
2790b491fdfSMasatake YAMATO 		.letter             = 'i',
2800b491fdfSMasatake YAMATO 		.name               = "inherits",
2810b491fdfSMasatake YAMATO 		.description        = "Inheritance information",
2820b491fdfSMasatake YAMATO 		.enabled            = false,
2830b491fdfSMasatake YAMATO 		.render             = renderFieldInherits,
2840b491fdfSMasatake YAMATO 		.renderNoEscaping   = NULL,
2850b491fdfSMasatake YAMATO 		.doesContainAnyChar = NULL,
2860b491fdfSMasatake YAMATO 		.isValueAvailable   = isInheritsFieldAvailable,
2870b491fdfSMasatake YAMATO 		.dataType           = FIELDTYPE_STRING|FIELDTYPE_BOOL,
2880b491fdfSMasatake YAMATO 		.getterValueType    = NULL,
2890b491fdfSMasatake YAMATO 		.getValueObject     = NULL,
2900b491fdfSMasatake YAMATO 		.setterValueType    = NULL,
2910b491fdfSMasatake YAMATO 		.checkValueForSetter= NULL,
2920b491fdfSMasatake YAMATO 		.setValueObject     = setFieldValueForInherits,
2930b491fdfSMasatake YAMATO 	},
2940b491fdfSMasatake YAMATO 	[FIELD_ACCESS - FIELD_ECTAGS_START] = {
2950b491fdfSMasatake YAMATO 		.letter             = 'a',
2960b491fdfSMasatake YAMATO 		.name               = "access",
2970b491fdfSMasatake YAMATO 		.description        = "Access (or export) of class members",
2980b491fdfSMasatake YAMATO 		.enabled            = false,
2990b491fdfSMasatake YAMATO 		.render             = renderFieldAccess,
3000b491fdfSMasatake YAMATO 		.renderNoEscaping   = NULL,
3010b491fdfSMasatake YAMATO 		.doesContainAnyChar = NULL,
3020b491fdfSMasatake YAMATO 		.isValueAvailable   = isAccessFieldAvailable,
3030b491fdfSMasatake YAMATO 		.dataType           = FIELDTYPE_STRING,
3041a38ddbbSMasatake YAMATO 		.getterValueType    = NULL,
3051a38ddbbSMasatake YAMATO 		.getValueObject     = getFieldValueForAccess,
3061a38ddbbSMasatake YAMATO 		.setterValueType    = NULL,
3071a38ddbbSMasatake YAMATO 		.checkValueForSetter= NULL,
3081a38ddbbSMasatake YAMATO 		.setValueObject     = setFieldValueForAccess,
3090b491fdfSMasatake YAMATO 	},
3100b491fdfSMasatake YAMATO 	[FIELD_IMPLEMENTATION - FIELD_ECTAGS_START] = {
3110b491fdfSMasatake YAMATO 		.letter             = 'm',
3120b491fdfSMasatake YAMATO 		.name               = "implementation",
3130b491fdfSMasatake YAMATO 		.description        = "Implementation information",
3140b491fdfSMasatake YAMATO 		.enabled            = false,
3150b491fdfSMasatake YAMATO 		.render             = renderFieldImplementation,
3160b491fdfSMasatake YAMATO 		.renderNoEscaping   = NULL,
3170b491fdfSMasatake YAMATO 		.doesContainAnyChar = NULL,
3180b491fdfSMasatake YAMATO 		.isValueAvailable   = isImplementationFieldAvailable,
3190b491fdfSMasatake YAMATO 		.dataType           = FIELDTYPE_STRING,
3200b491fdfSMasatake YAMATO 
3210b491fdfSMasatake YAMATO 	},
3220b491fdfSMasatake YAMATO 	[FIELD_SIGNATURE - FIELD_ECTAGS_START] = {
3230b491fdfSMasatake YAMATO 		.letter				= 'S',
3240b491fdfSMasatake YAMATO 		.name				= "signature",
3250b491fdfSMasatake YAMATO 		.description		= "Signature of routine (e.g. prototype or parameter list)",
3260b491fdfSMasatake YAMATO 		.enabled			= false,
3270b491fdfSMasatake YAMATO 		.render				= renderFieldSignature,
3280b491fdfSMasatake YAMATO 		.renderNoEscaping	= renderFieldSignatureNoEscape,
3290b491fdfSMasatake YAMATO 		.doesContainAnyChar = doesContainAnyCharInSignature,
3300b491fdfSMasatake YAMATO 		.isValueAvailable	= isSignatureFieldAvailable,
3310b491fdfSMasatake YAMATO 		.dataType			= FIELDTYPE_STRING,
3320b491fdfSMasatake YAMATO 		.getterValueType    = NULL,
3330b491fdfSMasatake YAMATO 		.getValueObject     = getFieldValueForSignature,
3340b491fdfSMasatake YAMATO 		.setterValueType    = NULL,
3350b491fdfSMasatake YAMATO 		.checkValueForSetter= NULL,
3360b491fdfSMasatake YAMATO 		.setValueObject     = setFieldValueForSignature,
3370b491fdfSMasatake YAMATO 	},
33822f33d7aSMasatake YAMATO };
33922f33d7aSMasatake YAMATO 
340b56bd065SMasatake YAMATO static fieldDefinition fieldDefinitionsUniversal [] = {
3410b491fdfSMasatake YAMATO 	[FIELD_REF_MARK - FIELDS_UCTAGS_START] = {
342eeb8dee7SMasatake YAMATO 		.letter             = 'R',
343eeb8dee7SMasatake YAMATO 		.name				= NULL,
344eeb8dee7SMasatake YAMATO 		.description		= "Marker (R or D) representing whether tag is definition or reference",
345eeb8dee7SMasatake YAMATO 		.enabled			= false,
346eeb8dee7SMasatake YAMATO 		.render				= renderFieldRefMarker,
347eeb8dee7SMasatake YAMATO 		.renderNoEscaping	= NULL,
348eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = NULL,
349eeb8dee7SMasatake YAMATO 		.isValueAvailable	= NULL,
350eeb8dee7SMasatake YAMATO 		.dataType			= FIELDTYPE_STRING,
351eeb8dee7SMasatake YAMATO 	},
3520b491fdfSMasatake YAMATO 	[FIELD_SCOPE_KEY - FIELDS_UCTAGS_START] = {
353eeb8dee7SMasatake YAMATO 		.letter             = 'Z',
354eeb8dee7SMasatake YAMATO 		.name               = "scope",
355eeb8dee7SMasatake YAMATO 		.description        = "[tags output] prepend \"scope:\" key to s/scope field output, [xref and json output] the same as s/ field",
356eeb8dee7SMasatake YAMATO 		.enabled            = false,
3571b4642e2SMasatake YAMATO 		/* Following renderer is for handling --_xformat=%{scope};
3581b4642e2SMasatake YAMATO 		   and is not for tags output. */
359eeb8dee7SMasatake YAMATO 		.render             = renderFieldScope,
360eeb8dee7SMasatake YAMATO 		.renderNoEscaping   = renderFieldScopeNoEscape,
361eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = doesContainAnyCharInFieldScope,
362eeb8dee7SMasatake YAMATO 		.isValueAvailable   = NULL,
363eeb8dee7SMasatake YAMATO 		.dataType           = FIELDTYPE_STRING,
364cbce4db2SMasatake YAMATO 		.getterValueType    = "int",
365cbce4db2SMasatake YAMATO 		.getValueObject     = getFieldValueForScope,
366cbce4db2SMasatake YAMATO 		.setterValueType    = "int",
367cbce4db2SMasatake YAMATO 		.checkValueForSetter= checkFieldValueForScope,
368cbce4db2SMasatake YAMATO 		.setValueObject     = setFieldValueForScope,
369eeb8dee7SMasatake YAMATO 	},
3700b491fdfSMasatake YAMATO 	[FIELD_SCOPE_KIND_LONG - FIELDS_UCTAGS_START] = {
3710b491fdfSMasatake YAMATO 		.letter				= 'p',
3720b491fdfSMasatake YAMATO 		.name				= "scopeKind",
3730b491fdfSMasatake YAMATO 		.description		= "[tags output] no effect, [xref and json output] kind of scope in long-name form",
3740b491fdfSMasatake YAMATO 		.enabled			= false,
3750b491fdfSMasatake YAMATO 		.render				= renderFieldScopeKindName,
3760b491fdfSMasatake YAMATO 		.renderNoEscaping	= NULL,
3770b491fdfSMasatake YAMATO 		.doesContainAnyChar = NULL,
3780b491fdfSMasatake YAMATO 		.isValueAvailable	= NULL,
3790b491fdfSMasatake YAMATO 		.dataType			= FIELDTYPE_STRING,
3800b491fdfSMasatake YAMATO 	},
3810b491fdfSMasatake YAMATO 	[FIELD_ROLES - FIELDS_UCTAGS_START] = {
3820b491fdfSMasatake YAMATO 		.letter             = 'r',
3830b491fdfSMasatake YAMATO 		.name               = "roles",
3840b491fdfSMasatake YAMATO 		.description        = "Roles",
3850b491fdfSMasatake YAMATO 		.enabled            = false,
3860b491fdfSMasatake YAMATO 		.render             = renderFieldRoles,
3870b491fdfSMasatake YAMATO 		.renderNoEscaping   = NULL,
3880b491fdfSMasatake YAMATO 		.doesContainAnyChar = NULL,
3890b491fdfSMasatake YAMATO 		.isValueAvailable   = NULL,
3900b491fdfSMasatake YAMATO 		.dataType           = FIELDTYPE_STRING,
3910b491fdfSMasatake YAMATO 		.getterValueType    = "[ role1:name ... rolen:name ]",
3920b491fdfSMasatake YAMATO 		.getValueObject     = getFieldValueForRoles,
3930b491fdfSMasatake YAMATO 		.setterValueType    = NULL,
3940b491fdfSMasatake YAMATO 		.checkValueForSetter= NULL,
3950b491fdfSMasatake YAMATO 		.setValueObject     = NULL,
3960b491fdfSMasatake YAMATO 	},
3970b491fdfSMasatake YAMATO 	[FIELD_EXTRAS - FIELDS_UCTAGS_START] = {
398eeb8dee7SMasatake YAMATO 		.letter				= 'E',
399eeb8dee7SMasatake YAMATO 		.name				= "extras",
400eeb8dee7SMasatake YAMATO 		.description		= "Extra tag type information",
401eeb8dee7SMasatake YAMATO 		.enabled			= false,
402eeb8dee7SMasatake YAMATO 		.render				= renderFieldExtras,
403eeb8dee7SMasatake YAMATO 		.renderNoEscaping	= NULL,
404eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = NULL,
405eeb8dee7SMasatake YAMATO 		.isValueAvailable	= isExtrasFieldAvailable,
406eeb8dee7SMasatake YAMATO 		.dataType			= FIELDTYPE_STRING,
407821f2c64SMasatake YAMATO 		.getterValueType    = "[ extra1:name ... extran:name ]",
408821f2c64SMasatake YAMATO 		.getValueObject     = getFieldValueForExtras,
409821f2c64SMasatake YAMATO 		.setterValueType    = NULL,
410821f2c64SMasatake YAMATO 		.checkValueForSetter= NULL,
411821f2c64SMasatake YAMATO 		.setValueObject     = NULL,
412eeb8dee7SMasatake YAMATO 	},
4130b491fdfSMasatake YAMATO 	[FIELD_XPATH - FIELDS_UCTAGS_START] = {
414eeb8dee7SMasatake YAMATO 		.letter				= 'x',
415eeb8dee7SMasatake YAMATO 		.name				= "xpath",
416eeb8dee7SMasatake YAMATO 		.description		= "xpath for the tag",
417eeb8dee7SMasatake YAMATO 		.enabled			= false,
418eeb8dee7SMasatake YAMATO 		.render				= renderFieldXpath,
419eeb8dee7SMasatake YAMATO 		.renderNoEscaping	= NULL,
420eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = NULL,
421eeb8dee7SMasatake YAMATO 		.isValueAvailable	= isXpathFieldAvailable,
422eeb8dee7SMasatake YAMATO 		.dataType			= FIELDTYPE_STRING,
423eeb8dee7SMasatake YAMATO 	},
4240b491fdfSMasatake YAMATO 	[FIELD_END_LINE - FIELDS_UCTAGS_START] = {
425eeb8dee7SMasatake YAMATO 		.letter				= 'e',
426eeb8dee7SMasatake YAMATO 		.name				= "end",
427eeb8dee7SMasatake YAMATO 		.description		= "end lines of various items",
428eeb8dee7SMasatake YAMATO 		.enabled			= false,
429eeb8dee7SMasatake YAMATO 		.render				= renderFieldEnd,
430eeb8dee7SMasatake YAMATO 		.renderNoEscaping	= NULL,
431eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = NULL,
432eeb8dee7SMasatake YAMATO 		.isValueAvailable	= isEndFieldAvailable,
433eeb8dee7SMasatake YAMATO 		.dataType			= FIELDTYPE_INTEGER,
434c19ead26SMasatake YAMATO 		.getterValueType    = "int",
43558c76546SMasatake YAMATO 		.getValueObject     = getFieldValueForLineCommon,
436920c936fSMasatake YAMATO 		.setterValueType    = "matchloc|int",
43758c76546SMasatake YAMATO 		.checkValueForSetter= checkFieldValueForLineCommon,
43858c76546SMasatake YAMATO 		.setValueObject     = setFieldValueForLineCommon,
439c19ead26SMasatake YAMATO 
440eeb8dee7SMasatake YAMATO 	},
4410b491fdfSMasatake YAMATO 	[FIELD_EPOCH - FIELDS_UCTAGS_START] = {
442eeb8dee7SMasatake YAMATO 		.letter				= 'T',
443eeb8dee7SMasatake YAMATO 		.name				= "epoch",
444eeb8dee7SMasatake YAMATO 		.description		= "the last modified time of the input file (only for F/file kind tag)",
445eeb8dee7SMasatake YAMATO 		.enabled			= true,
446eeb8dee7SMasatake YAMATO 		.render				= renderFieldEpoch,
447eeb8dee7SMasatake YAMATO 		.renderNoEscaping	= NULL,
448eeb8dee7SMasatake YAMATO 		.doesContainAnyChar = NULL,
449eeb8dee7SMasatake YAMATO 		.isValueAvailable	= isEpochAvailable,
450eeb8dee7SMasatake YAMATO 		.dataType			= FIELDTYPE_INTEGER,
451eeb8dee7SMasatake YAMATO 	},
452f0a23ab8SMasatake YAMATO 	[FIELD_NTH - FIELDS_UCTAGS_START] = {
453f0a23ab8SMasatake YAMATO 		.letter				= 'o',
454f0a23ab8SMasatake YAMATO 		.name				= "nth",
455f0a23ab8SMasatake YAMATO 		.description		= "the order in the parent scope",
456f0a23ab8SMasatake YAMATO 		.enabled			= false,
457f0a23ab8SMasatake YAMATO 		.render				= renderFieldNth,
458f0a23ab8SMasatake YAMATO 		.renderNoEscaping	= NULL,
459f0a23ab8SMasatake YAMATO 		.doesContainAnyChar = NULL,
460f0a23ab8SMasatake YAMATO 		.isValueAvailable	= isNthAvailable,
461f0a23ab8SMasatake YAMATO 		.dataType			= FIELDTYPE_INTEGER,
462f0a23ab8SMasatake YAMATO 	},
4632894800fSMasatake YAMATO };
4642894800fSMasatake YAMATO 
46522f33d7aSMasatake YAMATO 
466f2af3ebdSMasatake YAMATO static unsigned int       fieldObjectUsed = 0;
467f2af3ebdSMasatake YAMATO static unsigned int       fieldObjectAllocated = 0;
468f2af3ebdSMasatake YAMATO static fieldObject* fieldObjects = NULL;
46922f33d7aSMasatake YAMATO 
initFieldObjects(void)470f2af3ebdSMasatake YAMATO extern void initFieldObjects (void)
47122f33d7aSMasatake YAMATO {
47246ab94ccSMasatake YAMATO 	unsigned int i;
47383c59ef1SMasatake YAMATO 	fieldObject *fobj;
4740c43d866SMasatake YAMATO 
475f2af3ebdSMasatake YAMATO 	Assert (fieldObjects == NULL);
47622f33d7aSMasatake YAMATO 
477f2af3ebdSMasatake YAMATO 	fieldObjectAllocated
478b56bd065SMasatake YAMATO 	  = ARRAY_SIZE (fieldDefinitionsFixed)
479b56bd065SMasatake YAMATO 	  + ARRAY_SIZE (fieldDefinitionsExuberant)
480b56bd065SMasatake YAMATO 	  + ARRAY_SIZE (fieldDefinitionsUniversal);
481f2af3ebdSMasatake YAMATO 	fieldObjects = xMalloc (fieldObjectAllocated, fieldObject);
48233a6fdb8SMasatake YAMATO 	DEFAULT_TRASH_BOX(&fieldObjects, eFreeIndirect);
48322f33d7aSMasatake YAMATO 
484f2af3ebdSMasatake YAMATO 	fieldObjectUsed = 0;
48522f33d7aSMasatake YAMATO 
486b56bd065SMasatake YAMATO 	for (i = 0; i < ARRAY_SIZE (fieldDefinitionsFixed); i++)
4870c43d866SMasatake YAMATO 	{
48883c59ef1SMasatake YAMATO 		fobj = fieldObjects + i + fieldObjectUsed;
48983c59ef1SMasatake YAMATO 		fobj->def = fieldDefinitionsFixed + i;
49083c59ef1SMasatake YAMATO 		fobj->buffer = NULL;
49183c59ef1SMasatake YAMATO 		fobj->nameWithPrefix = fobj->def->name;
49283c59ef1SMasatake YAMATO 		fobj->language = LANG_IGNORE;
49383c59ef1SMasatake YAMATO 		fobj->sibling  = FIELD_UNKNOWN;
4941ac79974SMasatake YAMATO 		fobj->def->ftype = i + fieldObjectUsed;
4950c43d866SMasatake YAMATO 	}
496f2af3ebdSMasatake YAMATO 	fieldObjectUsed += ARRAY_SIZE (fieldDefinitionsFixed);
49722f33d7aSMasatake YAMATO 
498b56bd065SMasatake YAMATO 	for (i = 0; i < ARRAY_SIZE (fieldDefinitionsExuberant); i++)
4990c43d866SMasatake YAMATO 	{
50083c59ef1SMasatake YAMATO 		fobj = fieldObjects + i + fieldObjectUsed;
50183c59ef1SMasatake YAMATO 		fobj->def = fieldDefinitionsExuberant +i;
50283c59ef1SMasatake YAMATO 		fobj->buffer = NULL;
50383c59ef1SMasatake YAMATO 		fobj->nameWithPrefix = fobj->def->name;
50483c59ef1SMasatake YAMATO 		fobj->language = LANG_IGNORE;
50583c59ef1SMasatake YAMATO 		fobj->sibling  = FIELD_UNKNOWN;
5061ac79974SMasatake YAMATO 		fobj->def->ftype = i + fieldObjectUsed;
5070c43d866SMasatake YAMATO 	}
508f2af3ebdSMasatake YAMATO 	fieldObjectUsed += ARRAY_SIZE (fieldDefinitionsExuberant);
50922f33d7aSMasatake YAMATO 
510b56bd065SMasatake YAMATO 	for (i = 0; i < ARRAY_SIZE (fieldDefinitionsUniversal); i++)
5110c43d866SMasatake YAMATO 	{
5120c43d866SMasatake YAMATO 		char *nameWithPrefix;
5130c43d866SMasatake YAMATO 
51483c59ef1SMasatake YAMATO 		fobj = fieldObjects + i + fieldObjectUsed;
51583c59ef1SMasatake YAMATO 		fobj->def = fieldDefinitionsUniversal + i;
51683c59ef1SMasatake YAMATO 		fobj->buffer = NULL;
5170c43d866SMasatake YAMATO 
51883c59ef1SMasatake YAMATO 		if (fobj->def->name)
5190c43d866SMasatake YAMATO 		{
52083c59ef1SMasatake YAMATO 			nameWithPrefix = eMalloc (sizeof CTAGS_FIELD_PREFIX + strlen (fobj->def->name) + 1);
5210c43d866SMasatake YAMATO 			nameWithPrefix [0] = '\0';
5220c43d866SMasatake YAMATO 			strcat (nameWithPrefix, CTAGS_FIELD_PREFIX);
52383c59ef1SMasatake YAMATO 			strcat (nameWithPrefix, fobj->def->name);
52483c59ef1SMasatake YAMATO 			fobj->nameWithPrefix = nameWithPrefix;
52533a6fdb8SMasatake YAMATO 			DEFAULT_TRASH_BOX(nameWithPrefix, eFree);
5260c43d866SMasatake YAMATO 		}
5270c43d866SMasatake YAMATO 		else
52883c59ef1SMasatake YAMATO 			fobj->nameWithPrefix = NULL;
52983c59ef1SMasatake YAMATO 		fobj->language = LANG_IGNORE;
53083c59ef1SMasatake YAMATO 		fobj->sibling  = FIELD_UNKNOWN;
5311ac79974SMasatake YAMATO 		fobj->def->ftype = i + fieldObjectUsed;
5320c43d866SMasatake YAMATO 	}
533f2af3ebdSMasatake YAMATO 	fieldObjectUsed += ARRAY_SIZE (fieldDefinitionsUniversal);
53422f33d7aSMasatake YAMATO 
535f2af3ebdSMasatake YAMATO 	Assert ( fieldObjectAllocated == fieldObjectUsed );
53622f33d7aSMasatake YAMATO }
53722f33d7aSMasatake YAMATO 
getFieldObject(fieldType type)538f2af3ebdSMasatake YAMATO static fieldObject* getFieldObject(fieldType type)
539028a8808SMasatake YAMATO {
54046ab94ccSMasatake YAMATO 	Assert ((0 <= type) && ((unsigned int)type < fieldObjectUsed));
541f2af3ebdSMasatake YAMATO 	return fieldObjects + type;
542028a8808SMasatake YAMATO }
543c7dcc0e3SMasatake YAMATO 
getFieldTypeForOption(char letter)5442894800fSMasatake YAMATO extern fieldType getFieldTypeForOption (char letter)
5452894800fSMasatake YAMATO {
546fd1f9e69SMasatake YAMATO 	unsigned int i;
5472894800fSMasatake YAMATO 
548f2af3ebdSMasatake YAMATO 	for (i = 0; i < fieldObjectUsed; i++)
5492894800fSMasatake YAMATO 	{
55083c59ef1SMasatake YAMATO 		if (fieldObjects [i].def->letter == letter)
5512894800fSMasatake YAMATO 			return i;
5522894800fSMasatake YAMATO 	}
5532894800fSMasatake YAMATO 	return FIELD_UNKNOWN;
5542894800fSMasatake YAMATO }
5552894800fSMasatake YAMATO 
getFieldTypeForName(const char * name)5565d1f9f22SMasatake YAMATO extern fieldType getFieldTypeForName (const char *name)
5575d1f9f22SMasatake YAMATO {
5585d1f9f22SMasatake YAMATO 	return getFieldTypeForNameAndLanguage (name, LANG_IGNORE);
5595d1f9f22SMasatake YAMATO }
5605d1f9f22SMasatake YAMATO 
getFieldTypeForNameAndLanguage(const char * fieldName,langType language)5618f2569d8SMasatake YAMATO extern fieldType getFieldTypeForNameAndLanguage (const char *fieldName, langType language)
562a696f376SMasatake YAMATO {
563ce990805SThomas Braun 	static bool initialized = false;
564fd1f9e69SMasatake YAMATO 	unsigned int i;
565a696f376SMasatake YAMATO 
5668f2569d8SMasatake YAMATO 	if (fieldName == NULL)
5671254e8d5SMasatake YAMATO 		return FIELD_UNKNOWN;
5681254e8d5SMasatake YAMATO 
569ce990805SThomas Braun 	if (language == LANG_AUTO && (initialized == false))
5708f2569d8SMasatake YAMATO 	{
571ce990805SThomas Braun 		initialized = true;
5725a26e8b2SMasatake YAMATO 		initializeParser (LANG_AUTO);
5738f2569d8SMasatake YAMATO 	}
574ce990805SThomas Braun 	else if (language != LANG_IGNORE && (initialized == false))
5758f2569d8SMasatake YAMATO 		initializeParser (language);
5768f2569d8SMasatake YAMATO 
577f2af3ebdSMasatake YAMATO 	for (i = 0; i < fieldObjectUsed; i++)
578a696f376SMasatake YAMATO 	{
57983c59ef1SMasatake YAMATO 		if (fieldObjects [i].def->name
58083c59ef1SMasatake YAMATO 		    && strcmp (fieldObjects [i].def->name, fieldName) == 0
5818f2569d8SMasatake YAMATO 		    && ((language == LANG_AUTO)
582f2af3ebdSMasatake YAMATO 			|| (fieldObjects [i].language == language)))
583a696f376SMasatake YAMATO 			return i;
584a696f376SMasatake YAMATO 	}
585a696f376SMasatake YAMATO 
586a696f376SMasatake YAMATO 	return FIELD_UNKNOWN;
5878f2569d8SMasatake YAMATO }
588a696f376SMasatake YAMATO 
getFieldDescription(fieldType type)5899ab0e076SMasatake YAMATO extern const char* getFieldDescription (fieldType type)
5909ab0e076SMasatake YAMATO {
5919ab0e076SMasatake YAMATO 	fieldObject* fobj;
5929ab0e076SMasatake YAMATO 
5939ab0e076SMasatake YAMATO 	fobj = getFieldObject (type);
5949ab0e076SMasatake YAMATO 	return fobj->def->description;
5959ab0e076SMasatake YAMATO }
5969ab0e076SMasatake YAMATO 
getFieldName(fieldType type)5975ac89ddbSMasatake YAMATO extern const char* getFieldName(fieldType type)
5985ac89ddbSMasatake YAMATO {
59983c59ef1SMasatake YAMATO 	fieldObject* fobj;
6005ac89ddbSMasatake YAMATO 
60183c59ef1SMasatake YAMATO 	fobj = getFieldObject (type);
6025ac89ddbSMasatake YAMATO 	if (Option.putFieldPrefix)
60383c59ef1SMasatake YAMATO 		return fobj->nameWithPrefix;
6045ac89ddbSMasatake YAMATO 	else
60583c59ef1SMasatake YAMATO 		return fobj->def->name;
6065ac89ddbSMasatake YAMATO }
6075ac89ddbSMasatake YAMATO 
getFieldLetter(fieldType type)6080c66c438SMasatake YAMATO extern unsigned char getFieldLetter (fieldType type)
6090c66c438SMasatake YAMATO {
6100c66c438SMasatake YAMATO 	fieldObject* fobj = getFieldObject (type);
6110c66c438SMasatake YAMATO 
6120c66c438SMasatake YAMATO 	return fobj->def->letter == '\0'
6130c66c438SMasatake YAMATO 		? FIELD_NULL_LETTER_CHAR
6140c66c438SMasatake YAMATO 		: fobj->def->letter;
6150c66c438SMasatake YAMATO }
6160c66c438SMasatake YAMATO 
doesFieldHaveValue(fieldType type,const tagEntryInfo * tag)617ce990805SThomas Braun extern bool doesFieldHaveValue (fieldType type, const tagEntryInfo *tag)
6185ed65c80SMasatake YAMATO {
61983c59ef1SMasatake YAMATO 	if (getFieldObject(type)->def->isValueAvailable)
62083c59ef1SMasatake YAMATO 		return getFieldObject(type)->def->isValueAvailable(tag);
6215ed65c80SMasatake YAMATO 	else
622ce990805SThomas Braun 		return true;
6235ed65c80SMasatake YAMATO }
6245ed65c80SMasatake YAMATO 
renderAsIs(vString * b CTAGS_ATTR_UNUSED,const char * s)6258ccb7ee9SJiří Techet static const char *renderAsIs (vString* b CTAGS_ATTR_UNUSED, const char *s)
6262c3706afSMasatake YAMATO {
6272c3706afSMasatake YAMATO 	return s;
6282c3706afSMasatake YAMATO }
6292c3706afSMasatake YAMATO 
renderEscapedString(const char * s,const tagEntryInfo * const tag CTAGS_ATTR_UNUSED,vString * b)6309022fbb4SMasatake YAMATO static const char *renderEscapedString (const char *s,
6318ccb7ee9SJiří Techet 					const tagEntryInfo *const tag CTAGS_ATTR_UNUSED,
6329022fbb4SMasatake YAMATO 					vString* b)
6339022fbb4SMasatake YAMATO {
634e8175bbbSMasatake YAMATO 	vStringCatSWithEscaping (b, s);
6359022fbb4SMasatake YAMATO 	return vStringValue (b);
6369022fbb4SMasatake YAMATO }
6379022fbb4SMasatake YAMATO 
renderEscapedName(const bool isTagName,const char * s,const tagEntryInfo * const tag,vString * b)63826b89887SColomban Wendling static const char *renderEscapedName (const bool isTagName,
63926b89887SColomban Wendling 				      const char* s,
6409022fbb4SMasatake YAMATO 				      const tagEntryInfo *const tag,
6419022fbb4SMasatake YAMATO 				      vString* b)
6429022fbb4SMasatake YAMATO {
64326b89887SColomban Wendling 	int unexpected_byte = 0;
6449022fbb4SMasatake YAMATO 
645b9636b4dSMasatake YAMATO 	if (isTagName && (!tag->isPseudoTag) &&  (*s == ' ' || *s == '!'))
6469022fbb4SMasatake YAMATO 	{
64726b89887SColomban Wendling 		/* Don't allow a leading space or exclamation mark as it conflicts with
64826b89887SColomban Wendling 		 * pseudo-tags when sorting.  Anything with a lower byte value is
64926b89887SColomban Wendling 		 * escaped by renderEscapedString() already. */
65026b89887SColomban Wendling 		unexpected_byte = *s;
6517195e6aaSColomban Wendling 		switch (*s)
6527195e6aaSColomban Wendling 		{
6537195e6aaSColomban Wendling 			case ' ': vStringCatS (b, "\\x20"); s++; break;
6547195e6aaSColomban Wendling 			case '!': vStringCatS (b, "\\x21"); s++; break;
6557195e6aaSColomban Wendling 			default: AssertNotReached();
6567195e6aaSColomban Wendling 		}
65726b89887SColomban Wendling 	}
65826b89887SColomban Wendling 	else
65926b89887SColomban Wendling 	{
66026b89887SColomban Wendling 		/* Find the first byte needing escaping for the warning message */
66126b89887SColomban Wendling 		const char *p = s;
66226b89887SColomban Wendling 
66326b89887SColomban Wendling 		while (*p > 0x1F && *p != 0x7F)
66426b89887SColomban Wendling 			p++;
66526b89887SColomban Wendling 		unexpected_byte = *p;
66626b89887SColomban Wendling 	}
66726b89887SColomban Wendling 
66826b89887SColomban Wendling 	if (unexpected_byte)
6699022fbb4SMasatake YAMATO 	{
6705405c226SColomban Wendling 		const kindDefinition *kdef = getTagKind (tag);
67126b89887SColomban Wendling 		verbose ("Unexpected character %#04x included in a tagEntryInfo: %s\n", unexpected_byte, s);
672b6d6eb9bSMasatake YAMATO 		verbose ("File: %s, Line: %lu, Lang: %s, Kind: %c\n",
673f92e6bf2SMasatake YAMATO 			 tag->inputFileName, tag->lineNumber, getLanguageName(tag->langType), kdef->letter);
674b6d6eb9bSMasatake YAMATO 		verbose ("Escape the character\n");
6759022fbb4SMasatake YAMATO 	}
6769022fbb4SMasatake YAMATO 
6779022fbb4SMasatake YAMATO 	return renderEscapedString (s, tag, b);
6789022fbb4SMasatake YAMATO }
6790b7e1f5dSMasatake YAMATO 
renderFieldName(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)6805e272693SMasatake YAMATO static const char *renderFieldName (const tagEntryInfo *const tag, const char *value CTAGS_ATTR_UNUSED, vString* b)
6810b7e1f5dSMasatake YAMATO {
68226b89887SColomban Wendling 	return renderEscapedName (true, tag->name, tag, b);
6830b7e1f5dSMasatake YAMATO }
6840b7e1f5dSMasatake YAMATO 
renderFieldNameNoEscape(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)6855e272693SMasatake YAMATO static const char *renderFieldNameNoEscape (const tagEntryInfo *const tag, const char *value CTAGS_ATTR_UNUSED, vString* b)
686581091f5SMasatake YAMATO {
687581091f5SMasatake YAMATO 	return renderAsIs (b, tag->name);
688581091f5SMasatake YAMATO }
689581091f5SMasatake YAMATO 
doesContainAnyCharInName(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,const char * chars)690c54f0614SMasatake YAMATO static bool doesContainAnyCharInName (const tagEntryInfo *const tag, const char *value CTAGS_ATTR_UNUSED, const char *chars)
6915e272693SMasatake YAMATO {
692c54f0614SMasatake YAMATO 	return strpbrk (tag->name, chars)? true: false;
6935e272693SMasatake YAMATO }
6945e272693SMasatake YAMATO 
renderFieldInput(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)6955e272693SMasatake YAMATO static const char *renderFieldInput (const tagEntryInfo *const tag, const char *value CTAGS_ATTR_UNUSED, vString* b)
6960b7e1f5dSMasatake YAMATO {
697784e5593SMasatake YAMATO 	const char *f = tag->inputFileName;
698784e5593SMasatake YAMATO 
699784e5593SMasatake YAMATO 	if (Option.lineDirectives && tag->sourceFileName)
700784e5593SMasatake YAMATO 		f = tag->sourceFileName;
701784e5593SMasatake YAMATO 	return renderEscapedString (f, tag, b);
7020b7e1f5dSMasatake YAMATO }
7030b7e1f5dSMasatake YAMATO 
renderFieldInputNoEscape(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)7045e272693SMasatake YAMATO static const char *renderFieldInputNoEscape (const tagEntryInfo *const tag, const char *value CTAGS_ATTR_UNUSED, vString* b)
705d2d7b29cSMasatake YAMATO {
706d2d7b29cSMasatake YAMATO 	const char *f = tag->inputFileName;
707d2d7b29cSMasatake YAMATO 
708d2d7b29cSMasatake YAMATO 	if (Option.lineDirectives && tag->sourceFileName)
709d2d7b29cSMasatake YAMATO 		f = tag->sourceFileName;
710d2d7b29cSMasatake YAMATO 
711d2d7b29cSMasatake YAMATO 	return renderAsIs (b, f);
712d2d7b29cSMasatake YAMATO }
713d2d7b29cSMasatake YAMATO 
doesContainAnyCharInInput(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,const char * chars)714c54f0614SMasatake YAMATO static bool doesContainAnyCharInInput (const tagEntryInfo *const tag, const char *value CTAGS_ATTR_UNUSED, const char *chars)
7155e272693SMasatake YAMATO {
7165e272693SMasatake YAMATO 	const char *f = tag->inputFileName;
7175e272693SMasatake YAMATO 
7185e272693SMasatake YAMATO 	if (Option.lineDirectives && tag->sourceFileName)
7195e272693SMasatake YAMATO 		f = tag->sourceFileName;
7205e272693SMasatake YAMATO 
721c54f0614SMasatake YAMATO 	return strpbrk (f, chars)? true: false;
7225e272693SMasatake YAMATO }
7235e272693SMasatake YAMATO 
renderFieldSignature(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)7245e272693SMasatake YAMATO static const char *renderFieldSignature (const tagEntryInfo *const tag, const char *value CTAGS_ATTR_UNUSED, vString* b)
7250b7e1f5dSMasatake YAMATO {
7262c3706afSMasatake YAMATO 	return renderEscapedString (WITH_DEFUALT_VALUE (tag->extensionFields.signature),
7272c3706afSMasatake YAMATO 				    tag, b);
7280b7e1f5dSMasatake YAMATO }
7290b7e1f5dSMasatake YAMATO 
renderFieldSignatureNoEscape(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)730ba82e4f4SMasatake YAMATO static const char *renderFieldSignatureNoEscape (const tagEntryInfo *const tag, const char *value CTAGS_ATTR_UNUSED, vString* b)
731ba82e4f4SMasatake YAMATO {
732ba82e4f4SMasatake YAMATO 	return renderAsIs (b, WITH_DEFUALT_VALUE (tag->extensionFields.signature));
733ba82e4f4SMasatake YAMATO }
734ba82e4f4SMasatake YAMATO 
doesContainAnyCharInSignature(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,const char * chars)735c54f0614SMasatake YAMATO static bool doesContainAnyCharInSignature (const tagEntryInfo *const tag, const char *value CTAGS_ATTR_UNUSED, const char *chars)
736ba82e4f4SMasatake YAMATO {
737c54f0614SMasatake YAMATO 	return (tag->extensionFields.signature && strpbrk(tag->extensionFields.signature, chars))
738ba82e4f4SMasatake YAMATO 		? true
739ba82e4f4SMasatake YAMATO 		: false;
740ba82e4f4SMasatake YAMATO }
741ba82e4f4SMasatake YAMATO 
renderFieldScope(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)7425e272693SMasatake YAMATO static const char *renderFieldScope (const tagEntryInfo *const tag, const char *value CTAGS_ATTR_UNUSED, vString* b)
7430b7e1f5dSMasatake YAMATO {
74426157099SMasatake YAMATO 	const char* scope;
74526157099SMasatake YAMATO 
74626157099SMasatake YAMATO 	getTagScopeInformation ((tagEntryInfo *const)tag, NULL, &scope);
74726b89887SColomban Wendling 	return scope? renderEscapedName (false, scope, tag, b): NULL;
7480b7e1f5dSMasatake YAMATO }
7490b7e1f5dSMasatake YAMATO 
renderFieldScopeNoEscape(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)7505e272693SMasatake YAMATO static const char *renderFieldScopeNoEscape (const tagEntryInfo *const tag, const char *value CTAGS_ATTR_UNUSED, vString* b)
751852faf58SMasatake YAMATO {
752852faf58SMasatake YAMATO 	const char* scope;
753852faf58SMasatake YAMATO 
754852faf58SMasatake YAMATO 	getTagScopeInformation ((tagEntryInfo *const)tag, NULL, &scope);
755852faf58SMasatake YAMATO 	return scope? renderAsIs (b, scope): NULL;
756852faf58SMasatake YAMATO }
757852faf58SMasatake YAMATO 
doesContainAnyCharInFieldScope(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,const char * chars)758c54f0614SMasatake YAMATO static bool doesContainAnyCharInFieldScope (const tagEntryInfo *const tag, const char *value CTAGS_ATTR_UNUSED, const char *chars)
7595e272693SMasatake YAMATO {
7605e272693SMasatake YAMATO 	const char* scope;
7615e272693SMasatake YAMATO 
7625e272693SMasatake YAMATO 	getTagScopeInformation ((tagEntryInfo *const)tag, NULL, &scope);
763c54f0614SMasatake YAMATO 	return (scope && strpbrk (scope, chars));
7645e272693SMasatake YAMATO }
7655e272693SMasatake YAMATO 
7665e272693SMasatake YAMATO 
renderFieldInherits(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)7675e272693SMasatake YAMATO static const char *renderFieldInherits (const tagEntryInfo *const tag, const char *value CTAGS_ATTR_UNUSED, vString* b)
7680b7e1f5dSMasatake YAMATO {
7692c3706afSMasatake YAMATO 	return renderEscapedString (WITH_DEFUALT_VALUE (tag->extensionFields.inheritance),
7702c3706afSMasatake YAMATO 				    tag, b);
7710b7e1f5dSMasatake YAMATO }
7720b7e1f5dSMasatake YAMATO 
renderFieldTyperef(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)7735e272693SMasatake YAMATO static const char *renderFieldTyperef (const tagEntryInfo *const tag, const char *value CTAGS_ATTR_UNUSED, vString* b)
7740b7e1f5dSMasatake YAMATO {
7755082c510SMasatake YAMATO 	/* Return "-" instead of "-:-". */
7765082c510SMasatake YAMATO 	if (tag->extensionFields.typeRef [0] == NULL
7775082c510SMasatake YAMATO 		&& tag->extensionFields.typeRef [1] == NULL)
778abe66999SMasatake YAMATO 		return renderAsIs (b, FIELD_NULL_LETTER_STRING);
7795082c510SMasatake YAMATO 
7805082c510SMasatake YAMATO 	vStringCatS (b, WITH_DEFUALT_VALUE (tag->extensionFields.typeRef [0]));
7815082c510SMasatake YAMATO 	vStringPut  (b, ':');
78226b89887SColomban Wendling 	return renderEscapedName (false, WITH_DEFUALT_VALUE (tag->extensionFields.typeRef [1]), tag, b);
7830b7e1f5dSMasatake YAMATO }
7840b7e1f5dSMasatake YAMATO 
7850b7e1f5dSMasatake YAMATO 
renderFieldCommon(fieldType type,const tagEntryInfo * tag,int index,bool noEscaping)7865e272693SMasatake YAMATO static const char* renderFieldCommon (fieldType type,
787cc2cd3ceSMasatake YAMATO 									  const tagEntryInfo *tag,
788c9822518SMasatake YAMATO 									  int index,
7895e272693SMasatake YAMATO 									  bool noEscaping)
7900b7e1f5dSMasatake YAMATO {
79183c59ef1SMasatake YAMATO 	fieldObject *fobj = fieldObjects + type;
792cc2cd3ceSMasatake YAMATO 	const char *value;
7935e272693SMasatake YAMATO 	fieldRenderer rfn;
794efae38f9SMasatake YAMATO 
7950b7e1f5dSMasatake YAMATO 	Assert (tag);
79646ab94ccSMasatake YAMATO 	Assert (index < 0 || ((unsigned int)index) < tag->usedParserFields);
7970b7e1f5dSMasatake YAMATO 
798cc2cd3ceSMasatake YAMATO 	if (index >= 0)
799cc2cd3ceSMasatake YAMATO 	{
8009353c835SMasatake YAMATO 		const tagField *f = getParserFieldForIndex (tag, index);
8014e9e52c2SMasatake YAMATO 
8024e9e52c2SMasatake YAMATO 		value = f->value;
803cc2cd3ceSMasatake YAMATO 	}
804cc2cd3ceSMasatake YAMATO 	else
805cc2cd3ceSMasatake YAMATO 		value = NULL;
806cc2cd3ceSMasatake YAMATO 
8075e272693SMasatake YAMATO 	if (noEscaping)
8085e272693SMasatake YAMATO 		rfn = fobj->def->renderNoEscaping;
8095e272693SMasatake YAMATO 	else
8105e272693SMasatake YAMATO 		rfn = fobj->def->render;
8115e272693SMasatake YAMATO 	Assert (rfn);
812c9822518SMasatake YAMATO 
8135e272693SMasatake YAMATO 	fobj->buffer = vStringNewOrClearWithAutoRelease (fobj->buffer);
8145e272693SMasatake YAMATO 	return rfn (tag, value, fobj->buffer);
8155e272693SMasatake YAMATO }
8165e272693SMasatake YAMATO 
renderField(fieldType type,const tagEntryInfo * tag,int index)8175e272693SMasatake YAMATO extern const char* renderField (fieldType type, const tagEntryInfo *tag, int index)
8185e272693SMasatake YAMATO {
8195e272693SMasatake YAMATO 	return renderFieldCommon (type, tag, index, false);
8205e272693SMasatake YAMATO }
8215e272693SMasatake YAMATO 
renderFieldNoEscaping(fieldType type,const tagEntryInfo * tag,int index)8225e272693SMasatake YAMATO extern const char* renderFieldNoEscaping (fieldType type, const tagEntryInfo *tag, int index)
8235e272693SMasatake YAMATO {
8245e272693SMasatake YAMATO 	return renderFieldCommon (type, tag, index, true);
8255e272693SMasatake YAMATO }
8265e272693SMasatake YAMATO 
defaultDoesContainAnyChar(const tagEntryInfo * const tag CTAGS_ATTR_UNUSED,const char * value,const char * chars)827c54f0614SMasatake YAMATO static bool defaultDoesContainAnyChar (const tagEntryInfo *const tag CTAGS_ATTR_UNUSED, const char* value, const char* chars)
82810241d1bSMasatake YAMATO {
829c54f0614SMasatake YAMATO 	return strpbrk (value, chars)? true: false;
83010241d1bSMasatake YAMATO }
83110241d1bSMasatake YAMATO 
doesFieldHaveTabOrNewlineChar(fieldType type,const tagEntryInfo * tag,int index)8320647c2a9SMasatake YAMATO extern bool  doesFieldHaveTabOrNewlineChar (fieldType type, const tagEntryInfo *tag, int index)
8335e272693SMasatake YAMATO {
8345e272693SMasatake YAMATO 	fieldObject *fobj = fieldObjects + type;
8355e272693SMasatake YAMATO 	const char *value;
836c54f0614SMasatake YAMATO 	bool (* doesContainAnyChar) (const tagEntryInfo *const, const char*, const char*) = fobj->def->doesContainAnyChar;
8375e272693SMasatake YAMATO 
8385e272693SMasatake YAMATO 	Assert (tag);
83910241d1bSMasatake YAMATO 	Assert (index == NO_PARSER_FIELD || ((unsigned int)index) < tag->usedParserFields);
84010241d1bSMasatake YAMATO 
841c54f0614SMasatake YAMATO 	if (doesContainAnyChar == NULL)
84210241d1bSMasatake YAMATO 	{
84310241d1bSMasatake YAMATO 		if (index == NO_PARSER_FIELD)
84410241d1bSMasatake YAMATO 			return false;
84510241d1bSMasatake YAMATO 		else
846c54f0614SMasatake YAMATO 			doesContainAnyChar = defaultDoesContainAnyChar;
84710241d1bSMasatake YAMATO 	}
8485e272693SMasatake YAMATO 
8495e272693SMasatake YAMATO 	if (index >= 0)
8505e272693SMasatake YAMATO 	{
8519353c835SMasatake YAMATO 		const tagField *f = getParserFieldForIndex (tag, index);
8525e272693SMasatake YAMATO 
8535e272693SMasatake YAMATO 		value = f->value;
8545e272693SMasatake YAMATO 	}
8555e272693SMasatake YAMATO 	else
8565e272693SMasatake YAMATO 		value = NULL;
8575e272693SMasatake YAMATO 
858c54f0614SMasatake YAMATO 	return (* doesContainAnyChar) (tag, value, "\t\n");
8590b7e1f5dSMasatake YAMATO }
8600b7e1f5dSMasatake YAMATO 
86172b1490cSMasatake YAMATO /*  Writes "line", stripping leading and duplicate white space.
86272b1490cSMasatake YAMATO  */
renderCompactInputLine(vString * b,const char * const line)863123deefaSMasatake YAMATO static const char* renderCompactInputLine (vString *b,  const char *const line)
86472b1490cSMasatake YAMATO {
865ce990805SThomas Braun 	bool lineStarted = false;
86672b1490cSMasatake YAMATO 	const char *p;
86772b1490cSMasatake YAMATO 	int c;
86872b1490cSMasatake YAMATO 
86972b1490cSMasatake YAMATO 	/*  Write everything up to, but not including, the newline.
87072b1490cSMasatake YAMATO 	 */
87172b1490cSMasatake YAMATO 	for (p = line, c = *p  ;  c != NEWLINE  &&  c != '\0'  ;  c = *++p)
87272b1490cSMasatake YAMATO 	{
87372b1490cSMasatake YAMATO 		if (lineStarted  || ! isspace (c))  /* ignore leading spaces */
87472b1490cSMasatake YAMATO 		{
875ce990805SThomas Braun 			lineStarted = true;
87672b1490cSMasatake YAMATO 			if (isspace (c))
87772b1490cSMasatake YAMATO 			{
87872b1490cSMasatake YAMATO 				int next;
87972b1490cSMasatake YAMATO 
88072b1490cSMasatake YAMATO 				/*  Consume repeating white space.
88172b1490cSMasatake YAMATO 				 */
88272b1490cSMasatake YAMATO 				while (next = *(p+1) , isspace (next)  &&  next != NEWLINE)
88372b1490cSMasatake YAMATO 					++p;
88472b1490cSMasatake YAMATO 				c = ' ';  /* force space character for any white space */
88572b1490cSMasatake YAMATO 			}
88672b1490cSMasatake YAMATO 			if (c != CRETURN  ||  *(p + 1) != NEWLINE)
88772b1490cSMasatake YAMATO 				vStringPut (b, c);
88872b1490cSMasatake YAMATO 		}
88972b1490cSMasatake YAMATO 	}
89072b1490cSMasatake YAMATO 	return vStringValue (b);
89172b1490cSMasatake YAMATO }
89272b1490cSMasatake YAMATO 
renderFieldKindName(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)8935e272693SMasatake YAMATO static const char *renderFieldKindName (const tagEntryInfo *const tag, const char *value CTAGS_ATTR_UNUSED, vString* b)
8942c3706afSMasatake YAMATO {
895f92e6bf2SMasatake YAMATO 	const char* name = getTagKindName (tag);
896f92e6bf2SMasatake YAMATO 	return renderAsIs (b, name);
8972c3706afSMasatake YAMATO }
8982c3706afSMasatake YAMATO 
renderFieldCompactInputLine(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)899123deefaSMasatake YAMATO static const char *renderFieldCompactInputLine (const tagEntryInfo *const tag,
9008ccb7ee9SJiří Techet 						const char *value CTAGS_ATTR_UNUSED,
9015e272693SMasatake YAMATO 						 vString* b)
90272b1490cSMasatake YAMATO {
90372b1490cSMasatake YAMATO 	const char *line;
9040a32d0abSMasatake YAMATO 	static vString *tmp;
90572b1490cSMasatake YAMATO 
906b9636b4dSMasatake YAMATO 	if (tag->isPseudoTag)
907b9636b4dSMasatake YAMATO 	{
908b9636b4dSMasatake YAMATO 		Assert (tag->pattern);
909b9636b4dSMasatake YAMATO 		return tag->pattern;
910b9636b4dSMasatake YAMATO 	}
911b9636b4dSMasatake YAMATO 
91256065e52SMasatake YAMATO 	tmp = vStringNewOrClearWithAutoRelease (tmp);
9130a32d0abSMasatake YAMATO 
914c8c97f1cSMasatake YAMATO 	line = readLineFromBypassForTag (tmp, tag, NULL);
91572b1490cSMasatake YAMATO 	if (line)
916123deefaSMasatake YAMATO 		renderCompactInputLine (b, line);
91772b1490cSMasatake YAMATO 	else
91872b1490cSMasatake YAMATO 	{
91972b1490cSMasatake YAMATO 		/* If no associated line for tag is found, we cannot prepare
920123deefaSMasatake YAMATO 		 * parameter to writeCompactInputLine(). In this case we
92172b1490cSMasatake YAMATO 		 * use an empty string as LINE.
92272b1490cSMasatake YAMATO 		 */
92372b1490cSMasatake YAMATO 		vStringClear (b);
92472b1490cSMasatake YAMATO 	}
92572b1490cSMasatake YAMATO 
92672b1490cSMasatake YAMATO 	return vStringValue (b);
92772b1490cSMasatake YAMATO }
92872b1490cSMasatake YAMATO 
renderFieldLineNumber(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)929cc2cd3ceSMasatake YAMATO static const char *renderFieldLineNumber (const tagEntryInfo *const tag,
9308ccb7ee9SJiří Techet 					  const char *value CTAGS_ATTR_UNUSED,
9315e272693SMasatake YAMATO 					  vString* b)
9322c3706afSMasatake YAMATO {
933784e5593SMasatake YAMATO 	long ln = tag->lineNumber;
9342c3706afSMasatake YAMATO 	char buf[32] = {[0] = '\0'};
935784e5593SMasatake YAMATO 
936784e5593SMasatake YAMATO 	if (Option.lineDirectives && (tag->sourceLineNumberDifference != 0))
937784e5593SMasatake YAMATO 		ln += tag->sourceLineNumberDifference;
938784e5593SMasatake YAMATO 	snprintf (buf, sizeof(buf), "%ld", ln);
9392c3706afSMasatake YAMATO 	vStringCatS (b, buf);
9402c3706afSMasatake YAMATO 	return vStringValue (b);
9412c3706afSMasatake YAMATO }
9422c3706afSMasatake YAMATO 
9436c9da7faSMasatake YAMATO struct renderRoleData {
9446c9da7faSMasatake YAMATO 	vString* b;
9456c9da7faSMasatake YAMATO 	int nRoleWritten;
9466c9da7faSMasatake YAMATO };
9476c9da7faSMasatake YAMATO 
renderRoleByIndex(const tagEntryInfo * const tag,int roleIndex,void * data)9486c9da7faSMasatake YAMATO static void renderRoleByIndex (const tagEntryInfo *const tag, int roleIndex, void *data)
9496c9da7faSMasatake YAMATO {
9506c9da7faSMasatake YAMATO 	struct renderRoleData *rdata = data;
9516c9da7faSMasatake YAMATO 
9526c9da7faSMasatake YAMATO 	if (!isLanguageRoleEnabled (tag->langType, tag->kindIndex, roleIndex))
9536c9da7faSMasatake YAMATO 		return;
9546c9da7faSMasatake YAMATO 
9556c9da7faSMasatake YAMATO 	if (rdata->nRoleWritten > 0)
9566c9da7faSMasatake YAMATO 		vStringPut(rdata->b, ',');
9576c9da7faSMasatake YAMATO 
9586c9da7faSMasatake YAMATO 	const roleDefinition * role = getTagRole(tag, roleIndex);
9596c9da7faSMasatake YAMATO 	renderRole (role, rdata->b);
9606c9da7faSMasatake YAMATO 	rdata->nRoleWritten++;
9616c9da7faSMasatake YAMATO }
9626c9da7faSMasatake YAMATO 
foreachRoleBits(const tagEntryInfo * const tag,void (* fn)(const tagEntryInfo * const,int,void *),void * data)9636c9da7faSMasatake YAMATO static roleBitsType foreachRoleBits (const tagEntryInfo *const tag,
9646c9da7faSMasatake YAMATO 									 void (* fn) (const tagEntryInfo *const, int, void *),
9656c9da7faSMasatake YAMATO 									 void *data)
9666c9da7faSMasatake YAMATO {
9676c9da7faSMasatake YAMATO 	roleBitsType rbits = tag->extensionFields.roleBits;
9686c9da7faSMasatake YAMATO 	if (!rbits)
9696c9da7faSMasatake YAMATO 		return rbits;
9706c9da7faSMasatake YAMATO 
9716c9da7faSMasatake YAMATO 	int roleCount = countLanguageRoles (tag->langType, tag->kindIndex);
9726c9da7faSMasatake YAMATO 
9736c9da7faSMasatake YAMATO 	for (int roleIndex = 0; roleIndex < roleCount; roleIndex++)
9746c9da7faSMasatake YAMATO 	{
9756c9da7faSMasatake YAMATO 		if ((rbits >> roleIndex) & (roleBitsType)1)
9766c9da7faSMasatake YAMATO 			fn (tag, roleIndex, data);
9776c9da7faSMasatake YAMATO 	}
9786c9da7faSMasatake YAMATO 	return rbits;
9796c9da7faSMasatake YAMATO }
9806c9da7faSMasatake YAMATO 
renderFieldRoles(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)9819062cbc8SMasatake YAMATO static const char *renderFieldRoles (const tagEntryInfo *const tag,
9828ccb7ee9SJiří Techet 				    const char *value CTAGS_ATTR_UNUSED,
9835e272693SMasatake YAMATO 				    vString* b)
984e2755fdeSMasatake YAMATO {
9856c9da7faSMasatake YAMATO 	struct renderRoleData data = { .b = b, .nRoleWritten = 0 };
986e2755fdeSMasatake YAMATO 
9876c9da7faSMasatake YAMATO 	if (!foreachRoleBits (tag, renderRoleByIndex, &data))
98824b256e3SMasatake YAMATO 		vStringCatS (b, ROLE_DEFINITION_NAME);
989e2755fdeSMasatake YAMATO 	return vStringValue (b);
990e2755fdeSMasatake YAMATO }
991e2755fdeSMasatake YAMATO 
renderFieldLanguage(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)992cc2cd3ceSMasatake YAMATO static const char *renderFieldLanguage (const tagEntryInfo *const tag,
9938ccb7ee9SJiří Techet 					const char *value CTAGS_ATTR_UNUSED,
9945e272693SMasatake YAMATO 					vString* b)
9952c3706afSMasatake YAMATO {
9965bd00ccbSMasatake YAMATO 	const char *l;
997784e5593SMasatake YAMATO 
9985bd00ccbSMasatake YAMATO 	if (Option.lineDirectives && (tag->sourceLangType != LANG_IGNORE))
9995bd00ccbSMasatake YAMATO 		l = getLanguageName(tag->sourceLangType);
10005bd00ccbSMasatake YAMATO 	else
1001634b869cSMasatake YAMATO 	{
1002634b869cSMasatake YAMATO 		Assert (tag->langType != LANG_IGNORE);
10035bd00ccbSMasatake YAMATO 		l = getLanguageName(tag->langType);
1004634b869cSMasatake YAMATO 	}
1005784e5593SMasatake YAMATO 
1006784e5593SMasatake YAMATO 	return renderAsIs (b, WITH_DEFUALT_VALUE(l));
10072c3706afSMasatake YAMATO }
10082c3706afSMasatake YAMATO 
renderFieldAccess(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)1009cc2cd3ceSMasatake YAMATO static const char *renderFieldAccess (const tagEntryInfo *const tag,
1010e4d16241SMasatake YAMATO 				      const char *value CTAGS_ATTR_UNUSED,
10115e272693SMasatake YAMATO 				      vString* b)
10122c3706afSMasatake YAMATO {
10132c3706afSMasatake YAMATO 	return renderAsIs (b, WITH_DEFUALT_VALUE (tag->extensionFields.access));
10142c3706afSMasatake YAMATO }
10152c3706afSMasatake YAMATO 
renderFieldKindLetter(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)1016cc2cd3ceSMasatake YAMATO static const char *renderFieldKindLetter (const tagEntryInfo *const tag,
10178ccb7ee9SJiří Techet 					  const char *value CTAGS_ATTR_UNUSED,
10185e272693SMasatake YAMATO 					  vString* b)
10192c3706afSMasatake YAMATO {
10202c3706afSMasatake YAMATO 	static char c[2] = { [1] = '\0' };
10212c3706afSMasatake YAMATO 
1022f92e6bf2SMasatake YAMATO 	c [0] = getTagKindLetter(tag);
10232c3706afSMasatake YAMATO 
10242c3706afSMasatake YAMATO 	return renderAsIs (b, c);
10252c3706afSMasatake YAMATO }
10262c3706afSMasatake YAMATO 
renderFieldImplementation(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)1027cc2cd3ceSMasatake YAMATO static const char *renderFieldImplementation (const tagEntryInfo *const tag,
10288ccb7ee9SJiří Techet 					      const char *value CTAGS_ATTR_UNUSED,
10295e272693SMasatake YAMATO 					      vString* b)
10302c3706afSMasatake YAMATO {
10312c3706afSMasatake YAMATO 	return renderAsIs (b, WITH_DEFUALT_VALUE (tag->extensionFields.implementation));
10322c3706afSMasatake YAMATO }
10332c3706afSMasatake YAMATO 
renderFieldFile(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)1034cc2cd3ceSMasatake YAMATO static const char *renderFieldFile (const tagEntryInfo *const tag,
10358ccb7ee9SJiří Techet 				    const char *value CTAGS_ATTR_UNUSED,
10365e272693SMasatake YAMATO 				    vString* b)
10375a53e53aSMasatake YAMATO {
1038abe66999SMasatake YAMATO 	return renderAsIs (b, tag->isFileScope? "file": FIELD_NULL_LETTER_STRING);
10395a53e53aSMasatake YAMATO }
10405a53e53aSMasatake YAMATO 
renderFieldPattern(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)1041d8018a25SMasatake YAMATO static const char *renderFieldPattern (const tagEntryInfo *const tag,
10428ccb7ee9SJiří Techet 				       const char *value CTAGS_ATTR_UNUSED,
10435e272693SMasatake YAMATO 				       vString* b)
104468963447SMasatake YAMATO {
10450a1d1bbbSMasatake YAMATO 	if (tag->isFileEntry)
10461e25caaaSMasatake YAMATO 		return NULL;
10470a1d1bbbSMasatake YAMATO 	else if (tag->pattern)
10481e25caaaSMasatake YAMATO 		vStringCatS (b, tag->pattern);
10491e25caaaSMasatake YAMATO 	else
10501e25caaaSMasatake YAMATO 	{
10511e25caaaSMasatake YAMATO 		char* tmp;
10521e25caaaSMasatake YAMATO 
10531e25caaaSMasatake YAMATO 		tmp = makePatternString (tag);
105468963447SMasatake YAMATO 		vStringCatS (b, tmp);
105568963447SMasatake YAMATO 		eFree (tmp);
10561e25caaaSMasatake YAMATO 	}
105768963447SMasatake YAMATO 	return vStringValue (b);
105868963447SMasatake YAMATO }
105968963447SMasatake YAMATO 
renderFieldRefMarker(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)1060cc2cd3ceSMasatake YAMATO static const char *renderFieldRefMarker (const tagEntryInfo *const tag,
10618ccb7ee9SJiří Techet 					 const char *value CTAGS_ATTR_UNUSED,
10625e272693SMasatake YAMATO 					 vString* b)
106321600f02SMasatake YAMATO {
106421600f02SMasatake YAMATO 	static char c[2] = { [1] = '\0' };
106521600f02SMasatake YAMATO 
10669062cbc8SMasatake YAMATO 	c [0] = (tag->extensionFields.roleBits)? 'R': 'D';
106721600f02SMasatake YAMATO 
106821600f02SMasatake YAMATO 	return renderAsIs (b, c);
106921600f02SMasatake YAMATO }
107021600f02SMasatake YAMATO 
renderFieldExtras(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)107195ad9dc1SMasatake YAMATO static const char *renderFieldExtras (const tagEntryInfo *const tag,
10728ccb7ee9SJiří Techet 				     const char *value CTAGS_ATTR_UNUSED,
10735e272693SMasatake YAMATO 				     vString* b)
1074bc7096c6SMasatake YAMATO {
1075bc7096c6SMasatake YAMATO 	int i;
1076ce990805SThomas Braun 	bool hasExtra = false;
1077fdf86b79SMasatake YAMATO 	int c = countXtags();
1078bc7096c6SMasatake YAMATO 
1079fdf86b79SMasatake YAMATO 	for (i = 0; i < c; i++)
1080bc7096c6SMasatake YAMATO 	{
1081bc7096c6SMasatake YAMATO 		const char *name = getXtagName (i);
1082bc7096c6SMasatake YAMATO 
1083bc7096c6SMasatake YAMATO 		if (!name)
1084bc7096c6SMasatake YAMATO 			continue;
1085bc7096c6SMasatake YAMATO 
1086bc7096c6SMasatake YAMATO 		if (isTagExtraBitMarked (tag, i))
1087bc7096c6SMasatake YAMATO 		{
1088bc7096c6SMasatake YAMATO 
1089bc7096c6SMasatake YAMATO 			if (hasExtra)
1090bc7096c6SMasatake YAMATO 				vStringPut (b, ',');
1091bc7096c6SMasatake YAMATO 			vStringCatS (b, name);
1092ce990805SThomas Braun 			hasExtra = true;
1093bc7096c6SMasatake YAMATO 		}
1094bc7096c6SMasatake YAMATO 	}
1095bc7096c6SMasatake YAMATO 
1096bc7096c6SMasatake YAMATO 	if (hasExtra)
1097bc7096c6SMasatake YAMATO 		return vStringValue (b);
1098bc7096c6SMasatake YAMATO 	else
1099bc7096c6SMasatake YAMATO 		return NULL;
1100bc7096c6SMasatake YAMATO }
1101bc7096c6SMasatake YAMATO 
renderFieldXpath(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)110276a4ccb4SMasatake YAMATO static const char *renderFieldXpath (const tagEntryInfo *const tag,
1103e4d16241SMasatake YAMATO 				     const char *value CTAGS_ATTR_UNUSED,
11045e272693SMasatake YAMATO 				     vString* b)
110576a4ccb4SMasatake YAMATO {
110676a4ccb4SMasatake YAMATO #ifdef HAVE_LIBXML
110776a4ccb4SMasatake YAMATO 	if (tag->extensionFields.xpath)
110876a4ccb4SMasatake YAMATO 		return renderEscapedString (tag->extensionFields.xpath,
110976a4ccb4SMasatake YAMATO 					    tag, b);
111076a4ccb4SMasatake YAMATO #endif
111176a4ccb4SMasatake YAMATO 	return NULL;
111276a4ccb4SMasatake YAMATO }
111376a4ccb4SMasatake YAMATO 
renderFieldScopeKindName(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)111464a937a1SMasatake YAMATO static const char *renderFieldScopeKindName(const tagEntryInfo *const tag,
1115e4d16241SMasatake YAMATO 					    const char *value CTAGS_ATTR_UNUSED,
11165e272693SMasatake YAMATO 					    vString* b)
111764a937a1SMasatake YAMATO {
111826157099SMasatake YAMATO 	const char* kind;
111964a937a1SMasatake YAMATO 
112026157099SMasatake YAMATO 	getTagScopeInformation ((tagEntryInfo *const)tag, &kind, NULL);
112126157099SMasatake YAMATO 	return kind? renderAsIs (b, kind): NULL;
112264a937a1SMasatake YAMATO }
112376a4ccb4SMasatake YAMATO 
renderFieldEnd(const tagEntryInfo * const tag,const char * value CTAGS_ATTR_UNUSED,vString * b)1124d82a3cd2SMasatake YAMATO static const char *renderFieldEnd (const tagEntryInfo *const tag,
1125e4d16241SMasatake YAMATO 				   const char *value CTAGS_ATTR_UNUSED,
11265e272693SMasatake YAMATO 				   vString* b)
1127d82a3cd2SMasatake YAMATO {
1128cc4948b8SMasatake YAMATO 	static char buf[21];
1129d82a3cd2SMasatake YAMATO 
1130d82a3cd2SMasatake YAMATO 	if (tag->extensionFields.endLine != 0)
1131d82a3cd2SMasatake YAMATO 	{
113286fc6832SMasatake YAMATO 		sprintf (buf, "%lu", tag->extensionFields.endLine);
1133d82a3cd2SMasatake YAMATO 		return renderAsIs (b, buf);
1134d82a3cd2SMasatake YAMATO 	}
1135d82a3cd2SMasatake YAMATO 	else
1136d82a3cd2SMasatake YAMATO 		return NULL;
1137d82a3cd2SMasatake YAMATO }
1138d82a3cd2SMasatake YAMATO 
renderFieldEpoch(const tagEntryInfo * const tag,const char * value,vString * b)1139c314f261SMasatake YAMATO static const char *renderFieldEpoch (const tagEntryInfo *const tag,
1140c314f261SMasatake YAMATO 									  const char *value, vString* b)
1141c314f261SMasatake YAMATO {
1142c314f261SMasatake YAMATO #define buf_len 21
1143c314f261SMasatake YAMATO 	static char buf[buf_len];
1144c314f261SMasatake YAMATO 
1145c314f261SMasatake YAMATO 	if (snprintf (buf, buf_len, "%lld", (long long)tag->extensionFields.epoch) > 0)
1146c314f261SMasatake YAMATO 		return renderAsIs (b, buf);
1147c314f261SMasatake YAMATO 	else
1148c314f261SMasatake YAMATO 		return NULL;
1149f0a23ab8SMasatake YAMATO #undef buf_len
1150f0a23ab8SMasatake YAMATO }
1151f0a23ab8SMasatake YAMATO 
renderFieldNth(const tagEntryInfo * const tag,const char * value,vString * b)1152f0a23ab8SMasatake YAMATO static const char *renderFieldNth (const tagEntryInfo *const tag,
1153f0a23ab8SMasatake YAMATO 								   const char *value, vString* b)
1154f0a23ab8SMasatake YAMATO {
1155f0a23ab8SMasatake YAMATO #define buf_len 12
1156f0a23ab8SMasatake YAMATO 	static char buf[buf_len];
1157f0a23ab8SMasatake YAMATO 
1158f0a23ab8SMasatake YAMATO 	if (tag->extensionFields.nth > NO_NTH_FIELD
1159f0a23ab8SMasatake YAMATO 		&& snprintf (buf, buf_len, "%d", (int)tag->extensionFields.nth) > 0)
1160f0a23ab8SMasatake YAMATO 		return renderAsIs (b, buf);
1161f0a23ab8SMasatake YAMATO 	else
1162f0a23ab8SMasatake YAMATO 		return NULL;
1163f0a23ab8SMasatake YAMATO #undef buf_len
1164c314f261SMasatake YAMATO }
1165c314f261SMasatake YAMATO 
isTyperefFieldAvailable(const tagEntryInfo * const tag)1166ce990805SThomas Braun static bool     isTyperefFieldAvailable  (const tagEntryInfo *const tag)
11675ed65c80SMasatake YAMATO {
11685ed65c80SMasatake YAMATO 	return (tag->extensionFields.typeRef [0] != NULL
1169ce990805SThomas Braun 		&& tag->extensionFields.typeRef [1] != NULL)? true: false;
11705ed65c80SMasatake YAMATO }
11715ed65c80SMasatake YAMATO 
isFileFieldAvailable(const tagEntryInfo * const tag)1172ce990805SThomas Braun static bool     isFileFieldAvailable  (const tagEntryInfo *const tag)
11735ed65c80SMasatake YAMATO {
1174ce990805SThomas Braun 	return tag->isFileScope? true: false;
11755ed65c80SMasatake YAMATO }
11765ed65c80SMasatake YAMATO 
isInheritsFieldAvailable(const tagEntryInfo * const tag)1177ce990805SThomas Braun static bool     isInheritsFieldAvailable (const tagEntryInfo *const tag)
11785ed65c80SMasatake YAMATO {
1179ce990805SThomas Braun 	return (tag->extensionFields.inheritance != NULL)? true: false;
11805ed65c80SMasatake YAMATO }
11815ed65c80SMasatake YAMATO 
isAccessFieldAvailable(const tagEntryInfo * const tag)1182ce990805SThomas Braun static bool     isAccessFieldAvailable   (const tagEntryInfo *const tag)
11835ed65c80SMasatake YAMATO {
1184ce990805SThomas Braun 	return (tag->extensionFields.access != NULL)? true: false;
11855ed65c80SMasatake YAMATO }
11865ed65c80SMasatake YAMATO 
isImplementationFieldAvailable(const tagEntryInfo * const tag)1187ce990805SThomas Braun static bool     isImplementationFieldAvailable (const tagEntryInfo *const tag)
11885ed65c80SMasatake YAMATO {
1189ce990805SThomas Braun 	return (tag->extensionFields.implementation != NULL)? true: false;
11905ed65c80SMasatake YAMATO }
11915ed65c80SMasatake YAMATO 
isSignatureFieldAvailable(const tagEntryInfo * const tag)1192ce990805SThomas Braun static bool     isSignatureFieldAvailable (const tagEntryInfo *const tag)
11935ed65c80SMasatake YAMATO {
1194ce990805SThomas Braun 	return (tag->extensionFields.signature != NULL)? true: false;
11955ed65c80SMasatake YAMATO }
11965ed65c80SMasatake YAMATO 
isExtrasFieldAvailable(const tagEntryInfo * const tag)119795ad9dc1SMasatake YAMATO static bool     isExtrasFieldAvailable     (const tagEntryInfo *const tag)
11985ed65c80SMasatake YAMATO {
119946ab94ccSMasatake YAMATO 	unsigned int i;
12004a09d349SMasatake YAMATO 
12014a09d349SMasatake YAMATO 	if (tag->extraDynamic)
12024a09d349SMasatake YAMATO 		return true;
12035ed65c80SMasatake YAMATO 	for (i = 0; i < sizeof (tag->extra); i++)
12045ed65c80SMasatake YAMATO 		if (tag->extra [i])
1205ce990805SThomas Braun 			return true;
12065ed65c80SMasatake YAMATO 
1207ce990805SThomas Braun 	return false;
12085ed65c80SMasatake YAMATO }
12095ed65c80SMasatake YAMATO 
isXpathFieldAvailable(const tagEntryInfo * const tag)1210ce990805SThomas Braun static bool     isXpathFieldAvailable      (const tagEntryInfo *const tag)
12115ed65c80SMasatake YAMATO {
12125ed65c80SMasatake YAMATO #ifdef HAVE_LIBXML
1213ce990805SThomas Braun 	return (tag->extensionFields.xpath != NULL)? true: false;
12145ed65c80SMasatake YAMATO #else
1215ce990805SThomas Braun 	return false;
12165ed65c80SMasatake YAMATO #endif
12175ed65c80SMasatake YAMATO }
12185ed65c80SMasatake YAMATO 
isEndFieldAvailable(const tagEntryInfo * const tag)1219ce990805SThomas Braun static bool     isEndFieldAvailable       (const tagEntryInfo *const tag)
12205ed65c80SMasatake YAMATO {
1221ce990805SThomas Braun 	return (tag->extensionFields.endLine != 0)? true: false;
12225ed65c80SMasatake YAMATO }
12235ed65c80SMasatake YAMATO 
isEpochAvailable(const tagEntryInfo * const tag)12247222fbceSMasatake YAMATO static bool isEpochAvailable (const tagEntryInfo *const tag)
1225c314f261SMasatake YAMATO {
1226c314f261SMasatake YAMATO 	return (tag->kindIndex == KIND_FILE_INDEX)
1227c314f261SMasatake YAMATO 		? true
1228c314f261SMasatake YAMATO 		: false;
1229c314f261SMasatake YAMATO }
1230c314f261SMasatake YAMATO 
isNthAvailable(const tagEntryInfo * const tag)1231f0a23ab8SMasatake YAMATO static bool isNthAvailable (const tagEntryInfo *const tag)
1232f0a23ab8SMasatake YAMATO {
1233f0a23ab8SMasatake YAMATO 	Assert (tag->langType >= NO_NTH_FIELD);
1234f0a23ab8SMasatake YAMATO 	return (tag->extensionFields.nth != NO_NTH_FIELD)? true: false;
1235f0a23ab8SMasatake YAMATO }
1236f0a23ab8SMasatake YAMATO 
isFieldEnabled(fieldType type)1237ce990805SThomas Braun extern bool isFieldEnabled (fieldType type)
123829ed9ac2SMasatake YAMATO {
123983c59ef1SMasatake YAMATO 	return getFieldObject(type)->def->enabled;
124029ed9ac2SMasatake YAMATO }
124129ed9ac2SMasatake YAMATO 
enableField(fieldType type,bool state)1242c0421c5eSMasatake YAMATO extern bool enableField (fieldType type, bool state)
1243de5f5352SMasatake YAMATO {
124483c59ef1SMasatake YAMATO 	fieldDefinition *def = getFieldObject(type)->def;
124583c59ef1SMasatake YAMATO 	bool old = def->enabled;
124683c59ef1SMasatake YAMATO 	getFieldObject(type)->def->enabled = state;
12477a301caeSMasatake YAMATO 
12487a301caeSMasatake YAMATO 	if (isCommonField (type))
12497a301caeSMasatake YAMATO 		verbose ("enable field \"%s\": %s\n",
125083c59ef1SMasatake YAMATO 				 getFieldObject(type)->def->name,
1251232cabfcSMasatake YAMATO 				 (state? "yes": "no"));
12527a301caeSMasatake YAMATO 	else
12537a301caeSMasatake YAMATO 		verbose ("enable field \"%s\"<%s>: %s\n",
125483c59ef1SMasatake YAMATO 				 getFieldObject(type)->def->name,
12557a301caeSMasatake YAMATO 				 getLanguageName (getFieldOwner(type)),
1256232cabfcSMasatake YAMATO 				 (state? "yes": "no"));
1257de5f5352SMasatake YAMATO 	return old;
1258de5f5352SMasatake YAMATO }
1259de5f5352SMasatake YAMATO 
isCommonField(fieldType type)1260ce990805SThomas Braun extern bool isCommonField (fieldType type)
126144fdd1c7SMasatake YAMATO {
1262ce990805SThomas Braun 	return (FIELD_BUILTIN_LAST < type)? false: true;
126344fdd1c7SMasatake YAMATO }
126444fdd1c7SMasatake YAMATO 
getFieldOwner(fieldType type)12658b99120cSMasatake YAMATO extern int     getFieldOwner (fieldType type)
12668b99120cSMasatake YAMATO {
1267f2af3ebdSMasatake YAMATO 	return getFieldObject(type)->language;
12688b99120cSMasatake YAMATO }
12698b99120cSMasatake YAMATO 
getFieldDataType(fieldType type)127024c73016SMasatake YAMATO extern unsigned int getFieldDataType (fieldType type)
127124c73016SMasatake YAMATO {
127283c59ef1SMasatake YAMATO 	return getFieldObject(type)->def->dataType;
127324c73016SMasatake YAMATO }
127424c73016SMasatake YAMATO 
isFieldValueAvailableAlways(fieldType type)1275fba3677cSMasatake YAMATO extern bool isFieldValueAvailableAlways (fieldType type)
1276fba3677cSMasatake YAMATO {
1277fba3677cSMasatake YAMATO 	return getFieldObject(type)->def->isValueAvailable == NULL;
1278fba3677cSMasatake YAMATO }
1279fba3677cSMasatake YAMATO 
doesFieldHaveRenderer(fieldType type,bool noEscaping)12805e272693SMasatake YAMATO extern bool doesFieldHaveRenderer (fieldType type, bool noEscaping)
1281db3e3d2aSMasatake YAMATO {
12825e272693SMasatake YAMATO 	if (noEscaping)
12835e272693SMasatake YAMATO 		return getFieldObject(type)->def->renderNoEscaping? true: false;
12845e272693SMasatake YAMATO 	else
12855e272693SMasatake YAMATO 		return getFieldObject(type)->def->render? true: false;
1286db3e3d2aSMasatake YAMATO }
1287db3e3d2aSMasatake YAMATO 
countFields(void)128822f33d7aSMasatake YAMATO extern int countFields (void)
128922f33d7aSMasatake YAMATO {
1290f2af3ebdSMasatake YAMATO 	return fieldObjectUsed;
129122f33d7aSMasatake YAMATO }
129222f33d7aSMasatake YAMATO 
nextSiblingField(fieldType type)1293a6c7c87fSMasatake YAMATO extern fieldType nextSiblingField (fieldType type)
1294fe82d0bfSMasatake YAMATO {
129583c59ef1SMasatake YAMATO 	fieldObject *fobj;
1296fe82d0bfSMasatake YAMATO 
129783c59ef1SMasatake YAMATO 	fobj = fieldObjects + type;
129883c59ef1SMasatake YAMATO 	return fobj->sibling;
1299fe82d0bfSMasatake YAMATO }
1300fe82d0bfSMasatake YAMATO 
updateSiblingField(fieldType type,const char * name)1301fe82d0bfSMasatake YAMATO static void updateSiblingField (fieldType type, const char* name)
1302fe82d0bfSMasatake YAMATO {
1303fe82d0bfSMasatake YAMATO 	int i;
130483c59ef1SMasatake YAMATO 	fieldObject *fobj;
1305fe82d0bfSMasatake YAMATO 
1306fe82d0bfSMasatake YAMATO 	for (i = type; i > 0; i--)
1307fe82d0bfSMasatake YAMATO 	{
130883c59ef1SMasatake YAMATO 		fobj = fieldObjects + i - 1;
130983c59ef1SMasatake YAMATO 		if (fobj->def->name && (strcmp (fobj->def->name, name) == 0))
1310fe82d0bfSMasatake YAMATO 		{
131183c59ef1SMasatake YAMATO 			Assert (fobj->sibling == FIELD_UNKNOWN);
131283c59ef1SMasatake YAMATO 			fobj->sibling = type;
1313fe82d0bfSMasatake YAMATO 			break;
1314fe82d0bfSMasatake YAMATO 		}
1315fe82d0bfSMasatake YAMATO 	}
1316fe82d0bfSMasatake YAMATO }
1317fe82d0bfSMasatake YAMATO 
defaultRenderer(const tagEntryInfo * const tag CTAGS_ATTR_UNUSED,const char * value,vString * buffer CTAGS_ATTR_UNUSED)1318e4d16241SMasatake YAMATO static const char* defaultRenderer (const tagEntryInfo *const tag CTAGS_ATTR_UNUSED,
131999c25f05SMasatake YAMATO 				    const char *value,
13205e272693SMasatake YAMATO 				    vString * buffer CTAGS_ATTR_UNUSED)
132199c25f05SMasatake YAMATO {
1322e9464635SMasatake YAMATO 	return renderEscapedString (value, tag, buffer);
132399c25f05SMasatake YAMATO }
132499c25f05SMasatake YAMATO 
defineField(fieldDefinition * def,langType language)132583c59ef1SMasatake YAMATO extern int defineField (fieldDefinition *def, langType language)
1326ad1a3891SMasatake YAMATO {
132783c59ef1SMasatake YAMATO 	fieldObject *fobj;
1328ad1a3891SMasatake YAMATO 	char *nameWithPrefix;
1329ad1a3891SMasatake YAMATO 	size_t i;
1330ad1a3891SMasatake YAMATO 
133183c59ef1SMasatake YAMATO 	Assert (def);
133283c59ef1SMasatake YAMATO 	Assert (def->name);
133383c59ef1SMasatake YAMATO 	for (i = 0; i < strlen (def->name); i++)
1334ad1a3891SMasatake YAMATO 	{
1335ae599e0fSMasatake YAMATO 		Assert ( isalpha (def->name [i]) );
1336ad1a3891SMasatake YAMATO 	}
133783c59ef1SMasatake YAMATO 	def->letter = NUL_FIELD_LETTER;
1338ad1a3891SMasatake YAMATO 
1339f2af3ebdSMasatake YAMATO 	if (fieldObjectUsed == fieldObjectAllocated)
1340ad1a3891SMasatake YAMATO 	{
1341f2af3ebdSMasatake YAMATO 		fieldObjectAllocated *= 2;
1342f2af3ebdSMasatake YAMATO 		fieldObjects = xRealloc (fieldObjects, fieldObjectAllocated, fieldObject);
1343ad1a3891SMasatake YAMATO 	}
134483c59ef1SMasatake YAMATO 	fobj = fieldObjects + (fieldObjectUsed);
134583c59ef1SMasatake YAMATO 	def->ftype = fieldObjectUsed++;
1346a696f376SMasatake YAMATO 
13475e272693SMasatake YAMATO 	if (def->render == NULL)
13485e272693SMasatake YAMATO 	{
13495e272693SMasatake YAMATO 		def->render = defaultRenderer;
13505e272693SMasatake YAMATO 		def->renderNoEscaping = NULL;
1351c54f0614SMasatake YAMATO 		def->doesContainAnyChar = NULL;
13525e272693SMasatake YAMATO 	}
135399c25f05SMasatake YAMATO 
135483c59ef1SMasatake YAMATO 	if (! def->dataType)
135583c59ef1SMasatake YAMATO 		def->dataType = FIELDTYPE_STRING;
135666238031SMasatake YAMATO 
135783c59ef1SMasatake YAMATO 	fobj->def = def;
1358ad1a3891SMasatake YAMATO 
135983c59ef1SMasatake YAMATO 	fobj->buffer = NULL;
1360ad1a3891SMasatake YAMATO 
136183c59ef1SMasatake YAMATO 	nameWithPrefix = eMalloc (sizeof CTAGS_FIELD_PREFIX + strlen (def->name) + 1);
1362ad1a3891SMasatake YAMATO 	nameWithPrefix [0] = '\0';
1363ad1a3891SMasatake YAMATO 	strcat (nameWithPrefix, CTAGS_FIELD_PREFIX);
136483c59ef1SMasatake YAMATO 	strcat (nameWithPrefix, def->name);
136583c59ef1SMasatake YAMATO 	fobj->nameWithPrefix = nameWithPrefix;
136633a6fdb8SMasatake YAMATO 	DEFAULT_TRASH_BOX(nameWithPrefix, eFree);
1367ad1a3891SMasatake YAMATO 
136883c59ef1SMasatake YAMATO 	fobj->language = language;
136983c59ef1SMasatake YAMATO 	fobj->sibling  = FIELD_UNKNOWN;
1370fe82d0bfSMasatake YAMATO 
137183c59ef1SMasatake YAMATO 	updateSiblingField (def->ftype, def->name);
137283c59ef1SMasatake YAMATO 	return def->ftype;
1373ad1a3891SMasatake YAMATO }
1374aa9256e3SMasatake YAMATO 
13756f4d9933SMasatake YAMATO #define FIELD_COL_LETTER      0
13766f4d9933SMasatake YAMATO #define FIELD_COL_NAME        1
13776f4d9933SMasatake YAMATO #define FIELD_COL_ENABLED     2
13786f4d9933SMasatake YAMATO #define FIELD_COL_LANGUAGE    3
13796f4d9933SMasatake YAMATO #define FIELD_COL_JSTYPE      4
13806f4d9933SMasatake YAMATO #define FIELD_COL_FIXED       5
1381ac58d7bfSMasatake YAMATO #define FIELD_COL_OPERATOR    6
1382ac58d7bfSMasatake YAMATO #define FIELD_COL_DESCRIPTION 7
1383ac58d7bfSMasatake YAMATO 
fieldColprintTableNew(void)1384aa9256e3SMasatake YAMATO extern struct colprintTable * fieldColprintTableNew (void)
1385aa9256e3SMasatake YAMATO {
1386aa9256e3SMasatake YAMATO 	return colprintTableNew ("L:LETTER", "L:NAME", "L:ENABLED",
1387ac58d7bfSMasatake YAMATO 							 "L:LANGUAGE", "L:JSTYPE", "L:FIXED",
1388ac58d7bfSMasatake YAMATO 							 "L:OP", "L:DESCRIPTION", NULL);
1389aa9256e3SMasatake YAMATO }
1390aa9256e3SMasatake YAMATO 
fieldColprintAddLine(struct colprintTable * table,int i)1391aa9256e3SMasatake YAMATO static void  fieldColprintAddLine (struct colprintTable *table, int i)
1392aa9256e3SMasatake YAMATO {
1393aa9256e3SMasatake YAMATO 	fieldObject *fobj = getFieldObject(i);
1394aa9256e3SMasatake YAMATO 	fieldDefinition *fdef = fobj->def;
1395aa9256e3SMasatake YAMATO 
1396aa9256e3SMasatake YAMATO 	struct colprintLine *line = colprintTableGetNewLine(table);
1397aa9256e3SMasatake YAMATO 
1398aa9256e3SMasatake YAMATO 	colprintLineAppendColumnChar (line,
1399aa9256e3SMasatake YAMATO 								  (fdef->letter == NUL_FIELD_LETTER)
1400abe66999SMasatake YAMATO 								  ? FIELD_NULL_LETTER_CHAR
1401aa9256e3SMasatake YAMATO 								  : fdef->letter);
1402aa9256e3SMasatake YAMATO 
1403aa9256e3SMasatake YAMATO 	const char *name = getFieldName (i);
1404db2bf481SMasatake YAMATO 	colprintLineAppendColumnCString (line, name? name: RSV_NONE);
1405232cabfcSMasatake YAMATO 	colprintLineAppendColumnBool (line, fdef->enabled);
1406aa9256e3SMasatake YAMATO 	colprintLineAppendColumnCString (line,
1407aa9256e3SMasatake YAMATO 									 fobj->language == LANG_IGNORE
1408db2bf481SMasatake YAMATO 									 ? RSV_NONE
1409aa9256e3SMasatake YAMATO 									 : getLanguageName (fobj->language));
1410aa9256e3SMasatake YAMATO 
1411aa9256e3SMasatake YAMATO 	char  typefields [] = "---";
1412aa9256e3SMasatake YAMATO 	{
1413aa9256e3SMasatake YAMATO 		unsigned int bmask, offset;
1414aa9256e3SMasatake YAMATO 		unsigned int type = getFieldDataType(i);
1415aa9256e3SMasatake YAMATO 		for (bmask = 1, offset = 0;
1416aa9256e3SMasatake YAMATO 			 bmask < FIELDTYPE_END_MARKER;
1417aa9256e3SMasatake YAMATO 			 bmask <<= 1, offset++)
1418aa9256e3SMasatake YAMATO 			if (type & bmask)
1419aa9256e3SMasatake YAMATO 				typefields[offset] = fieldDataTypeFalgs[offset];
1420aa9256e3SMasatake YAMATO 	}
1421aa9256e3SMasatake YAMATO 	colprintLineAppendColumnCString (line, typefields);
14228182f840SMasatake YAMATO 	colprintLineAppendColumnBool (line, writerDoesTreatFieldAsFixed (i));
1423ac58d7bfSMasatake YAMATO 
1424ac58d7bfSMasatake YAMATO 	char operator[] = {'-', '-', '\0'};
1425ac58d7bfSMasatake YAMATO 	if (fdef->getValueObject)
1426ac58d7bfSMasatake YAMATO 		operator[0] = 'r';
1427ac58d7bfSMasatake YAMATO 	if (fdef->setValueObject)
1428ac58d7bfSMasatake YAMATO 		operator[1] = 'w';
1429ac58d7bfSMasatake YAMATO 	colprintLineAppendColumnCString (line, operator);
1430aa9256e3SMasatake YAMATO 	colprintLineAppendColumnCString (line, fdef->description);
1431aa9256e3SMasatake YAMATO }
1432aa9256e3SMasatake YAMATO 
fieldColprintAddCommonLines(struct colprintTable * table)1433aa9256e3SMasatake YAMATO extern void fieldColprintAddCommonLines (struct colprintTable *table)
1434aa9256e3SMasatake YAMATO {
1435aa9256e3SMasatake YAMATO 	for (int i = 0; i <= FIELD_BUILTIN_LAST; i++)
1436aa9256e3SMasatake YAMATO 		fieldColprintAddLine(table, i);
1437aa9256e3SMasatake YAMATO }
1438aa9256e3SMasatake YAMATO 
fieldColprintAddLanguageLines(struct colprintTable * table,langType language)1439aa9256e3SMasatake YAMATO extern void fieldColprintAddLanguageLines (struct colprintTable *table, langType language)
1440aa9256e3SMasatake YAMATO {
14414c64e833SMasatake YAMATO 	for (unsigned int i = FIELD_BUILTIN_LAST + 1; i < fieldObjectUsed; i++)
1442aa9256e3SMasatake YAMATO 	{
1443aa9256e3SMasatake YAMATO 		fieldObject *fobj = getFieldObject(i);
1444aa9256e3SMasatake YAMATO 		if (fobj->language == language)
1445aa9256e3SMasatake YAMATO 			fieldColprintAddLine (table, i);
1446aa9256e3SMasatake YAMATO 	}
1447aa9256e3SMasatake YAMATO }
1448aa9256e3SMasatake YAMATO 
fieldColprintCompareLines(struct colprintLine * a,struct colprintLine * b)1449aa9256e3SMasatake YAMATO static int fieldColprintCompareLines (struct colprintLine *a , struct colprintLine *b)
1450aa9256e3SMasatake YAMATO {
14516f4d9933SMasatake YAMATO 	const char *a_fixed  = colprintLineGetColumn (a, FIELD_COL_FIXED);
14526f4d9933SMasatake YAMATO 	const char *b_fixed  = colprintLineGetColumn (b, FIELD_COL_FIXED);
14536f4d9933SMasatake YAMATO 	const char *a_parser = colprintLineGetColumn (a, FIELD_COL_LANGUAGE);
14546f4d9933SMasatake YAMATO 	const char *b_parser = colprintLineGetColumn (b, FIELD_COL_LANGUAGE);
1455aa9256e3SMasatake YAMATO 
1456f9f03723SMasatake YAMATO 	if ((strcmp (a_fixed, "yes") == 0)
14571d8471a5SMasatake YAMATO 		&& (strcmp (b_fixed, "yes") == 0))
1458f9f03723SMasatake YAMATO 	{
1459f9f03723SMasatake YAMATO 		/* name, input, pattern, compact */
14606f4d9933SMasatake YAMATO 		const char *a_name  = colprintLineGetColumn (a, FIELD_COL_NAME);
14616f4d9933SMasatake YAMATO 		const char *b_name  = colprintLineGetColumn (b, FIELD_COL_NAME);
1462f9f03723SMasatake YAMATO 		const char *ref_name;
1463f9f03723SMasatake YAMATO 		unsigned int a_index = ~0U;
1464f9f03723SMasatake YAMATO 		unsigned int b_index = ~0U;
1465f9f03723SMasatake YAMATO 
1466f9f03723SMasatake YAMATO 		for (unsigned int i = 0; i < ARRAY_SIZE(fieldDefinitionsFixed); i++)
1467f9f03723SMasatake YAMATO 		{
1468f9f03723SMasatake YAMATO 			ref_name = fieldDefinitionsFixed [i].name;
1469f9f03723SMasatake YAMATO 			if (strcmp (a_name, ref_name) == 0)
1470f9f03723SMasatake YAMATO 				a_index = i;
1471f9f03723SMasatake YAMATO 			if (strcmp (b_name, ref_name) == 0)
1472f9f03723SMasatake YAMATO 				b_index = i;
1473f9f03723SMasatake YAMATO 			if ((a_index != ~0U) || (b_index != ~0U))
1474f9f03723SMasatake YAMATO 				break;
1475f9f03723SMasatake YAMATO 		}
1476f9f03723SMasatake YAMATO 
1477f9f03723SMasatake YAMATO 		if (a_index < b_index)
1478f9f03723SMasatake YAMATO 			return -1;
1479f9f03723SMasatake YAMATO 		else if (a_index == b_index)
1480f9f03723SMasatake YAMATO 			return 0;			/* ??? */
1481f9f03723SMasatake YAMATO 		else
1482f9f03723SMasatake YAMATO 			return 1;
1483f9f03723SMasatake YAMATO 	}
1484f9f03723SMasatake YAMATO 	else if ((strcmp (a_fixed, "yes") == 0)
1485f9f03723SMasatake YAMATO 			  && (strcmp (b_fixed, "yes") != 0))
1486f9f03723SMasatake YAMATO 		return -1;
1487f9f03723SMasatake YAMATO 	else if ((strcmp (a_fixed, "yes") != 0)
1488f9f03723SMasatake YAMATO 			 && (strcmp (b_fixed, "yes") == 0))
1489f9f03723SMasatake YAMATO 		return 1;
1490f9f03723SMasatake YAMATO 
1491db2bf481SMasatake YAMATO 	if (strcmp (a_parser, RSV_NONE) == 0
1492db2bf481SMasatake YAMATO 		&& strcmp (b_parser, RSV_NONE) != 0)
1493aa9256e3SMasatake YAMATO 		return -1;
1494db2bf481SMasatake YAMATO 	else if (strcmp (a_parser, RSV_NONE) != 0
1495db2bf481SMasatake YAMATO 			 && strcmp (b_parser, RSV_NONE) == 0)
1496aa9256e3SMasatake YAMATO 		return 1;
1497db2bf481SMasatake YAMATO 	else if (strcmp (a_parser, RSV_NONE) != 0
1498db2bf481SMasatake YAMATO 			 && strcmp (b_parser, RSV_NONE) != 0)
1499aa9256e3SMasatake YAMATO 	{
1500aa9256e3SMasatake YAMATO 		int r;
1501aa9256e3SMasatake YAMATO 		r = strcmp (a_parser, b_parser);
1502aa9256e3SMasatake YAMATO 		if (r != 0)
1503aa9256e3SMasatake YAMATO 			return r;
1504aa9256e3SMasatake YAMATO 
15056f4d9933SMasatake YAMATO 		const char *a_name = colprintLineGetColumn (a, FIELD_COL_NAME);
15066f4d9933SMasatake YAMATO 		const char *b_name = colprintLineGetColumn (b, FIELD_COL_NAME);
1507aa9256e3SMasatake YAMATO 
1508aa9256e3SMasatake YAMATO 		return strcmp(a_name, b_name);
1509aa9256e3SMasatake YAMATO 	}
1510aa9256e3SMasatake YAMATO 	else
1511aa9256e3SMasatake YAMATO 	{
15126f4d9933SMasatake YAMATO 		const char *a_letter = colprintLineGetColumn (a, FIELD_COL_LETTER);
15136f4d9933SMasatake YAMATO 		const char *b_letter = colprintLineGetColumn (b, FIELD_COL_LETTER);
1514aa9256e3SMasatake YAMATO 
1515aa9256e3SMasatake YAMATO 		return strcmp(a_letter, b_letter);
1516aa9256e3SMasatake YAMATO 	}
1517aa9256e3SMasatake YAMATO }
1518aa9256e3SMasatake YAMATO 
fieldColprintTablePrint(struct colprintTable * table,bool withListHeader,bool machinable,FILE * fp)1519aa9256e3SMasatake YAMATO extern void fieldColprintTablePrint (struct colprintTable *table,
1520aa9256e3SMasatake YAMATO 									 bool withListHeader, bool machinable, FILE *fp)
1521aa9256e3SMasatake YAMATO {
1522aa9256e3SMasatake YAMATO 	colprintTableSort (table, fieldColprintCompareLines);
1523aa9256e3SMasatake YAMATO 	colprintTablePrint (table, 0, withListHeader, machinable, fp);
1524aa9256e3SMasatake YAMATO }
1525fba3677cSMasatake YAMATO 
getFieldGetterValueType(fieldType type)1526fba3677cSMasatake YAMATO extern const char * getFieldGetterValueType (fieldType type)
1527fba3677cSMasatake YAMATO {
1528fba3677cSMasatake YAMATO 	fieldObject *fobj = getFieldObject (type);
1529fba3677cSMasatake YAMATO 	return (fobj? fobj->def->getterValueType: NULL);
1530fba3677cSMasatake YAMATO }
1531fba3677cSMasatake YAMATO 
getFieldValue(fieldType type,const tagEntryInfo * tag)1532fba3677cSMasatake YAMATO extern EsObject * getFieldValue (fieldType type, const tagEntryInfo *tag)
1533fba3677cSMasatake YAMATO {
1534fba3677cSMasatake YAMATO 	fieldObject* fobj;
1535fba3677cSMasatake YAMATO 
1536fba3677cSMasatake YAMATO 	fobj = getFieldObject (type);
1537fba3677cSMasatake YAMATO 	if (fobj && fobj->def->getValueObject)
1538fba3677cSMasatake YAMATO 		return fobj->def->getValueObject (tag, fobj->def);
1539fba3677cSMasatake YAMATO 	return es_nil;
1540fba3677cSMasatake YAMATO }
1541fba3677cSMasatake YAMATO 
hasFieldGetter(fieldType type)1542fba3677cSMasatake YAMATO extern bool hasFieldGetter (fieldType type)
1543fba3677cSMasatake YAMATO {
1544fba3677cSMasatake YAMATO 	fieldObject *fobj = getFieldObject (type);
1545fba3677cSMasatake YAMATO 	return (fobj && fobj->def->getValueObject);
1546fba3677cSMasatake YAMATO }
1547fba3677cSMasatake YAMATO 
getFieldSetterValueType(fieldType type)1548fba3677cSMasatake YAMATO extern const char * getFieldSetterValueType (fieldType type)
1549fba3677cSMasatake YAMATO {
1550fba3677cSMasatake YAMATO 	fieldObject *fobj = getFieldObject (type);
1551fba3677cSMasatake YAMATO 	return (fobj? fobj->def->setterValueType: NULL);
1552fba3677cSMasatake YAMATO }
1553fba3677cSMasatake YAMATO 
setFieldValue(fieldType type,tagEntryInfo * tag,const EsObject * val)1554fba3677cSMasatake YAMATO extern EsObject * setFieldValue (fieldType type, tagEntryInfo *tag, const EsObject *val)
1555fba3677cSMasatake YAMATO {
1556fba3677cSMasatake YAMATO 	fieldObject *fobj;
1557fba3677cSMasatake YAMATO 
1558fba3677cSMasatake YAMATO 	fobj = getFieldObject (type);
1559fba3677cSMasatake YAMATO 	if (fobj && fobj->def->setValueObject)
1560fba3677cSMasatake YAMATO 		return fobj->def->setValueObject (tag, fobj->def, val);
1561fba3677cSMasatake YAMATO 	return es_false;
1562fba3677cSMasatake YAMATO }
1563fba3677cSMasatake YAMATO 
hasFieldSetter(fieldType type)1564fba3677cSMasatake YAMATO extern bool hasFieldSetter (fieldType type)
1565fba3677cSMasatake YAMATO {
1566fba3677cSMasatake YAMATO 	fieldObject *fobj = getFieldObject (type);
1567fba3677cSMasatake YAMATO 	return (fobj && fobj->def->setValueObject);
1568fba3677cSMasatake YAMATO }
1569fba3677cSMasatake YAMATO 
1570fba3677cSMasatake YAMATO 
hasFieldValueCheckerForSetter(fieldType type)1571fba3677cSMasatake YAMATO extern bool hasFieldValueCheckerForSetter (fieldType type)
1572fba3677cSMasatake YAMATO {
1573fba3677cSMasatake YAMATO 	fieldObject *fobj = getFieldObject (type);
1574fba3677cSMasatake YAMATO 	return (fobj && fobj->def->checkValueForSetter);
1575fba3677cSMasatake YAMATO }
1576fba3677cSMasatake YAMATO 
checkFieldValueForSetter(fieldType type,const EsObject * val)1577fba3677cSMasatake YAMATO extern EsObject* checkFieldValueForSetter (fieldType type, const EsObject *val)
1578fba3677cSMasatake YAMATO {
1579fba3677cSMasatake YAMATO 	fieldObject *fobj = getFieldObject (type);
1580fba3677cSMasatake YAMATO 	return fobj->def->checkValueForSetter (fobj->def, val);
1581fba3677cSMasatake YAMATO }
1582ad51b948SMasatake YAMATO 
getFieldValueForName(const tagEntryInfo * tag,const fieldDefinition * fdef)1583ad51b948SMasatake YAMATO static EsObject* getFieldValueForName (const tagEntryInfo *tag, const fieldDefinition *fdef)
1584ad51b948SMasatake YAMATO {
1585ad51b948SMasatake YAMATO 	return opt_string_new_from_cstr (tag->name);
1586ad51b948SMasatake YAMATO }
1587ad51b948SMasatake YAMATO 
setFieldValueForName(tagEntryInfo * tag,const fieldDefinition * fdef,const EsObject * val)1588ad51b948SMasatake YAMATO static EsObject* setFieldValueForName (tagEntryInfo *tag, const fieldDefinition *fdef, const EsObject *val)
1589ad51b948SMasatake YAMATO {
1590ad51b948SMasatake YAMATO 	eFree ((char*) tag->name);
1591ad51b948SMasatake YAMATO 	const char *cstr = opt_string_get_cstr (val);
1592ad51b948SMasatake YAMATO 	tag->name = eStrdup (cstr);
1593ad51b948SMasatake YAMATO 	return es_false;
1594ad51b948SMasatake YAMATO }
15953aea379fSMasatake YAMATO 
getFieldValueForInput(const tagEntryInfo * tag,const fieldDefinition * fdef)15963c63479cSMasatake YAMATO static EsObject* getFieldValueForInput (const tagEntryInfo *tag, const fieldDefinition *fdef)
15973c63479cSMasatake YAMATO {
15983c63479cSMasatake YAMATO 	return opt_string_new_from_cstr (tag->inputFileName);
15993c63479cSMasatake YAMATO }
16003c63479cSMasatake YAMATO 
getFieldValueForKind(const tagEntryInfo * tag,const fieldDefinition * fdef)16013aea379fSMasatake YAMATO static EsObject* getFieldValueForKind (const tagEntryInfo *tag, const fieldDefinition *fdef)
16023aea379fSMasatake YAMATO {
16033aea379fSMasatake YAMATO 	const char *kind_name = getLanguageKindName (tag->langType, tag->kindIndex);
16043aea379fSMasatake YAMATO 	return opt_name_new_from_cstr (kind_name);
16053aea379fSMasatake YAMATO }
1606170a717fSMasatake YAMATO 
getFieldValueForTyperef(const tagEntryInfo * tag,const fieldDefinition * fdef)1607170a717fSMasatake YAMATO static EsObject* getFieldValueForTyperef (const tagEntryInfo *tag, const fieldDefinition *fdef)
1608170a717fSMasatake YAMATO {
1609170a717fSMasatake YAMATO 	if (tag->extensionFields.typeRef [0] == NULL
1610170a717fSMasatake YAMATO 		&& tag->extensionFields.typeRef [1] == NULL)
1611170a717fSMasatake YAMATO 		return es_nil;
1612170a717fSMasatake YAMATO 
1613170a717fSMasatake YAMATO 	EsObject *a = opt_array_new ();
1614170a717fSMasatake YAMATO 	EsObject *e0 = tag->extensionFields.typeRef [0]
1615170a717fSMasatake YAMATO 		? opt_string_new_from_cstr(tag->extensionFields.typeRef [0])
1616170a717fSMasatake YAMATO 		: es_false;
1617170a717fSMasatake YAMATO 	EsObject *e1 = tag->extensionFields.typeRef [1]
1618170a717fSMasatake YAMATO 		? opt_string_new_from_cstr(tag->extensionFields.typeRef [1])
1619170a717fSMasatake YAMATO 		: es_false;
1620170a717fSMasatake YAMATO 	opt_array_put (a, 0, e0);
1621170a717fSMasatake YAMATO 	opt_array_put (a, 1, e1);
1622170a717fSMasatake YAMATO 	es_object_unref (e0);
1623170a717fSMasatake YAMATO 	es_object_unref (e1);
1624170a717fSMasatake YAMATO 	return a;
1625170a717fSMasatake YAMATO }
1626170a717fSMasatake YAMATO 
setFieldValueForTyperef(tagEntryInfo * tag,const fieldDefinition * fdef,const EsObject * obj)1627170a717fSMasatake YAMATO static EsObject* setFieldValueForTyperef (tagEntryInfo *tag, const fieldDefinition *fdef, const EsObject *obj)
1628170a717fSMasatake YAMATO {
1629d813f9edSMasatake YAMATO 	const char *tmp[2] = {NULL, NULL};
1630d813f9edSMasatake YAMATO 
1631d813f9edSMasatake YAMATO 	for (int i = 0 ; i < 2; i++)
1632d813f9edSMasatake YAMATO 	{
1633d813f9edSMasatake YAMATO 		if (tag->extensionFields.typeRef [i])
1634d813f9edSMasatake YAMATO 			tmp [i] = tag->extensionFields.typeRef [i];
1635d813f9edSMasatake YAMATO 	}
1636d813f9edSMasatake YAMATO 
1637170a717fSMasatake YAMATO 	if (es_boolean_p (obj))
1638170a717fSMasatake YAMATO 	{
1639170a717fSMasatake YAMATO 		for (int i = 0 ; i < 2; i++)
1640170a717fSMasatake YAMATO 		{
1641170a717fSMasatake YAMATO 			if (tag->extensionFields.typeRef [i])
1642170a717fSMasatake YAMATO 				tag->extensionFields.typeRef [i] = NULL;
1643170a717fSMasatake YAMATO 		}
1644170a717fSMasatake YAMATO 	}
1645170a717fSMasatake YAMATO 	else if (es_object_get_type (obj) == OPT_TYPE_ARRAY)
1646170a717fSMasatake YAMATO 	{
1647170a717fSMasatake YAMATO 		for (int i = 0 ; i < 2; i++)
1648170a717fSMasatake YAMATO 		{
1649170a717fSMasatake YAMATO 			EsObject *e = opt_array_get (obj, i);
1650170a717fSMasatake YAMATO 			if (es_boolean_p (e))
1651170a717fSMasatake YAMATO 			{
1652170a717fSMasatake YAMATO 				if (tag->extensionFields.typeRef [i])
1653170a717fSMasatake YAMATO 					tag->extensionFields.typeRef [i] = NULL;
1654170a717fSMasatake YAMATO 			}
1655170a717fSMasatake YAMATO 			else if (es_object_get_type (e) == OPT_TYPE_STRING)
1656170a717fSMasatake YAMATO 			{
1657170a717fSMasatake YAMATO 				tag->extensionFields.typeRef [i] = eStrdup (opt_string_get_cstr (e));
1658170a717fSMasatake YAMATO 			}
1659170a717fSMasatake YAMATO 		}
1660170a717fSMasatake YAMATO 	}
1661d813f9edSMasatake YAMATO 	else if (es_object_get_type (obj) == OPT_TYPE_STRING)
1662d813f9edSMasatake YAMATO 	{
1663d813f9edSMasatake YAMATO 		const char *str = opt_string_get_cstr (obj);
1664d813f9edSMasatake YAMATO 		tag->extensionFields.typeRef [0] = eStrdup ("typename");
1665d813f9edSMasatake YAMATO 		tag->extensionFields.typeRef [1] = eStrdup (str);
1666d813f9edSMasatake YAMATO 	}
1667d813f9edSMasatake YAMATO 	else if (es_integer_p (obj))
1668d813f9edSMasatake YAMATO 	{
1669d813f9edSMasatake YAMATO 		int index = es_integer_get (obj);
1670d813f9edSMasatake YAMATO 		tagEntryInfo *e = getEntryInCorkQueue (index);
1671d813f9edSMasatake YAMATO 		if (e)
1672d813f9edSMasatake YAMATO 		{
1673d813f9edSMasatake YAMATO 			const char *name = e->name;
1674d813f9edSMasatake YAMATO 			const char *kindName = getLanguageKindName (e->langType, e->kindIndex);
1675d813f9edSMasatake YAMATO 
1676d813f9edSMasatake YAMATO 			tag->extensionFields.typeRef [0] = eStrdup (kindName);
1677d813f9edSMasatake YAMATO 			tag->extensionFields.typeRef [1] = eStrdup (name);
1678d813f9edSMasatake YAMATO 		}
1679d813f9edSMasatake YAMATO 	}
1680d813f9edSMasatake YAMATO 	else
1681d813f9edSMasatake YAMATO 	{
1682170a717fSMasatake YAMATO 		AssertNotReached();
1683170a717fSMasatake YAMATO 		return OPT_ERR_TYPECHECK;
1684170a717fSMasatake YAMATO 	}
1685170a717fSMasatake YAMATO 
1686d813f9edSMasatake YAMATO 	for (int i = 0; i < 2; i++)
1687d813f9edSMasatake YAMATO 		if (tmp [i])
1688d813f9edSMasatake YAMATO 			eFree ((char*)tmp[i]);
1689d813f9edSMasatake YAMATO 
1690d813f9edSMasatake YAMATO 	return es_false;
1691d813f9edSMasatake YAMATO }
1692d813f9edSMasatake YAMATO 
checkFieldValueForTyperef(const fieldDefinition * fdef,const EsObject * obj)1693170a717fSMasatake YAMATO static EsObject* checkFieldValueForTyperef (const fieldDefinition *fdef, const EsObject *obj)
1694170a717fSMasatake YAMATO {
1695170a717fSMasatake YAMATO 	if (es_boolean_p (obj))
1696170a717fSMasatake YAMATO 	{
1697170a717fSMasatake YAMATO 		if (!es_object_equal (es_false, obj))
1698170a717fSMasatake YAMATO 			return OPT_ERR_TYPECHECK;
1699170a717fSMasatake YAMATO 	}
1700170a717fSMasatake YAMATO 	else if (es_object_get_type (obj) == OPT_TYPE_ARRAY)
1701170a717fSMasatake YAMATO 	{
1702170a717fSMasatake YAMATO 		if (opt_array_length (obj) != 2)
1703170a717fSMasatake YAMATO 			return OPT_ERR_TYPECHECK;
1704170a717fSMasatake YAMATO 
1705170a717fSMasatake YAMATO 		for (unsigned int i = 0; i < 2; i++)
1706170a717fSMasatake YAMATO 		{
1707170a717fSMasatake YAMATO 			EsObject *e = opt_array_get (obj, i);
1708170a717fSMasatake YAMATO 			if (es_object_get_type (e) != OPT_TYPE_STRING)
1709170a717fSMasatake YAMATO 				return OPT_ERR_TYPECHECK;
1710170a717fSMasatake YAMATO 		}
1711170a717fSMasatake YAMATO 	}
1712d813f9edSMasatake YAMATO 	else if (es_object_get_type (obj) == OPT_TYPE_STRING)
1713d813f9edSMasatake YAMATO 		;
1714d813f9edSMasatake YAMATO 	else if (es_integer_p (obj))
1715d813f9edSMasatake YAMATO 	{
1716d813f9edSMasatake YAMATO 		int index = es_integer_get (obj);
1717d813f9edSMasatake YAMATO 		if (index >= countEntryInCorkQueue ())
1718d813f9edSMasatake YAMATO 			return OPTSCRIPT_ERR_NOTAGENTRY;
1719d813f9edSMasatake YAMATO 	}
1720170a717fSMasatake YAMATO 	else
1721170a717fSMasatake YAMATO 		return OPT_ERR_TYPECHECK;
1722170a717fSMasatake YAMATO 	return es_false;
1723170a717fSMasatake YAMATO }
1724cbce4db2SMasatake YAMATO 
getFieldValueForScope(const tagEntryInfo * tag,const fieldDefinition * fdef)1725cbce4db2SMasatake YAMATO static EsObject* getFieldValueForScope (const tagEntryInfo *tag, const fieldDefinition *fdef)
1726cbce4db2SMasatake YAMATO {
1727cbce4db2SMasatake YAMATO 	return es_integer_new (tag->extensionFields.scopeIndex);
1728cbce4db2SMasatake YAMATO }
1729cbce4db2SMasatake YAMATO 
setFieldValueForScope(tagEntryInfo * tag,const fieldDefinition * fdef,const EsObject * obj)1730cbce4db2SMasatake YAMATO static EsObject* setFieldValueForScope (tagEntryInfo *tag, const fieldDefinition *fdef, const EsObject *obj)
1731cbce4db2SMasatake YAMATO {
1732cbce4db2SMasatake YAMATO 	int index = es_integer_get (obj);
1733cbce4db2SMasatake YAMATO 	if (index < countEntryInCorkQueue ())
1734cbce4db2SMasatake YAMATO 	{
1735cbce4db2SMasatake YAMATO 		tag->extensionFields.scopeIndex = index;
1736cbce4db2SMasatake YAMATO 		return es_false;
1737cbce4db2SMasatake YAMATO 	}
1738cbce4db2SMasatake YAMATO 
1739cbce4db2SMasatake YAMATO 	return OPTSCRIPT_ERR_NOTAGENTRY;
1740cbce4db2SMasatake YAMATO }
1741cbce4db2SMasatake YAMATO 
checkFieldValueForScope(const fieldDefinition * fdef,const EsObject * obj)1742cbce4db2SMasatake YAMATO static EsObject* checkFieldValueForScope (const fieldDefinition *fdef, const EsObject *obj)
1743cbce4db2SMasatake YAMATO {
1744cbce4db2SMasatake YAMATO 	if (!es_integer_p (obj))
1745cbce4db2SMasatake YAMATO 		return OPT_ERR_TYPECHECK;
1746cbce4db2SMasatake YAMATO 
1747cbce4db2SMasatake YAMATO 	if (es_integer_get (obj) < 0)
1748cbce4db2SMasatake YAMATO 		return OPT_ERR_RANGECHECK;
1749cbce4db2SMasatake YAMATO 
1750cbce4db2SMasatake YAMATO 	return es_false;
1751cbce4db2SMasatake YAMATO }
1752821f2c64SMasatake YAMATO 
getFieldValueForExtras(const tagEntryInfo * tag,const fieldDefinition * fdef)1753821f2c64SMasatake YAMATO static EsObject* getFieldValueForExtras (const tagEntryInfo *tag, const fieldDefinition *fdef)
1754821f2c64SMasatake YAMATO {
1755821f2c64SMasatake YAMATO 	if (!isTagExtra (tag))
1756821f2c64SMasatake YAMATO 		return es_nil;
1757821f2c64SMasatake YAMATO 
1758821f2c64SMasatake YAMATO 	EsObject* a = opt_array_new ();
1759821f2c64SMasatake YAMATO 
1760821f2c64SMasatake YAMATO 	for (int i = 0; i < countXtags (); i++)
1761821f2c64SMasatake YAMATO 	{
1762821f2c64SMasatake YAMATO 		if (!isTagExtraBitMarked (tag, i))
1763821f2c64SMasatake YAMATO 			continue;
1764821f2c64SMasatake YAMATO 
1765821f2c64SMasatake YAMATO 		langType lang = getXtagOwner (i);
1766821f2c64SMasatake YAMATO 		const char *lang_name = (lang == LANG_IGNORE)
1767821f2c64SMasatake YAMATO 			? NULL
1768821f2c64SMasatake YAMATO 			: getLanguageName (lang);
1769821f2c64SMasatake YAMATO 		const char *extra_name = getXtagName (i);
1770821f2c64SMasatake YAMATO 
1771821f2c64SMasatake YAMATO 		EsObject *extra;
1772821f2c64SMasatake YAMATO 		if (lang_name == NULL)
1773821f2c64SMasatake YAMATO 			extra = opt_name_new_from_cstr (extra_name);
1774821f2c64SMasatake YAMATO 		else
1775821f2c64SMasatake YAMATO 		{
1776821f2c64SMasatake YAMATO 			vString *tmp = vStringNewInit (lang_name);
1777821f2c64SMasatake YAMATO 			vStringPut (tmp, '.');
1778821f2c64SMasatake YAMATO 			vStringCatS (tmp, extra_name);
1779821f2c64SMasatake YAMATO 			extra = opt_name_new_from_cstr (vStringValue (tmp));
1780821f2c64SMasatake YAMATO 			vStringDelete (tmp);
1781821f2c64SMasatake YAMATO 		}
1782821f2c64SMasatake YAMATO 		opt_array_add (a, extra);
1783821f2c64SMasatake YAMATO 		es_object_unref (extra);
1784821f2c64SMasatake YAMATO 	}
1785821f2c64SMasatake YAMATO 	return a;
1786821f2c64SMasatake YAMATO }
178789bad945SMasatake YAMATO 
getFieldValueForCOMMON(const char * field,const tagEntryInfo * tag,const fieldDefinition * fdef)17881a38ddbbSMasatake YAMATO static EsObject* getFieldValueForCOMMON (const char *field, const tagEntryInfo *tag, const fieldDefinition *fdef)
17891a38ddbbSMasatake YAMATO {
17901a38ddbbSMasatake YAMATO 	if (!field)
17911a38ddbbSMasatake YAMATO 		return es_nil;
17921a38ddbbSMasatake YAMATO 	return (opt_name_new_from_cstr (field));
17931a38ddbbSMasatake YAMATO }
17941a38ddbbSMasatake YAMATO 
setFieldValueForCOMMON(const char ** field,tagEntryInfo * tag,const fieldDefinition * fdef,const EsObject * obj)17951a38ddbbSMasatake YAMATO static EsObject* setFieldValueForCOMMON (const char **field, tagEntryInfo *tag, const fieldDefinition *fdef, const EsObject *obj)
17961a38ddbbSMasatake YAMATO {
17971a38ddbbSMasatake YAMATO 	if (*field)
17981a38ddbbSMasatake YAMATO 		eFree ((char *)*field);
17991a38ddbbSMasatake YAMATO 
18001a38ddbbSMasatake YAMATO 	const char *str = opt_string_get_cstr (obj);
18011a38ddbbSMasatake YAMATO 	*field = eStrdup (str);
18021a38ddbbSMasatake YAMATO 	return es_false;
18031a38ddbbSMasatake YAMATO }
18041a38ddbbSMasatake YAMATO 
getFieldValueForAccess(const tagEntryInfo * tag,const fieldDefinition * fdef)18051a38ddbbSMasatake YAMATO static EsObject* getFieldValueForAccess (const tagEntryInfo *tag, const fieldDefinition *fdef)
18061a38ddbbSMasatake YAMATO {
18071a38ddbbSMasatake YAMATO 	return getFieldValueForCOMMON(tag->extensionFields.access, tag, fdef);
18081a38ddbbSMasatake YAMATO }
18091a38ddbbSMasatake YAMATO 
setFieldValueForAccess(tagEntryInfo * tag,const fieldDefinition * fdef,const EsObject * obj)18101a38ddbbSMasatake YAMATO static EsObject* setFieldValueForAccess (tagEntryInfo *tag, const fieldDefinition *fdef, const EsObject *obj)
18111a38ddbbSMasatake YAMATO {
18121a38ddbbSMasatake YAMATO 	return setFieldValueForCOMMON(&tag->extensionFields.access, tag, fdef, obj);
18131a38ddbbSMasatake YAMATO }
18141a38ddbbSMasatake YAMATO 
getFieldValueForSignature(const tagEntryInfo * tag,const fieldDefinition * fdef)181589bad945SMasatake YAMATO static EsObject* getFieldValueForSignature (const tagEntryInfo *tag, const fieldDefinition *fdef)
181689bad945SMasatake YAMATO {
18171a38ddbbSMasatake YAMATO 	return getFieldValueForCOMMON(tag->extensionFields.signature, tag, fdef);
181889bad945SMasatake YAMATO }
181989bad945SMasatake YAMATO 
setFieldValueForSignature(tagEntryInfo * tag,const fieldDefinition * fdef,const EsObject * obj)182089bad945SMasatake YAMATO static EsObject* setFieldValueForSignature (tagEntryInfo *tag, const fieldDefinition *fdef, const EsObject *obj)
182189bad945SMasatake YAMATO {
18221a38ddbbSMasatake YAMATO 	return setFieldValueForCOMMON(&tag->extensionFields.signature, tag, fdef, obj);
182389bad945SMasatake YAMATO }
1824faa51974SMasatake YAMATO 
makeRolesArray(const tagEntryInfo * const tag,int roleIndex,void * data)1825faa51974SMasatake YAMATO static void makeRolesArray (const tagEntryInfo *const tag, int roleIndex, void *data)
1826faa51974SMasatake YAMATO {
1827faa51974SMasatake YAMATO 	EsObject *a = data;
1828faa51974SMasatake YAMATO 
1829faa51974SMasatake YAMATO 	const roleDefinition *role = getTagRole (tag, roleIndex);
1830faa51974SMasatake YAMATO 	EsObject *r = opt_name_new_from_cstr (role->name);
1831faa51974SMasatake YAMATO 	opt_array_add (a, r);
1832faa51974SMasatake YAMATO 	es_object_unref (r);
1833faa51974SMasatake YAMATO }
1834faa51974SMasatake YAMATO 
getFieldValueForRoles(const tagEntryInfo * tag,const fieldDefinition * fdef)1835faa51974SMasatake YAMATO static EsObject* getFieldValueForRoles (const tagEntryInfo *tag, const fieldDefinition *fdef)
1836faa51974SMasatake YAMATO {
1837faa51974SMasatake YAMATO 	EsObject *a = opt_array_new ();
1838faa51974SMasatake YAMATO 
1839faa51974SMasatake YAMATO 	if (!foreachRoleBits (tag, makeRolesArray, a))
1840faa51974SMasatake YAMATO 	{
1841faa51974SMasatake YAMATO 		EsObject *r = opt_name_new_from_cstr (ROLE_DEFINITION_NAME);
1842faa51974SMasatake YAMATO 		opt_array_add (a, r);
1843faa51974SMasatake YAMATO 		es_object_unref (r);
1844faa51974SMasatake YAMATO 	}
1845faa51974SMasatake YAMATO 	return a;
1846faa51974SMasatake YAMATO }
1847c19ead26SMasatake YAMATO 
getFieldValueForLineCommon(const tagEntryInfo * tag,const fieldDefinition * fdef)184858c76546SMasatake YAMATO static EsObject* getFieldValueForLineCommon (const tagEntryInfo *tag, const fieldDefinition *fdef)
1849c19ead26SMasatake YAMATO {
185058c76546SMasatake YAMATO 	if (fdef->ftype == FIELD_END_LINE)
1851c19ead26SMasatake YAMATO 		return ((int)tag->extensionFields.endLine == 0)
1852c19ead26SMasatake YAMATO 			? es_nil
1853c19ead26SMasatake YAMATO 			: es_integer_new ((int)tag->extensionFields.endLine);
185458c76546SMasatake YAMATO 	else
185558c76546SMasatake YAMATO 		return ((int)tag->lineNumber == 0)
185658c76546SMasatake YAMATO 			? es_nil
185758c76546SMasatake YAMATO 			: es_integer_new ((int)tag->lineNumber);
1858c19ead26SMasatake YAMATO }
1859c19ead26SMasatake YAMATO 
checkFieldValueForLineCommon(const fieldDefinition * fdef,const EsObject * obj)186058c76546SMasatake YAMATO static EsObject* checkFieldValueForLineCommon (const fieldDefinition *fdef, const EsObject *obj)
1861c19ead26SMasatake YAMATO {
1862c19ead26SMasatake YAMATO 	return es_false;
1863c19ead26SMasatake YAMATO }
1864c19ead26SMasatake YAMATO 
setFieldValueForLineCommon(tagEntryInfo * tag,const fieldDefinition * fdef,const EsObject * obj)186558c76546SMasatake YAMATO static EsObject* setFieldValueForLineCommon (tagEntryInfo *tag, const fieldDefinition *fdef, const EsObject *obj)
1866c19ead26SMasatake YAMATO {
1867c19ead26SMasatake YAMATO 	int l;
1868c19ead26SMasatake YAMATO 	if (es_object_get_type (obj) == OPT_TYPE_MATCHLOC)
1869c19ead26SMasatake YAMATO 	{
1870c19ead26SMasatake YAMATO 		matchLoc *loc = es_pointer_get (obj);
1871c19ead26SMasatake YAMATO 		l = loc->line;
1872c19ead26SMasatake YAMATO 	}
1873c19ead26SMasatake YAMATO 	else if (es_integer_p (obj))
1874c19ead26SMasatake YAMATO 	{
1875c19ead26SMasatake YAMATO 		l = es_integer_get (obj);
1876c19ead26SMasatake YAMATO 		if (l < 1)
1877c19ead26SMasatake YAMATO 			return OPT_ERR_RANGECHECK;
187836d4a5d4SMasatake YAMATO 
187936d4a5d4SMasatake YAMATO 		/* If the new line number is too large,
188036d4a5d4SMasatake YAMATO 		   we cannot fill tag->filePosition wit
188136d4a5d4SMasatake YAMATO 		   getInputFilePositionForLine(); */
188236d4a5d4SMasatake YAMATO 		if (fdef->ftype == FIELD_LINE_NUMBER
188336d4a5d4SMasatake YAMATO 			&& l < getInputLineNumber())
188436d4a5d4SMasatake YAMATO 			return OPT_ERR_RANGECHECK;
1885c19ead26SMasatake YAMATO 	}
1886c19ead26SMasatake YAMATO 	else
1887c19ead26SMasatake YAMATO 		return OPT_ERR_TYPECHECK;
1888c19ead26SMasatake YAMATO 
188958c76546SMasatake YAMATO 	if (fdef->ftype == FIELD_END_LINE)
1890c19ead26SMasatake YAMATO 		tag->extensionFields.endLine = l;
189158c76546SMasatake YAMATO 	else
189236d4a5d4SMasatake YAMATO 	{
189358c76546SMasatake YAMATO 		tag->lineNumber = l;
189436d4a5d4SMasatake YAMATO 		tag->filePosition = getInputFilePositionForLine (l);
189536d4a5d4SMasatake YAMATO 	}
189658c76546SMasatake YAMATO 
1897c19ead26SMasatake YAMATO 	return es_false;
1898c19ead26SMasatake YAMATO }
189928e43d19SMasatake YAMATO 
setFieldValueForInherits(tagEntryInfo * tag,const fieldDefinition * fdef,const EsObject * obj)190028e43d19SMasatake YAMATO static EsObject* setFieldValueForInherits (tagEntryInfo *tag, const fieldDefinition *fdef, const EsObject *obj)
190128e43d19SMasatake YAMATO {
190228e43d19SMasatake YAMATO 	if (es_object_get_type (obj) == OPT_TYPE_STRING)
190328e43d19SMasatake YAMATO 	{
190428e43d19SMasatake YAMATO 		if (tag->extensionFields.inheritance)
190528e43d19SMasatake YAMATO 			eFree ((void *)tag->extensionFields.inheritance);
190628e43d19SMasatake YAMATO 		const char *str = opt_string_get_cstr (obj);
190728e43d19SMasatake YAMATO 		tag->extensionFields.inheritance = eStrdup (str);
190828e43d19SMasatake YAMATO 	}
190928e43d19SMasatake YAMATO 	else if (es_object_equal (es_false, obj))
191028e43d19SMasatake YAMATO 	{
191128e43d19SMasatake YAMATO 		if (tag->extensionFields.inheritance)
191228e43d19SMasatake YAMATO 		{
191328e43d19SMasatake YAMATO 			eFree ((void *)tag->extensionFields.inheritance);
191428e43d19SMasatake YAMATO 			tag->extensionFields.inheritance = NULL;
191528e43d19SMasatake YAMATO 		}
191628e43d19SMasatake YAMATO 	}
191728e43d19SMasatake YAMATO 	else
191828e43d19SMasatake YAMATO 		return OPT_ERR_RANGECHECK; /* true is not acceptable. */
191928e43d19SMasatake YAMATO 
192028e43d19SMasatake YAMATO 	return es_false;
192128e43d19SMasatake YAMATO }
1922