xref: /Universal-ctags/parsers/glade.c (revision 20c8252b10749d3e8e3ff6662378276290650ced)
12746c479SMasatake YAMATO /*
22746c479SMasatake YAMATO *
32746c479SMasatake YAMATO *   Copyright (c) 2015, Masatake YAMATO
42746c479SMasatake YAMATO *   Copyright (c) 2015, Red Hat, K.K.
52746c479SMasatake YAMATO *
62746c479SMasatake YAMATO *   This source code is released for free distribution under the terms of the
72746c479SMasatake YAMATO *   GNU General Public License version 2 or (at your option) any later version.
82746c479SMasatake YAMATO *
92746c479SMasatake YAMATO *   This module contains functions for generating tags for diff files (based on Sh parser).
102746c479SMasatake YAMATO */
112746c479SMasatake YAMATO 
122746c479SMasatake YAMATO #include "general.h"	/* must always come first */
1314781660SMasatake YAMATO #include "entry.h"
142746c479SMasatake YAMATO #include "debug.h"
152746c479SMasatake YAMATO #include "parse.h"
162746c479SMasatake YAMATO #include "read.h"
172746c479SMasatake YAMATO #include "routines.h"
18*20c8252bSMasatake YAMATO #include "xml.h"
192746c479SMasatake YAMATO 
202746c479SMasatake YAMATO 
212746c479SMasatake YAMATO typedef enum {
222746c479SMasatake YAMATO 	R_CLASS_WIDGET,
232746c479SMasatake YAMATO } gladeClassRole;
242746c479SMasatake YAMATO 
252746c479SMasatake YAMATO typedef enum {
262746c479SMasatake YAMATO 	R_HANDLER_HANDLER,
272746c479SMasatake YAMATO } gladeHandleRoler;
282746c479SMasatake YAMATO 
2913457258SMasatake YAMATO static roleDefinition GladeClassRoles [] = {
30759d281dSK.Takata 	{ true, "widget", "specified as a widget constructor" },
312746c479SMasatake YAMATO };
322746c479SMasatake YAMATO 
3313457258SMasatake YAMATO static roleDefinition GladeHandlerRoles [] = {
34759d281dSK.Takata 	{ true, "handler", "specified as a callback for signal emission" },
352746c479SMasatake YAMATO };
362746c479SMasatake YAMATO 
372746c479SMasatake YAMATO typedef enum {
38*20c8252bSMasatake YAMATO 	K_CLASS, K_HANDLER,
392746c479SMasatake YAMATO } gladeKind;
402746c479SMasatake YAMATO 
41e112e8abSMasatake YAMATO static kindDefinition GladeKinds [] = {
422746c479SMasatake YAMATO 	/* These two are appeared on names in C source code. */
43ce990805SThomas Braun 	{ true,  'c', "class",	  "classes",
44ce990805SThomas Braun 	  .referenceOnly = true, ATTACH_ROLES (GladeClassRoles) },
45ce990805SThomas Braun 	{ true,  'h', "handler",  "handlers",
46ce990805SThomas Braun 	  .referenceOnly = true, ATTACH_ROLES (GladeHandlerRoles) },
472746c479SMasatake YAMATO };
482746c479SMasatake YAMATO 
492746c479SMasatake YAMATO static tagXpathTable gladeXpathMainTable[] = {
502746c479SMasatake YAMATO 	{ "///glade-interface//widget//@class",
512746c479SMasatake YAMATO 	  LXPATH_TABLE_DO_MAKE,
52a9bb575fSMasatake YAMATO 	  { .makeTagSpec = { K_CLASS, R_CLASS_WIDGET } }
532746c479SMasatake YAMATO 	},
542746c479SMasatake YAMATO 	{ "///glade-interface//signal//@handler",
552746c479SMasatake YAMATO 	  LXPATH_TABLE_DO_MAKE,
56a9bb575fSMasatake YAMATO 	  { .makeTagSpec = { K_HANDLER, R_HANDLER_HANDLER }}
572746c479SMasatake YAMATO 	},
582746c479SMasatake YAMATO };
592746c479SMasatake YAMATO 
602746c479SMasatake YAMATO enum gladeXpathTable {
612746c479SMasatake YAMATO 	TABLE_MAIN
622746c479SMasatake YAMATO };
632746c479SMasatake YAMATO 
642746c479SMasatake YAMATO static tagXpathTableTable gladeXpathTableTable[] = {
652746c479SMasatake YAMATO 	[TABLE_MAIN] = { ARRAY_AND_SIZE(gladeXpathMainTable) },
662746c479SMasatake YAMATO };
672746c479SMasatake YAMATO 
682746c479SMasatake YAMATO static void
findGladeTags(void)692746c479SMasatake YAMATO findGladeTags (void)
702746c479SMasatake YAMATO {
71*20c8252bSMasatake YAMATO 	scheduleRunningBaseparser (RUN_DEFAULT_SUBPARSERS);
722746c479SMasatake YAMATO }
732746c479SMasatake YAMATO 
74*20c8252bSMasatake YAMATO 
75*20c8252bSMasatake YAMATO static void
runXPathEngine(xmlSubparser * s,xmlXPathContext * ctx,xmlNode * root)76*20c8252bSMasatake YAMATO runXPathEngine(xmlSubparser *s,
77*20c8252bSMasatake YAMATO 			   xmlXPathContext *ctx, xmlNode *root)
78*20c8252bSMasatake YAMATO {
79*20c8252bSMasatake YAMATO 	findXMLTags (ctx, root, TABLE_MAIN, NULL);
80*20c8252bSMasatake YAMATO }
81*20c8252bSMasatake YAMATO 
82*20c8252bSMasatake YAMATO static xmlSubparser gladeSubparser = {
83*20c8252bSMasatake YAMATO 	.subparser = {
84*20c8252bSMasatake YAMATO 		.direction = SUBPARSER_BI_DIRECTION,
85*20c8252bSMasatake YAMATO 	},
86*20c8252bSMasatake YAMATO 	.runXPathEngine = runXPathEngine,
87*20c8252bSMasatake YAMATO };
88*20c8252bSMasatake YAMATO 
892746c479SMasatake YAMATO extern parserDefinition*
GladeParser(void)902746c479SMasatake YAMATO GladeParser (void)
912746c479SMasatake YAMATO {
922746c479SMasatake YAMATO 	static const char *const extensions [] = { "glade", NULL };
932746c479SMasatake YAMATO 	parserDefinition* const def = parserNew ("Glade");
94*20c8252bSMasatake YAMATO 	static parserDependency dependencies [] = {
95*20c8252bSMasatake YAMATO 		[0] = { DEPTYPE_SUBPARSER, "XML", &gladeSubparser },
96*20c8252bSMasatake YAMATO 	};
972746c479SMasatake YAMATO 
9809ae690fSMasatake YAMATO 	def->kindTable         = GladeKinds;
992746c479SMasatake YAMATO 	def->kindCount     = ARRAY_SIZE (GladeKinds);
1002746c479SMasatake YAMATO 	def->extensions    = extensions;
1012746c479SMasatake YAMATO 	def->parser        = findGladeTags;
1022746c479SMasatake YAMATO 	def->tagXpathTableTable  = gladeXpathTableTable;
1032746c479SMasatake YAMATO 	def->tagXpathTableCount  = ARRAY_SIZE (gladeXpathTableTable);
104*20c8252bSMasatake YAMATO 	def->dependencies = dependencies;
105*20c8252bSMasatake YAMATO 	def->dependencyCount = ARRAY_SIZE (dependencies);
1062746c479SMasatake YAMATO 	return def;
1072746c479SMasatake YAMATO }
108