123765793SMasatake YAMATO /*
223765793SMasatake YAMATO *
323765793SMasatake YAMATO * Copyright (c) 2016, Masatake YAMATO
423765793SMasatake YAMATO * Copyright (c) 2016, Red Hat, K.K.
523765793SMasatake YAMATO *
623765793SMasatake YAMATO * This source code is released for free distribution under the terms of the
723765793SMasatake YAMATO * GNU General Public License version 2 or (at your option) any later version.
823765793SMasatake YAMATO *
923765793SMasatake YAMATO * This module contains functions for generating tags for xslt 1.0.
1023765793SMasatake YAMATO * Reference: https://www.w3.org/1999/11/xslt10.dtd
1123765793SMasatake YAMATO *
1223765793SMasatake YAMATO */
1323765793SMasatake YAMATO
1423765793SMasatake YAMATO #include "general.h" /* must always come first */
1523765793SMasatake YAMATO
1623765793SMasatake YAMATO #include <string.h>
1723765793SMasatake YAMATO
1814781660SMasatake YAMATO #include "entry.h"
1923765793SMasatake YAMATO #include "options.h"
2023765793SMasatake YAMATO #include "parse.h"
2123765793SMasatake YAMATO #include "read.h"
2223765793SMasatake YAMATO #include "routines.h"
2323765793SMasatake YAMATO #include "selectors.h"
24f681f9a9SMasatake YAMATO #include "xml.h"
2523765793SMasatake YAMATO
2623765793SMasatake YAMATO typedef enum {
2723765793SMasatake YAMATO K_STYLESHEET,
2823765793SMasatake YAMATO K_PARAMETER,
2923765793SMasatake YAMATO K_MATCHED_TEMPLATE,
3023765793SMasatake YAMATO K_NAMED_TEMPLATE,
3123765793SMasatake YAMATO K_VARIABLE,
3223765793SMasatake YAMATO /* TODO: KEY, DECIMAL-FORMAT, ATTRIBUTE, ATTRIBUTE-SET, ... */
3323765793SMasatake YAMATO } xsltKind;
3423765793SMasatake YAMATO
3523765793SMasatake YAMATO typedef enum {
3623765793SMasatake YAMATO R_STYLESHEET_IMPORTED,
3723765793SMasatake YAMATO R_STYLESHEET_INCLUDED,
3823765793SMasatake YAMATO } xsltStylesheetRole;
3913457258SMasatake YAMATO static roleDefinition XsltStylesheetRoles [] = {
40ce990805SThomas Braun { true, "imported", "imported" },
41ce990805SThomas Braun { true, "included", "included" },
4223765793SMasatake YAMATO };
4323765793SMasatake YAMATO
4423765793SMasatake YAMATO typedef enum {
4523765793SMasatake YAMATO R_PARAMETER_BOUND,
4623765793SMasatake YAMATO } xsltParameterRole;
4713457258SMasatake YAMATO static roleDefinition XsltParameterRoles [] = {
48ce990805SThomas Braun { true, "bound", "bound to value" },
4923765793SMasatake YAMATO };
5023765793SMasatake YAMATO
5123765793SMasatake YAMATO typedef enum {
5223765793SMasatake YAMATO R_MATCHED_TEMPLATE_APPLIED,
5323765793SMasatake YAMATO } xsltMatchedTemplateRole;
5413457258SMasatake YAMATO static roleDefinition XsltMatchedTemplateRoles [] = {
55ce990805SThomas Braun { true, "applied", "applied" },
5623765793SMasatake YAMATO };
5723765793SMasatake YAMATO
5823765793SMasatake YAMATO typedef enum {
5923765793SMasatake YAMATO R_NAMED_TEMPLATE_CALLED,
6023765793SMasatake YAMATO } xsltNamedTemplateRole;
6113457258SMasatake YAMATO static roleDefinition XsltNamedTemplateRoles [] = {
62ce990805SThomas Braun { true, "called", "called" },
6323765793SMasatake YAMATO };
6423765793SMasatake YAMATO
6523765793SMasatake YAMATO
66e112e8abSMasatake YAMATO static kindDefinition XsltKinds [] = {
67ce990805SThomas Braun { true, 's', "stylesheet", "stylesheets",
68ce990805SThomas Braun .referenceOnly = true, ATTACH_ROLES (XsltStylesheetRoles) },
69ce990805SThomas Braun { true, 'p', "parameter", "parameters",
70ce990805SThomas Braun .referenceOnly = false, ATTACH_ROLES (XsltParameterRoles) },
71ce990805SThomas Braun { true, 'm', "matchedTemplate", "matched template",
72ce990805SThomas Braun .referenceOnly = false, ATTACH_ROLES (XsltMatchedTemplateRoles) },
73*cbabd2beSMasatake YAMATO { true, 'n', "namedTemplate", "named template",
74ce990805SThomas Braun .referenceOnly = false, ATTACH_ROLES (XsltNamedTemplateRoles) },
75ce990805SThomas Braun { true, 'v', "variable", "variables" },
7623765793SMasatake YAMATO };
7723765793SMasatake YAMATO
7823765793SMasatake YAMATO static void makeTagRecursivelyWithVersionVerification (xmlNode *node,
79513a7223SMasatake YAMATO const char *xpath,
8023765793SMasatake YAMATO const tagXpathRecurSpec *spec,
8123765793SMasatake YAMATO xmlXPathContext *ctx,
8223765793SMasatake YAMATO void *userData);
8323765793SMasatake YAMATO static void makeTagRecursively (xmlNode *node,
84513a7223SMasatake YAMATO const char *xpath,
8523765793SMasatake YAMATO const tagXpathRecurSpec *spec,
8623765793SMasatake YAMATO xmlXPathContext *ctx,
8723765793SMasatake YAMATO void *userData);
8823765793SMasatake YAMATO
8923765793SMasatake YAMATO static void makeTagWithProvidingScope (xmlNode *node,
90513a7223SMasatake YAMATO const char *xpath,
9123765793SMasatake YAMATO const tagXpathMakeTagSpec *spec,
9223765793SMasatake YAMATO struct sTagEntryInfo *tag,
9323765793SMasatake YAMATO void *userData);
9423765793SMasatake YAMATO
9523765793SMasatake YAMATO enum xsltXpathTable {
9623765793SMasatake YAMATO TABLE_MAIN,
9723765793SMasatake YAMATO TABLE_STYLESHEET,
9823765793SMasatake YAMATO TABLE_VERSION_VERIFY,
9923765793SMasatake YAMATO TABLE_TEMPLATE,
10023765793SMasatake YAMATO TABLE_APPLIED_TEMPLATES,
10123765793SMasatake YAMATO TABLE_CALL_TEMPLATE,
10223765793SMasatake YAMATO TABLE_PARAM,
10323765793SMasatake YAMATO TABLE_VARIABLE,
10423765793SMasatake YAMATO TABLE_WITH_PARAM,
10523765793SMasatake YAMATO TABLE_CALL_TEMPLATE_INTERNAL,
10623765793SMasatake YAMATO };
10723765793SMasatake YAMATO
10823765793SMasatake YAMATO #define xsltXpathTemplateTableEntry(PREFIX) \
10923765793SMasatake YAMATO { PREFIX "/*[local-name()='template']", \
11023765793SMasatake YAMATO LXPATH_TABLE_DO_RECUR, \
11123765793SMasatake YAMATO { .recurSpec = { makeTagRecursively, TABLE_TEMPLATE} }}
11223765793SMasatake YAMATO
11323765793SMasatake YAMATO #define xsltXpathVariableTableEntry(PREFIX) \
11423765793SMasatake YAMATO { PREFIX "/*[local-name()='variable']", \
11523765793SMasatake YAMATO LXPATH_TABLE_DO_RECUR, \
11623765793SMasatake YAMATO { .recurSpec = { makeTagRecursively, TABLE_VARIABLE} }}
11723765793SMasatake YAMATO
11823765793SMasatake YAMATO #define xsltXpathParamTableEntry(PREFIX) \
11923765793SMasatake YAMATO { PREFIX "/*[local-name()='param']", \
12023765793SMasatake YAMATO LXPATH_TABLE_DO_RECUR, \
12123765793SMasatake YAMATO { .recurSpec = { makeTagRecursively, TABLE_PARAM} }}
12223765793SMasatake YAMATO
12323765793SMasatake YAMATO #define xsltXpathWithParamTableEntry(PREFIX) \
12423765793SMasatake YAMATO { PREFIX "/*[local-name()='with-param']", \
12523765793SMasatake YAMATO LXPATH_TABLE_DO_RECUR, \
12623765793SMasatake YAMATO { .recurSpec = { makeTagRecursively, TABLE_WITH_PARAM} }} \
12723765793SMasatake YAMATO
12823765793SMasatake YAMATO static tagXpathTable xsltXpathMainTable[] = {
12923765793SMasatake YAMATO { "(/*[local-name()='stylesheet']|/*[local-name()='transform'])",
13023765793SMasatake YAMATO LXPATH_TABLE_DO_RECUR,
13123765793SMasatake YAMATO { .recurSpec = { makeTagRecursivelyWithVersionVerification } }},
13223765793SMasatake YAMATO };
13323765793SMasatake YAMATO
13423765793SMasatake YAMATO static tagXpathTable xsltXpathStylesheetTable[] = {
13523765793SMasatake YAMATO { "./*[local-name()='import']/@href",
13623765793SMasatake YAMATO LXPATH_TABLE_DO_MAKE,
13723765793SMasatake YAMATO { .makeTagSpec = {K_STYLESHEET, R_STYLESHEET_IMPORTED} }},
13823765793SMasatake YAMATO { "./*[local-name()='include']/@href",
13923765793SMasatake YAMATO LXPATH_TABLE_DO_MAKE,
14023765793SMasatake YAMATO { .makeTagSpec = {K_STYLESHEET, R_STYLESHEET_INCLUDED} }},
14123765793SMasatake YAMATO
14223765793SMasatake YAMATO xsltXpathTemplateTableEntry ("."),
14323765793SMasatake YAMATO xsltXpathVariableTableEntry ("."),
14423765793SMasatake YAMATO xsltXpathParamTableEntry ("."),
14523765793SMasatake YAMATO };
14623765793SMasatake YAMATO
14723765793SMasatake YAMATO static tagXpathTable xsltXpathTemplateTable[] = {
14823765793SMasatake YAMATO { "./@match",
14923765793SMasatake YAMATO LXPATH_TABLE_DO_MAKE,
15024b256e3SMasatake YAMATO { .makeTagSpec = {K_MATCHED_TEMPLATE, ROLE_DEFINITION_INDEX,
15123765793SMasatake YAMATO makeTagWithProvidingScope } }},
15223765793SMasatake YAMATO { "./@name",
15323765793SMasatake YAMATO LXPATH_TABLE_DO_MAKE,
15424b256e3SMasatake YAMATO { .makeTagSpec = {K_NAMED_TEMPLATE, ROLE_DEFINITION_INDEX,
15523765793SMasatake YAMATO makeTagWithProvidingScope } }},
15623765793SMasatake YAMATO { ".",
15723765793SMasatake YAMATO LXPATH_TABLE_DO_RECUR,
15823765793SMasatake YAMATO { .recurSpec = { makeTagRecursively, TABLE_CALL_TEMPLATE_INTERNAL } }},
15923765793SMasatake YAMATO };
16023765793SMasatake YAMATO
16123765793SMasatake YAMATO static tagXpathTable xsltXpathAppliedTemplatesTable [] = {
16223765793SMasatake YAMATO { "./@select",
16323765793SMasatake YAMATO LXPATH_TABLE_DO_MAKE,
16423765793SMasatake YAMATO { .makeTagSpec = {K_MATCHED_TEMPLATE, R_MATCHED_TEMPLATE_APPLIED,
16523765793SMasatake YAMATO makeTagWithProvidingScope } }},
16623765793SMasatake YAMATO xsltXpathWithParamTableEntry("."),
16723765793SMasatake YAMATO };
16823765793SMasatake YAMATO
16923765793SMasatake YAMATO static tagXpathTable xsltXpathCallTemplateTable [] = {
17023765793SMasatake YAMATO { "./@name",
17123765793SMasatake YAMATO LXPATH_TABLE_DO_MAKE,
17223765793SMasatake YAMATO { .makeTagSpec = {K_NAMED_TEMPLATE, R_NAMED_TEMPLATE_CALLED,
17323765793SMasatake YAMATO makeTagWithProvidingScope } }},
17423765793SMasatake YAMATO xsltXpathWithParamTableEntry("."),
17523765793SMasatake YAMATO };
17623765793SMasatake YAMATO
17723765793SMasatake YAMATO static tagXpathTable xsltXpathParamTable [] = {
17823765793SMasatake YAMATO { "./@name",
17923765793SMasatake YAMATO LXPATH_TABLE_DO_MAKE,
18024b256e3SMasatake YAMATO { .makeTagSpec = {K_PARAMETER, ROLE_DEFINITION_INDEX,
18123765793SMasatake YAMATO makeTagWithProvidingScope} }},
18223765793SMasatake YAMATO xsltXpathTemplateTableEntry ("."),
18323765793SMasatake YAMATO };
18423765793SMasatake YAMATO
18523765793SMasatake YAMATO static tagXpathTable xsltXpathVariableTable [] = {
18623765793SMasatake YAMATO { "./@name",
18723765793SMasatake YAMATO LXPATH_TABLE_DO_MAKE,
18824b256e3SMasatake YAMATO { .makeTagSpec = {K_VARIABLE, ROLE_DEFINITION_INDEX,
18923765793SMasatake YAMATO makeTagWithProvidingScope} }},
19023765793SMasatake YAMATO xsltXpathTemplateTableEntry ("."),
19123765793SMasatake YAMATO };
19223765793SMasatake YAMATO
19323765793SMasatake YAMATO static tagXpathTable xsltXpathWithParamTable [] = {
19423765793SMasatake YAMATO { "./@name",
19523765793SMasatake YAMATO LXPATH_TABLE_DO_MAKE,
19623765793SMasatake YAMATO { .makeTagSpec = {K_PARAMETER, R_PARAMETER_BOUND,
19723765793SMasatake YAMATO makeTagWithProvidingScope} }},
19823765793SMasatake YAMATO xsltXpathTemplateTableEntry ("."),
19923765793SMasatake YAMATO };
20023765793SMasatake YAMATO
20123765793SMasatake YAMATO static tagXpathTable xsltXpathTemplateInternalTable [] = {
20223765793SMasatake YAMATO { "./*[local-name()='apply-templates']",
20323765793SMasatake YAMATO LXPATH_TABLE_DO_RECUR,
20423765793SMasatake YAMATO { .recurSpec = { makeTagRecursively, TABLE_APPLIED_TEMPLATES } }},
20523765793SMasatake YAMATO { "./*[local-name()='call-template']",
20623765793SMasatake YAMATO LXPATH_TABLE_DO_RECUR,
20723765793SMasatake YAMATO { .recurSpec = { makeTagRecursively, TABLE_CALL_TEMPLATE } }},
20823765793SMasatake YAMATO xsltXpathVariableTableEntry ("."),
20923765793SMasatake YAMATO xsltXpathParamTableEntry ("."),
21023765793SMasatake YAMATO { "./node()[not ("
21123765793SMasatake YAMATO "local-name()='apply-templates'"
21223765793SMasatake YAMATO " or "
21323765793SMasatake YAMATO "local-name()='call-template'"
21423765793SMasatake YAMATO " or "
21523765793SMasatake YAMATO "local-name()='variable'"
21623765793SMasatake YAMATO " or "
21723765793SMasatake YAMATO "local-name()='param'"
21823765793SMasatake YAMATO ")]",
21923765793SMasatake YAMATO LXPATH_TABLE_DO_RECUR,
22023765793SMasatake YAMATO { .recurSpec = { makeTagRecursively, TABLE_CALL_TEMPLATE_INTERNAL } }},
22123765793SMasatake YAMATO };
22223765793SMasatake YAMATO
verifyVersion(xmlNode * node,const char * xpath CTAGS_ATTR_UNUSED,const tagXpathRecurSpec * spec CTAGS_ATTR_UNUSED,xmlXPathContext * ctx CTAGS_ATTR_UNUSED,void * userData)22323765793SMasatake YAMATO static void verifyVersion (xmlNode *node,
224513a7223SMasatake YAMATO const char *xpath CTAGS_ATTR_UNUSED,
225e4d16241SMasatake YAMATO const tagXpathRecurSpec *spec CTAGS_ATTR_UNUSED,
226e4d16241SMasatake YAMATO xmlXPathContext *ctx CTAGS_ATTR_UNUSED,
22723765793SMasatake YAMATO void *userData)
22823765793SMasatake YAMATO {
229ce990805SThomas Braun bool *acceptable = userData;
23023765793SMasatake YAMATO char *version = (char *)xmlNodeGetContent (node);
23123765793SMasatake YAMATO
23223765793SMasatake YAMATO if (version)
23323765793SMasatake YAMATO {
23423765793SMasatake YAMATO if (strcmp (version, "1.0") == 0)
23523765793SMasatake YAMATO {
236759d281dSK.Takata verbose ("xslt: accept version: %s\n", version);
237ce990805SThomas Braun *acceptable = true;
23823765793SMasatake YAMATO }
23923765793SMasatake YAMATO else
240759d281dSK.Takata verbose ("xslt: unsupported version: %s\n", version);
24123765793SMasatake YAMATO
24223765793SMasatake YAMATO eFree (version);
24323765793SMasatake YAMATO }
24423765793SMasatake YAMATO else
24523765793SMasatake YAMATO verbose ("xslt: version unknown\n");
24623765793SMasatake YAMATO }
24723765793SMasatake YAMATO
24823765793SMasatake YAMATO static tagXpathTable xsltXpathVersionVerifyTable [] = {
24923765793SMasatake YAMATO { "./@version",
25023765793SMasatake YAMATO LXPATH_TABLE_DO_RECUR,
25123765793SMasatake YAMATO { .recurSpec = { verifyVersion } }},
25223765793SMasatake YAMATO };
25323765793SMasatake YAMATO
25423765793SMasatake YAMATO
25523765793SMasatake YAMATO static tagXpathTableTable xsltXpathTableTable[] = {
25623765793SMasatake YAMATO [TABLE_MAIN] = { ARRAY_AND_SIZE (xsltXpathMainTable) },
25723765793SMasatake YAMATO [TABLE_STYLESHEET] = { ARRAY_AND_SIZE (xsltXpathStylesheetTable) },
25823765793SMasatake YAMATO [TABLE_VERSION_VERIFY] = { ARRAY_AND_SIZE (xsltXpathVersionVerifyTable) },
25923765793SMasatake YAMATO [TABLE_TEMPLATE] = { ARRAY_AND_SIZE (xsltXpathTemplateTable) },
26023765793SMasatake YAMATO [TABLE_APPLIED_TEMPLATES] = { ARRAY_AND_SIZE (xsltXpathAppliedTemplatesTable) },
26123765793SMasatake YAMATO [TABLE_CALL_TEMPLATE] = { ARRAY_AND_SIZE (xsltXpathCallTemplateTable) },
26223765793SMasatake YAMATO [TABLE_PARAM] = { ARRAY_AND_SIZE (xsltXpathParamTable) },
26323765793SMasatake YAMATO [TABLE_VARIABLE] = { ARRAY_AND_SIZE (xsltXpathVariableTable) },
26423765793SMasatake YAMATO [TABLE_WITH_PARAM] = { ARRAY_AND_SIZE (xsltXpathWithParamTable) },
26523765793SMasatake YAMATO [TABLE_CALL_TEMPLATE_INTERNAL] = { ARRAY_AND_SIZE (xsltXpathTemplateInternalTable) },
26623765793SMasatake YAMATO };
26723765793SMasatake YAMATO
26823765793SMasatake YAMATO
makeTagRecursivelyWithVersionVerification(xmlNode * node,const char * xpath CTAGS_ATTR_UNUSED,const tagXpathRecurSpec * spec CTAGS_ATTR_UNUSED,xmlXPathContext * ctx,void * userData)26923765793SMasatake YAMATO static void makeTagRecursivelyWithVersionVerification (xmlNode *node,
270513a7223SMasatake YAMATO const char *xpath CTAGS_ATTR_UNUSED,
271e4d16241SMasatake YAMATO const tagXpathRecurSpec *spec CTAGS_ATTR_UNUSED,
27223765793SMasatake YAMATO xmlXPathContext *ctx,
27323765793SMasatake YAMATO void *userData)
27423765793SMasatake YAMATO {
275ce990805SThomas Braun bool acceptable = false;
27623765793SMasatake YAMATO int backup;
27723765793SMasatake YAMATO
278971e7196SMasatake YAMATO findXMLTags (ctx, node, TABLE_VERSION_VERIFY, &acceptable);
27923765793SMasatake YAMATO if (!acceptable)
28023765793SMasatake YAMATO return;
28123765793SMasatake YAMATO
28223765793SMasatake YAMATO backup = *(int *)userData;
283971e7196SMasatake YAMATO findXMLTags (ctx, node, TABLE_STYLESHEET, userData);
28423765793SMasatake YAMATO
28523765793SMasatake YAMATO *(int *)userData = backup;
28623765793SMasatake YAMATO }
28723765793SMasatake YAMATO
makeTagRecursively(xmlNode * node,const char * xpath CTAGS_ATTR_UNUSED,const tagXpathRecurSpec * spec,xmlXPathContext * ctx,void * userData)28823765793SMasatake YAMATO static void makeTagRecursively (xmlNode *node,
289513a7223SMasatake YAMATO const char *xpath CTAGS_ATTR_UNUSED,
29023765793SMasatake YAMATO const tagXpathRecurSpec *spec,
29123765793SMasatake YAMATO xmlXPathContext *ctx,
29223765793SMasatake YAMATO void *userData)
29323765793SMasatake YAMATO {
29423765793SMasatake YAMATO int backup = *(int *)userData;
29523765793SMasatake YAMATO
296971e7196SMasatake YAMATO findXMLTags (ctx, node, spec->nextTable, userData);
29723765793SMasatake YAMATO
29823765793SMasatake YAMATO *(int *)userData = backup;
29923765793SMasatake YAMATO }
30023765793SMasatake YAMATO
makeTagWithProvidingScope(xmlNode * node CTAGS_ATTR_UNUSED,const char * xpath CTAGS_ATTR_UNUSED,const tagXpathMakeTagSpec * spec CTAGS_ATTR_UNUSED,struct sTagEntryInfo * tag,void * userData)301e4d16241SMasatake YAMATO static void makeTagWithProvidingScope (xmlNode *node CTAGS_ATTR_UNUSED,
302513a7223SMasatake YAMATO const char *xpath CTAGS_ATTR_UNUSED,
303e4d16241SMasatake YAMATO const tagXpathMakeTagSpec *spec CTAGS_ATTR_UNUSED,
30423765793SMasatake YAMATO struct sTagEntryInfo *tag,
30523765793SMasatake YAMATO void *userData)
30623765793SMasatake YAMATO {
30723765793SMasatake YAMATO int *index = (int *)userData;
30823765793SMasatake YAMATO
30923765793SMasatake YAMATO tag->extensionFields.scopeIndex = *index;
31023765793SMasatake YAMATO *index = makeTagEntry (tag);
31123765793SMasatake YAMATO }
31223765793SMasatake YAMATO
31323765793SMasatake YAMATO static void
findXsltTags(void)31423765793SMasatake YAMATO findXsltTags (void)
31523765793SMasatake YAMATO {
316f681f9a9SMasatake YAMATO scheduleRunningBaseparser (RUN_DEFAULT_SUBPARSERS);
31723765793SMasatake YAMATO }
31823765793SMasatake YAMATO
319f681f9a9SMasatake YAMATO static void
runXPathEngine(xmlSubparser * s,xmlXPathContext * ctx,xmlNode * root)320f681f9a9SMasatake YAMATO runXPathEngine(xmlSubparser *s,
321f681f9a9SMasatake YAMATO xmlXPathContext *ctx, xmlNode *root)
322f681f9a9SMasatake YAMATO {
323f681f9a9SMasatake YAMATO int corkIndex = CORK_NIL;
324f681f9a9SMasatake YAMATO
325f681f9a9SMasatake YAMATO findXMLTags (ctx, root, TABLE_MAIN, &corkIndex);
326f681f9a9SMasatake YAMATO }
327f681f9a9SMasatake YAMATO
328f681f9a9SMasatake YAMATO static xmlSubparser xsltSubparser = {
329f681f9a9SMasatake YAMATO .subparser = {
330f681f9a9SMasatake YAMATO .direction = SUBPARSER_BI_DIRECTION,
331f681f9a9SMasatake YAMATO },
332f681f9a9SMasatake YAMATO .runXPathEngine = runXPathEngine,
333f681f9a9SMasatake YAMATO };
334f681f9a9SMasatake YAMATO
33523765793SMasatake YAMATO extern parserDefinition*
XsltParser(void)33623765793SMasatake YAMATO XsltParser (void)
33723765793SMasatake YAMATO {
33823765793SMasatake YAMATO static const char *const extensions [] = { "xsl", "xslt", NULL };
33923765793SMasatake YAMATO parserDefinition* const def = parserNew ("XSLT");
340f681f9a9SMasatake YAMATO static parserDependency dependencies [] = {
341f681f9a9SMasatake YAMATO [0] = { DEPTYPE_SUBPARSER, "XML", &xsltSubparser },
342f681f9a9SMasatake YAMATO };
34323765793SMasatake YAMATO
34409ae690fSMasatake YAMATO def->kindTable = XsltKinds;
34523765793SMasatake YAMATO def->kindCount = ARRAY_SIZE (XsltKinds);
34623765793SMasatake YAMATO def->extensions = extensions;
34723765793SMasatake YAMATO def->parser = findXsltTags;
34823765793SMasatake YAMATO def->tagXpathTableTable = xsltXpathTableTable;
34923765793SMasatake YAMATO def->tagXpathTableCount = ARRAY_SIZE (xsltXpathTableTable);
3506b1a862eSMasatake YAMATO def->useCork = CORK_QUEUE;
351f681f9a9SMasatake YAMATO def->dependencies = dependencies;
352f681f9a9SMasatake YAMATO def->dependencyCount = ARRAY_SIZE (dependencies);
353f681f9a9SMasatake YAMATO
35423765793SMasatake YAMATO return def;
35523765793SMasatake YAMATO }
356