xref: /Universal-ctags/parsers/yaml.c (revision 5ee7d66f499a2ddc0eada4e7e6edbd66ee1cadac)
1288cd67dSMasatake YAMATO /*
2288cd67dSMasatake YAMATO *   Copyright (c) 2016, Masatake YAMATO
3288cd67dSMasatake YAMATO *   Copyright (c) 2016, Red Hat, Inc.
4ac85afa5SMasatake YAMATO *   Copyright (c) 2022, Vasily Kulikov
5288cd67dSMasatake YAMATO *
6288cd67dSMasatake YAMATO *   This source code is released for free distribution under the terms of the
7288cd67dSMasatake YAMATO *   GNU General Public License version 2 or (at your option) any later version.
8288cd67dSMasatake YAMATO *
9288cd67dSMasatake YAMATO *   This module contains functions for applying yaml traversing.
10288cd67dSMasatake YAMATO */
11288cd67dSMasatake YAMATO 
12288cd67dSMasatake YAMATO #include "general.h"  /* must always come first */
13288cd67dSMasatake YAMATO 
14037e9fa4SK.Takata #include <inttypes.h>
15037e9fa4SK.Takata 
16288cd67dSMasatake YAMATO #include "debug.h"
1714781660SMasatake YAMATO #include "entry.h"
18288cd67dSMasatake YAMATO #include "htable.h"
19288cd67dSMasatake YAMATO #include "options.h"
20288cd67dSMasatake YAMATO #include "parse.h"
21288cd67dSMasatake YAMATO #include "read.h"
220051d650SMasatake YAMATO #include "subparser.h"
23cbcd5d30SMasatake YAMATO #include "trace.h"
24288cd67dSMasatake YAMATO #include "types.h"
2587214e15SMasatake YAMATO #include "yaml.h"
26288cd67dSMasatake YAMATO 
27ac85afa5SMasatake YAMATO #include "numarray.h"
28ac85afa5SMasatake YAMATO #include "keyword.h"
29ac85afa5SMasatake YAMATO #include "trashbox.h"
30288cd67dSMasatake YAMATO 
31288cd67dSMasatake YAMATO 
32288cd67dSMasatake YAMATO #define entry(X) [X] = #X
33288cd67dSMasatake YAMATO static const char *tokenTypeName [] = {
34288cd67dSMasatake YAMATO     entry (YAML_NO_TOKEN),
35288cd67dSMasatake YAMATO     entry (YAML_STREAM_START_TOKEN),
36288cd67dSMasatake YAMATO     entry (YAML_STREAM_END_TOKEN),
37288cd67dSMasatake YAMATO     entry (YAML_VERSION_DIRECTIVE_TOKEN),
38288cd67dSMasatake YAMATO     entry (YAML_TAG_DIRECTIVE_TOKEN),
39288cd67dSMasatake YAMATO     entry (YAML_DOCUMENT_START_TOKEN),
40288cd67dSMasatake YAMATO     entry (YAML_DOCUMENT_END_TOKEN),
41288cd67dSMasatake YAMATO     entry (YAML_BLOCK_SEQUENCE_START_TOKEN),
42288cd67dSMasatake YAMATO     entry (YAML_BLOCK_MAPPING_START_TOKEN),
43288cd67dSMasatake YAMATO     entry (YAML_BLOCK_END_TOKEN),
44288cd67dSMasatake YAMATO     entry (YAML_FLOW_SEQUENCE_START_TOKEN),
45288cd67dSMasatake YAMATO     entry (YAML_FLOW_SEQUENCE_END_TOKEN),
46288cd67dSMasatake YAMATO     entry (YAML_FLOW_MAPPING_START_TOKEN),
47288cd67dSMasatake YAMATO     entry (YAML_FLOW_MAPPING_END_TOKEN),
48288cd67dSMasatake YAMATO     entry (YAML_BLOCK_ENTRY_TOKEN),
49288cd67dSMasatake YAMATO     entry (YAML_FLOW_ENTRY_TOKEN),
50288cd67dSMasatake YAMATO     entry (YAML_KEY_TOKEN),
51288cd67dSMasatake YAMATO     entry (YAML_VALUE_TOKEN),
52288cd67dSMasatake YAMATO     entry (YAML_ALIAS_TOKEN),
53288cd67dSMasatake YAMATO     entry (YAML_ANCHOR_TOKEN),
54288cd67dSMasatake YAMATO     entry (YAML_TAG_TOKEN),
55288cd67dSMasatake YAMATO     entry (YAML_SCALAR_TOKEN),
56288cd67dSMasatake YAMATO };
57288cd67dSMasatake YAMATO 
yamlInit(yaml_parser_t * yaml)58288cd67dSMasatake YAMATO static void yamlInit (yaml_parser_t *yaml)
59288cd67dSMasatake YAMATO {
60288cd67dSMasatake YAMATO 	const unsigned char* data;
61288cd67dSMasatake YAMATO 	size_t size;
62288cd67dSMasatake YAMATO 
63288cd67dSMasatake YAMATO 	yaml_parser_initialize (yaml);
64288cd67dSMasatake YAMATO 
65288cd67dSMasatake YAMATO 	data = getInputFileData (&size);
66288cd67dSMasatake YAMATO 	Assert (data);
67288cd67dSMasatake YAMATO 
68288cd67dSMasatake YAMATO 	yaml_parser_set_input_string (yaml, data, size);
69288cd67dSMasatake YAMATO }
70288cd67dSMasatake YAMATO 
yamlFini(yaml_parser_t * yaml)71288cd67dSMasatake YAMATO static void yamlFini (yaml_parser_t *yaml)
72288cd67dSMasatake YAMATO {
73288cd67dSMasatake YAMATO 	yaml_parser_delete (yaml);
74288cd67dSMasatake YAMATO }
75288cd67dSMasatake YAMATO 
attachYamlPosition(tagEntryInfo * tag,yaml_token_t * token,bool asEndPosition)76f3fffd78SMasatake YAMATO extern void attachYamlPosition (tagEntryInfo *tag, yaml_token_t *token, bool asEndPosition)
77288cd67dSMasatake YAMATO {
78f3fffd78SMasatake YAMATO 	unsigned int ln = token->start_mark.line + 1;
79f3fffd78SMasatake YAMATO 
80f3fffd78SMasatake YAMATO 	if (asEndPosition)
81f3fffd78SMasatake YAMATO 		tag->extensionFields.endLine = ln;
82f3fffd78SMasatake YAMATO 	else
83f3fffd78SMasatake YAMATO 	{
84f3fffd78SMasatake YAMATO 		tag->lineNumber = ln;
85288cd67dSMasatake YAMATO 		tag->filePosition = getInputFilePositionForLine (tag->lineNumber);
86288cd67dSMasatake YAMATO 	}
87f3fffd78SMasatake YAMATO }
88288cd67dSMasatake YAMATO 
89288cd67dSMasatake YAMATO enum YamlKind {
90288cd67dSMasatake YAMATO 	K_ANCHOR,
91288cd67dSMasatake YAMATO };
92288cd67dSMasatake YAMATO 
93288cd67dSMasatake YAMATO enum YamlAnchorRole {
94288cd67dSMasatake YAMATO 	R_ANCHOR_ALIAS,
95288cd67dSMasatake YAMATO };
96288cd67dSMasatake YAMATO 
9713457258SMasatake YAMATO static roleDefinition YamlAnchorRoles [] = {
98288cd67dSMasatake YAMATO 	{ true, "alias", "alias" },
99288cd67dSMasatake YAMATO };
100288cd67dSMasatake YAMATO 
101e112e8abSMasatake YAMATO static kindDefinition YamlKinds [] = {
10289320ddcSMasatake YAMATO 	{ true,  'a', "anchor", "anchors",
103288cd67dSMasatake YAMATO 	  .referenceOnly = false, ATTACH_ROLES(YamlAnchorRoles) },
104288cd67dSMasatake YAMATO };
105288cd67dSMasatake YAMATO 
handlYamlToken(yaml_token_t * token)1060051d650SMasatake YAMATO static void handlYamlToken (yaml_token_t *token)
107288cd67dSMasatake YAMATO {
108288cd67dSMasatake YAMATO 	tagEntryInfo tag;
109288cd67dSMasatake YAMATO 
110288cd67dSMasatake YAMATO 	if (token->type == YAML_ANCHOR_TOKEN)
111288cd67dSMasatake YAMATO 	{
112288cd67dSMasatake YAMATO 		initTagEntry (&tag, (char *)token->data.anchor.value,
11316a2541cSMasatake YAMATO 					  K_ANCHOR);
114f3fffd78SMasatake YAMATO 		attachYamlPosition (&tag, token, false);
115288cd67dSMasatake YAMATO 		makeTagEntry (&tag);
116288cd67dSMasatake YAMATO 	}
117288cd67dSMasatake YAMATO 	else if (token->type == YAML_ALIAS_TOKEN)
118288cd67dSMasatake YAMATO 	{
119288cd67dSMasatake YAMATO 		initRefTagEntry (&tag, (char *)token->data.alias.value,
12016a2541cSMasatake YAMATO 						 K_ANCHOR, R_ANCHOR_ALIAS);
121f3fffd78SMasatake YAMATO 		attachYamlPosition (&tag, token, false);
122288cd67dSMasatake YAMATO 		makeTagEntry (&tag);
123288cd67dSMasatake YAMATO 	}
124288cd67dSMasatake YAMATO }
125288cd67dSMasatake YAMATO 
findYamlTags(void)1260051d650SMasatake YAMATO static void findYamlTags (void)
127288cd67dSMasatake YAMATO {
1280051d650SMasatake YAMATO 	subparser *sub;
1290051d650SMasatake YAMATO 	yaml_parser_t yaml;
1300051d650SMasatake YAMATO 	yaml_token_t token;
1310051d650SMasatake YAMATO 	bool done;
1320051d650SMasatake YAMATO 
1330051d650SMasatake YAMATO 	yamlInit (&yaml);
1340051d650SMasatake YAMATO 
1350051d650SMasatake YAMATO 	findRegexTags ();
1360051d650SMasatake YAMATO 
137da6a8e25SMasatake YAMATO 	foreachSubparser(sub, false)
138da6a8e25SMasatake YAMATO 	{
139da6a8e25SMasatake YAMATO 		enterSubparser (sub);
140da6a8e25SMasatake YAMATO 		((yamlSubparser*)sub)->ypathTypeStack = NULL;
141da6a8e25SMasatake YAMATO 		leaveSubparser ();
142da6a8e25SMasatake YAMATO 	}
143da6a8e25SMasatake YAMATO 
1440051d650SMasatake YAMATO 	sub = getSubparserRunningBaseparser();
1450051d650SMasatake YAMATO 	if (sub)
1460051d650SMasatake YAMATO 		chooseExclusiveSubparser (sub, NULL);
1470051d650SMasatake YAMATO 
1480051d650SMasatake YAMATO 	done = false;
1490051d650SMasatake YAMATO 	while (!done)
1500051d650SMasatake YAMATO 	{
1510051d650SMasatake YAMATO 		if (!yaml_parser_scan (&yaml, &token))
1520051d650SMasatake YAMATO 			break;
1530051d650SMasatake YAMATO 
1540051d650SMasatake YAMATO 		handlYamlToken (&token);
15511358a9dSMasatake YAMATO 		foreachSubparser(sub, false)
1560051d650SMasatake YAMATO 		{
1570051d650SMasatake YAMATO 			enterSubparser (sub);
1580051d650SMasatake YAMATO 			((yamlSubparser *)sub)->newTokenNotfify ((yamlSubparser *)sub, &token);
1590051d650SMasatake YAMATO 			leaveSubparser ();
1600051d650SMasatake YAMATO 		}
1610051d650SMasatake YAMATO 
162cbcd5d30SMasatake YAMATO 		TRACE_PRINT("yaml token:%s<%d>@Line:%"PRIuPTR"", tokenTypeName[token.type], token.type,
1630051d650SMasatake YAMATO 				token.start_mark.line + 1);
164cbcd5d30SMasatake YAMATO 		if (isTraced() && token.type == YAML_SCALAR_TOKEN)
165cbcd5d30SMasatake YAMATO 		{
166cbcd5d30SMasatake YAMATO 			TRACE_PRINT_FMT("	");
167cbcd5d30SMasatake YAMATO 			for (size_t i = 0; i < token.data.scalar.length; i++)
168cbcd5d30SMasatake YAMATO 				TRACE_PRINT_FMT("%c", token.data.scalar.value[i]);
169cbcd5d30SMasatake YAMATO 			TRACE_PRINT_NEWLINE();
170cbcd5d30SMasatake YAMATO 		}
171cbcd5d30SMasatake YAMATO 
1720051d650SMasatake YAMATO 		if (token.type == YAML_STREAM_END_TOKEN)
1730051d650SMasatake YAMATO 			done = true;
1740051d650SMasatake YAMATO 
1750051d650SMasatake YAMATO 		yaml_token_delete (&token);
1760051d650SMasatake YAMATO 	}
177*5ee7d66fSMasatake YAMATO 
178*5ee7d66fSMasatake YAMATO 	foreachSubparser(sub, false)
179*5ee7d66fSMasatake YAMATO 	{
180*5ee7d66fSMasatake YAMATO 		enterSubparser (sub);
181*5ee7d66fSMasatake YAMATO 		ypathPopAllTypes ((yamlSubparser*)sub);
182*5ee7d66fSMasatake YAMATO 		leaveSubparser ();
183*5ee7d66fSMasatake YAMATO 	}
184*5ee7d66fSMasatake YAMATO 
1850051d650SMasatake YAMATO 	yamlFini (&yaml);
186288cd67dSMasatake YAMATO }
187288cd67dSMasatake YAMATO 
YamlParser(void)188288cd67dSMasatake YAMATO extern parserDefinition* YamlParser (void)
189288cd67dSMasatake YAMATO {
190f3ff60abSMasatake YAMATO 	static const char *const extensions [] = { "yml", "yaml", NULL };
191288cd67dSMasatake YAMATO 	parserDefinition* const def = parserNew ("Yaml");
192288cd67dSMasatake YAMATO 
19309ae690fSMasatake YAMATO 	def->kindTable = YamlKinds;
194288cd67dSMasatake YAMATO 	def->extensions = extensions;
195288cd67dSMasatake YAMATO 	def->parser = findYamlTags;
1966b1a862eSMasatake YAMATO 	def->useCork = CORK_QUEUE;
19709ae690fSMasatake YAMATO 	def->kindTable = YamlKinds;
198288cd67dSMasatake YAMATO 	def->kindCount = ARRAY_SIZE (YamlKinds);
199e535639cSMasatake YAMATO 	def->useMemoryStreamInput = true;
200288cd67dSMasatake YAMATO 
201288cd67dSMasatake YAMATO 	return def;
202288cd67dSMasatake YAMATO }
203ac85afa5SMasatake YAMATO 
204ac85afa5SMasatake YAMATO /*
205ac85afa5SMasatake YAMATO  * Experimental Ypath code
206ac85afa5SMasatake YAMATO  */
207ac85afa5SMasatake YAMATO struct ypathTypeStack {
208ac85afa5SMasatake YAMATO 	yaml_token_type_t type;
209ac85afa5SMasatake YAMATO 	int key;
210ac85afa5SMasatake YAMATO 	struct ypathTypeStack *next;
211ac85afa5SMasatake YAMATO };
212ac85afa5SMasatake YAMATO 
ypathCompileTable(langType language,tagYpathTable * table,int keywordId)213ac85afa5SMasatake YAMATO extern int ypathCompileTable (langType language, tagYpathTable *table, int keywordId)
214ac85afa5SMasatake YAMATO {
215ac85afa5SMasatake YAMATO 	vString *tmpkey = vStringNew();
216ac85afa5SMasatake YAMATO 	intArray *code = intArrayNew ();
217ac85afa5SMasatake YAMATO 
218ac85afa5SMasatake YAMATO 	for (const char *ypath = table->ypath; true; ypath++)
219ac85afa5SMasatake YAMATO 	{
220ac85afa5SMasatake YAMATO 		if (*ypath == '/' || *ypath == '\0')
221ac85afa5SMasatake YAMATO 		{
222ac85afa5SMasatake YAMATO 			if (!vStringIsEmpty (tmpkey))
223ac85afa5SMasatake YAMATO 			{
224ac85afa5SMasatake YAMATO 				int k;
225ac85afa5SMasatake YAMATO 				if (vStringLength (tmpkey) == 1 && (vStringValue (tmpkey)[0] == '*'))
226ac85afa5SMasatake YAMATO 					k = KEYWORD_NONE;
227ac85afa5SMasatake YAMATO 				else
228ac85afa5SMasatake YAMATO 				{
229ac85afa5SMasatake YAMATO 					k = lookupKeyword (vStringValue (tmpkey), language);
230ac85afa5SMasatake YAMATO 					if (k == KEYWORD_NONE)
231ac85afa5SMasatake YAMATO 					{
232ac85afa5SMasatake YAMATO 						char *keyword = DEFAULT_TRASH_BOX(vStringStrdup (tmpkey), eFree);
233ac85afa5SMasatake YAMATO 						k = keywordId++;
234ac85afa5SMasatake YAMATO 						addKeyword (keyword, language, k);
235ac85afa5SMasatake YAMATO 					}
236ac85afa5SMasatake YAMATO 				}
237ac85afa5SMasatake YAMATO 				intArrayAdd (code, k);
238ac85afa5SMasatake YAMATO 				vStringClear (tmpkey);
239ac85afa5SMasatake YAMATO 			}
240ac85afa5SMasatake YAMATO 			if (*ypath == '\0')
241ac85afa5SMasatake YAMATO 				break;
242ac85afa5SMasatake YAMATO 		}
243ac85afa5SMasatake YAMATO 		else
244ac85afa5SMasatake YAMATO 			vStringPut (tmpkey, *ypath);
245ac85afa5SMasatake YAMATO 	}
246ac85afa5SMasatake YAMATO 
247ac85afa5SMasatake YAMATO 	intArrayReverse (code);
248ac85afa5SMasatake YAMATO 	table->code = code;
249ac85afa5SMasatake YAMATO 
250ac85afa5SMasatake YAMATO 	vStringDelete (tmpkey);
251ac85afa5SMasatake YAMATO 	return keywordId;
252ac85afa5SMasatake YAMATO }
253ac85afa5SMasatake YAMATO 
ypathCompileTables(langType language,tagYpathTable tables[],size_t count,int keywordId)254ac85afa5SMasatake YAMATO extern void ypathCompileTables (langType language, tagYpathTable tables[], size_t count, int keywordId)
255ac85afa5SMasatake YAMATO {
256ac85afa5SMasatake YAMATO 	for (size_t i = 0; i < count; i++)
257ac85afa5SMasatake YAMATO 		keywordId = ypathCompileTable (language, tables + i, keywordId);
258ac85afa5SMasatake YAMATO }
259ac85afa5SMasatake YAMATO 
ypathCompiledCodeDelete(tagYpathTable tables[],size_t count)260ac85afa5SMasatake YAMATO extern void ypathCompiledCodeDelete (tagYpathTable tables[], size_t count)
261ac85afa5SMasatake YAMATO {
262ac85afa5SMasatake YAMATO 	for (size_t i = 0; i < count; i++)
263ac85afa5SMasatake YAMATO 	{
264ac85afa5SMasatake YAMATO 		intArrayDelete (tables[i].code);
265ac85afa5SMasatake YAMATO 		tables[i].code = NULL;
266ac85afa5SMasatake YAMATO 	}
267ac85afa5SMasatake YAMATO }
268ac85afa5SMasatake YAMATO 
ypathPushType(yamlSubparser * yaml,yaml_token_t * token)269ac85afa5SMasatake YAMATO extern void ypathPushType (yamlSubparser *yaml, yaml_token_t *token)
270ac85afa5SMasatake YAMATO {
271ac85afa5SMasatake YAMATO 	struct ypathTypeStack *s;
272ac85afa5SMasatake YAMATO 
273ac85afa5SMasatake YAMATO 	s = xMalloc (1, struct ypathTypeStack);
274ac85afa5SMasatake YAMATO 
275ac85afa5SMasatake YAMATO 	s->next = yaml->ypathTypeStack;
276ac85afa5SMasatake YAMATO 	yaml->ypathTypeStack = s;
277ac85afa5SMasatake YAMATO 
278ac85afa5SMasatake YAMATO 	s->type = token->type;
279ac85afa5SMasatake YAMATO 	s->key = KEYWORD_NONE;
280ac85afa5SMasatake YAMATO }
281ac85afa5SMasatake YAMATO 
ypathPopType(yamlSubparser * yaml)282ac85afa5SMasatake YAMATO extern void ypathPopType (yamlSubparser *yaml)
283ac85afa5SMasatake YAMATO {
284ac85afa5SMasatake YAMATO 	struct ypathTypeStack *s;
285ac85afa5SMasatake YAMATO 
286ac85afa5SMasatake YAMATO 	s = yaml->ypathTypeStack;
287ac85afa5SMasatake YAMATO 	yaml->ypathTypeStack = s->next;
288ac85afa5SMasatake YAMATO 
289ac85afa5SMasatake YAMATO 	s->next = NULL;
290ac85afa5SMasatake YAMATO 
291ac85afa5SMasatake YAMATO 	eFree (s);
292ac85afa5SMasatake YAMATO }
293ac85afa5SMasatake YAMATO 
ypathPopAllTypes(yamlSubparser * yaml)294ac85afa5SMasatake YAMATO extern void ypathPopAllTypes (yamlSubparser *yaml)
295ac85afa5SMasatake YAMATO {
296ac85afa5SMasatake YAMATO 	while (yaml->ypathTypeStack)
297ac85afa5SMasatake YAMATO 		ypathPopType (yaml);
298ac85afa5SMasatake YAMATO }
299ac85afa5SMasatake YAMATO 
ypathFillKeywordOfTokenMaybe(yamlSubparser * yaml,yaml_token_t * token,langType lang)300ac85afa5SMasatake YAMATO extern void ypathFillKeywordOfTokenMaybe (yamlSubparser *yaml, yaml_token_t *token, langType lang)
301ac85afa5SMasatake YAMATO {
302ac85afa5SMasatake YAMATO 	if (!yaml->ypathTypeStack)
303ac85afa5SMasatake YAMATO 		return;
304ac85afa5SMasatake YAMATO 
305ac85afa5SMasatake YAMATO 	int k = lookupKeyword ((char *)token->data.scalar.value, lang);
306ac85afa5SMasatake YAMATO 	yaml->ypathTypeStack->key = k;
307ac85afa5SMasatake YAMATO }
308ac85afa5SMasatake YAMATO 
ypathStateStackMatch(struct ypathTypeStack * stack,intArray * code,size_t offset)309ac85afa5SMasatake YAMATO static bool ypathStateStackMatch (struct ypathTypeStack *stack,
310ac85afa5SMasatake YAMATO 								  intArray *code, size_t offset)
311ac85afa5SMasatake YAMATO {
312ac85afa5SMasatake YAMATO 	if (intArrayCount (code) - offset == 0)
313ac85afa5SMasatake YAMATO 	{
314ac85afa5SMasatake YAMATO 		if (stack == NULL)
315ac85afa5SMasatake YAMATO 			return true;
316ac85afa5SMasatake YAMATO 		else
317ac85afa5SMasatake YAMATO 			return false;
318ac85afa5SMasatake YAMATO 	}
319ac85afa5SMasatake YAMATO 
320ac85afa5SMasatake YAMATO 	if (stack == NULL)
321ac85afa5SMasatake YAMATO 		return false;
322ac85afa5SMasatake YAMATO 
323ac85afa5SMasatake YAMATO 	if (stack->key == intArrayItem (code, offset))
324ac85afa5SMasatake YAMATO 		return ypathStateStackMatch (stack->next, code, offset + 1);
325ac85afa5SMasatake YAMATO 	else
326ac85afa5SMasatake YAMATO 		return false;
327ac85afa5SMasatake YAMATO }
328ac85afa5SMasatake YAMATO 
ypathHandleToken(yamlSubparser * yaml,yaml_token_t * token,int state,tagYpathTable tables[],size_t count)329ac85afa5SMasatake YAMATO extern void ypathHandleToken (yamlSubparser *yaml, yaml_token_t *token, int state,
330ac85afa5SMasatake YAMATO 							  tagYpathTable tables[], size_t count)
331ac85afa5SMasatake YAMATO {
332ac85afa5SMasatake YAMATO 	if (!yaml->ypathTypeStack)
333ac85afa5SMasatake YAMATO 		return;
334ac85afa5SMasatake YAMATO 
335ac85afa5SMasatake YAMATO 	for (size_t i = 0; i < count; i++)
336ac85afa5SMasatake YAMATO 	{
337ac85afa5SMasatake YAMATO 		if (tables[i].expected_state != state)
338ac85afa5SMasatake YAMATO 			continue;
339ac85afa5SMasatake YAMATO 
340ac85afa5SMasatake YAMATO 		if (ypathStateStackMatch(yaml->ypathTypeStack, tables[i].code, 0))
341ac85afa5SMasatake YAMATO 		{
342ac85afa5SMasatake YAMATO 			tagEntryInfo tag;
34396a5e6d9SMasatake YAMATO 			bool r = true;
34496a5e6d9SMasatake YAMATO 			if (tables[i].initTagEntry)
34596a5e6d9SMasatake YAMATO 				r = (* tables[i].initTagEntry) (&tag, (char *)token->data.scalar.value,
34696a5e6d9SMasatake YAMATO 												tables[i].data);
34796a5e6d9SMasatake YAMATO 			else
348ac85afa5SMasatake YAMATO 				initTagEntry (&tag, (char *)token->data.scalar.value, tables[i].kind);
349ac85afa5SMasatake YAMATO 
35096a5e6d9SMasatake YAMATO 			if (r)
35196a5e6d9SMasatake YAMATO 			{
35296a5e6d9SMasatake YAMATO 				attachYamlPosition (&tag, token, false);
353ac85afa5SMasatake YAMATO 				makeTagEntry (&tag);
35496a5e6d9SMasatake YAMATO 			}
355ac85afa5SMasatake YAMATO 			break;
356ac85afa5SMasatake YAMATO 		}
357ac85afa5SMasatake YAMATO 	}
358ac85afa5SMasatake YAMATO }
359ac85afa5SMasatake YAMATO 
360ac85afa5SMasatake YAMATO #ifdef DO_TRACING
ypathPrintTypeStack0(struct ypathTypeStack * stack)361ac85afa5SMasatake YAMATO extern void ypathPrintTypeStack0(struct ypathTypeStack *stack)
362ac85afa5SMasatake YAMATO {
363ac85afa5SMasatake YAMATO 	if (!stack)
364ac85afa5SMasatake YAMATO 	{
365ac85afa5SMasatake YAMATO 		TRACE_PRINT_NEWLINE();
366ac85afa5SMasatake YAMATO 		return;
367ac85afa5SMasatake YAMATO 	}
368ac85afa5SMasatake YAMATO 
369ac85afa5SMasatake YAMATO 	tracePrintFmt("[%d] - ", stack->key);
370ac85afa5SMasatake YAMATO 	ypathPrintTypeStack0 (stack->next);
371ac85afa5SMasatake YAMATO }
372ac85afa5SMasatake YAMATO 
ypathPrintTypeStack(yamlSubparser * yaml)373ac85afa5SMasatake YAMATO extern void ypathPrintTypeStack(yamlSubparser *yaml)
374ac85afa5SMasatake YAMATO {
375ac85afa5SMasatake YAMATO 	ypathPrintTypeStack0 (yaml->ypathTypeStack);
376ac85afa5SMasatake YAMATO }
377ac85afa5SMasatake YAMATO #else
ypathPrintTypeStack(yamlSubparser * yaml)378ac85afa5SMasatake YAMATO extern void ypathPrintTypeStack(yamlSubparser *yaml) {}
379ac85afa5SMasatake YAMATO #endif
380