xref: /Universal-ctags/main/lxpath.h (revision f511f9eb802ccb3d90d678f7626b115790dd22fc)
10061bd0aSMasatake YAMATO /*
20061bd0aSMasatake YAMATO *   Copyright (c) 2016, Masatake YAMATO
30061bd0aSMasatake YAMATO *   Copyright (c) 2016, Red Hat, Inc.
40061bd0aSMasatake YAMATO *
50061bd0aSMasatake YAMATO *   This source code is released for free distribution under the terms of the
60061bd0aSMasatake YAMATO *   GNU General Public License version 2 or (at your option) any later version.
70061bd0aSMasatake YAMATO *
80061bd0aSMasatake YAMATO *   Xpath based parer API
90061bd0aSMasatake YAMATO */
100061bd0aSMasatake YAMATO #ifndef CTAGS_LXPATH_PARSE_H
110061bd0aSMasatake YAMATO #define CTAGS_LXPATH_PARSE_H
120061bd0aSMasatake YAMATO 
13ec40f18bSMasatake YAMATO /*
14ec40f18bSMasatake YAMATO *   INCLUDE FILES
15ec40f18bSMasatake YAMATO */
16ec40f18bSMasatake YAMATO 
170061bd0aSMasatake YAMATO #include "general.h"  /* must always come first */
180061bd0aSMasatake YAMATO #include "types.h"
190061bd0aSMasatake YAMATO 
200061bd0aSMasatake YAMATO #ifdef HAVE_LIBXML
210061bd0aSMasatake YAMATO #include <libxml/xpath.h>
220061bd0aSMasatake YAMATO #include <libxml/tree.h>
230061bd0aSMasatake YAMATO #else
240061bd0aSMasatake YAMATO #define xmlNode void
250061bd0aSMasatake YAMATO #define xmlXPathCompExpr void
260061bd0aSMasatake YAMATO #define xmlXPathContext void
270061bd0aSMasatake YAMATO #endif
280061bd0aSMasatake YAMATO 
29ec40f18bSMasatake YAMATO 
30ec40f18bSMasatake YAMATO /*
31ec40f18bSMasatake YAMATO *   DATA DECLARATIONS
32ec40f18bSMasatake YAMATO */
33ec40f18bSMasatake YAMATO 
340061bd0aSMasatake YAMATO typedef struct sTagXpathMakeTagSpec {
3527542d8bSMasatake YAMATO 	/* Kind used in making a tag.
3627542d8bSMasatake YAMATO 	   If kind is KIND_GHOST_INDEX, a function
3727542d8bSMasatake YAMATO 	   specified with decideKind is called to decide
3827542d8bSMasatake YAMATO 	   the kind for the tag. */
390061bd0aSMasatake YAMATO 	int   kind;
400061bd0aSMasatake YAMATO 	int   role;
410061bd0aSMasatake YAMATO 	/* If make is NULL, just makeTagEntry is used instead. */
420061bd0aSMasatake YAMATO 	void (*make) (xmlNode *node,
43513a7223SMasatake YAMATO 		      const char *xpath,
440061bd0aSMasatake YAMATO 		      const struct sTagXpathMakeTagSpec *spec,
450061bd0aSMasatake YAMATO 		      tagEntryInfo *tag,
460061bd0aSMasatake YAMATO 		      void *userData);
4727542d8bSMasatake YAMATO 	int (*decideKind) (xmlNode *node,
48513a7223SMasatake YAMATO 		      const char *xpath,
4927542d8bSMasatake YAMATO 		      const struct sTagXpathMakeTagSpec *spec,
5027542d8bSMasatake YAMATO 		      void *userData);
5127542d8bSMasatake YAMATO 	/* TODO: decideRole */
520061bd0aSMasatake YAMATO } tagXpathMakeTagSpec;
530061bd0aSMasatake YAMATO 
540061bd0aSMasatake YAMATO typedef struct sTagXpathRecurSpec {
550061bd0aSMasatake YAMATO 	void (*enter) (xmlNode *node,
56513a7223SMasatake YAMATO 		       const char *xpath,
570061bd0aSMasatake YAMATO 		       const struct sTagXpathRecurSpec *spec,
580061bd0aSMasatake YAMATO 		       xmlXPathContext *ctx,
590061bd0aSMasatake YAMATO 		       void *userData);
600061bd0aSMasatake YAMATO 
610061bd0aSMasatake YAMATO 	int  nextTable;		/* A parser can use this field any purpose.
620061bd0aSMasatake YAMATO 				   main/lxpath part doesn't touch this. */
630061bd0aSMasatake YAMATO 
640061bd0aSMasatake YAMATO } tagXpathRecurSpec;
650061bd0aSMasatake YAMATO 
660061bd0aSMasatake YAMATO typedef struct sTagXpathTable
670061bd0aSMasatake YAMATO {
680061bd0aSMasatake YAMATO 	const char *const xpath;
690061bd0aSMasatake YAMATO 	enum  { LXPATH_TABLE_DO_MAKE, LXPATH_TABLE_DO_RECUR } specType;
700061bd0aSMasatake YAMATO 	union {
710061bd0aSMasatake YAMATO 		tagXpathMakeTagSpec makeTagSpec;
720061bd0aSMasatake YAMATO 		tagXpathRecurSpec   recurSpec;
730061bd0aSMasatake YAMATO 	} spec;
740061bd0aSMasatake YAMATO 	xmlXPathCompExpr* xpathCompiled;
750061bd0aSMasatake YAMATO } tagXpathTable;
760061bd0aSMasatake YAMATO 
770061bd0aSMasatake YAMATO typedef struct sTagXpathTableTable {
780061bd0aSMasatake YAMATO 	tagXpathTable *table;
790061bd0aSMasatake YAMATO 	unsigned int   count;
800061bd0aSMasatake YAMATO } tagXpathTableTable;
810061bd0aSMasatake YAMATO 
82d5e6de9cSMasatake YAMATO typedef struct sXpathFileSpec {
837fcb59fbSMasatake YAMATO 	/*
847fcb59fbSMasatake YAMATO 	   NULL represents the associated field in DTD is not examined.
857fcb59fbSMasatake YAMATO 	   "" (an empty string) represents the associated field in DTD
867fcb59fbSMasatake YAMATO 	   (and root element) must not exist. */
87d5e6de9cSMasatake YAMATO 	const char *rootElementName;
88d5e6de9cSMasatake YAMATO 	const char *nameInDTD;
89d5e6de9cSMasatake YAMATO 	const char *externalID;
90d5e6de9cSMasatake YAMATO 	const char *systemID;
91d5e6de9cSMasatake YAMATO 	const char *rootNSPrefix;
92d5e6de9cSMasatake YAMATO 	const char *rootNSHref;
93d5e6de9cSMasatake YAMATO } xpathFileSpec;
94d5e6de9cSMasatake YAMATO 
95ec40f18bSMasatake YAMATO 
96ec40f18bSMasatake YAMATO /*
97ec40f18bSMasatake YAMATO *   FUNCTION PROTOTYPES
98ec40f18bSMasatake YAMATO */
99ec40f18bSMasatake YAMATO 
1000061bd0aSMasatake YAMATO /* Xpath interface */
101*f511f9ebSMasatake YAMATO extern void findXMLTagsFull (xmlXPathContext *ctx, xmlNode *root,
102*f511f9ebSMasatake YAMATO 			 int tableTableIndex,
103*f511f9ebSMasatake YAMATO 			 void (* runAfter) (xmlXPathContext *, xmlNode *, void *),
104*f511f9ebSMasatake YAMATO 			 void *userData);
105*f511f9ebSMasatake YAMATO 
1060061bd0aSMasatake YAMATO extern void findXMLTags (xmlXPathContext *ctx, xmlNode *root,
1070fde73e0SMasatake YAMATO 			 int tableTableIndex,
108971e7196SMasatake YAMATO 			 void *userData);
1090061bd0aSMasatake YAMATO 
1100061bd0aSMasatake YAMATO #endif  /* CTAGS_LXPATH_PARSE_H */
111