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