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