xref: /Universal-ctags/parsers/autoconf.c (revision 6b1a862e526d5017f9f212a321f59d67c859d521)
13261ddc7SMasatake YAMATO /*
23261ddc7SMasatake YAMATO  *   Copyright (c) 2011, Colomban Wendling <colomban@geany.org>
33261ddc7SMasatake YAMATO  *
43261ddc7SMasatake YAMATO  *   This source code is released for free distribution under the terms of the
53261ddc7SMasatake YAMATO  *   GNU General Public License version 2 or (at your option) any later version.
63261ddc7SMasatake YAMATO  *
73261ddc7SMasatake YAMATO  *   This module contains functions for generating tags for Autoconf files.
83261ddc7SMasatake YAMATO  */
93261ddc7SMasatake YAMATO 
103261ddc7SMasatake YAMATO #include "general.h"	/* must always come first */
113261ddc7SMasatake YAMATO 
123261ddc7SMasatake YAMATO #include <string.h>
133261ddc7SMasatake YAMATO 
14b43a04c9SMasatake YAMATO #include "autoconf.h"
1587214e15SMasatake YAMATO #include "m4.h"
163261ddc7SMasatake YAMATO 
173261ddc7SMasatake YAMATO #include "debug.h"
183261ddc7SMasatake YAMATO #include "entry.h"
193261ddc7SMasatake YAMATO #include "read.h"
203261ddc7SMasatake YAMATO #include "keyword.h"
213261ddc7SMasatake YAMATO #include "kind.h"
223261ddc7SMasatake YAMATO #include "parse.h"
233261ddc7SMasatake YAMATO 
24b43a04c9SMasatake YAMATO 
25b43a04c9SMasatake YAMATO static roleDefinition AutoconfOptwithRoles [] = {
26b43a04c9SMasatake YAMATO 	{ true, "cmdline", "specified in a configure command line" },
27b43a04c9SMasatake YAMATO };
28b43a04c9SMasatake YAMATO 
29b43a04c9SMasatake YAMATO static roleDefinition AutoconfOptenableRoles [] = {
30b43a04c9SMasatake YAMATO 	{ true, "cmdline", "specified in a configure command line" },
313261ddc7SMasatake YAMATO };
323261ddc7SMasatake YAMATO 
33e112e8abSMasatake YAMATO static kindDefinition AutoconfKinds[] = {
34ce990805SThomas Braun 	{ true, 'p', "package", "packages" },
35ce990805SThomas Braun 	{ true, 't', "template", "templates" },
36ce990805SThomas Braun 	{ true, 'm', "macro", "autoconf macros" },
37b43a04c9SMasatake YAMATO 	{ true, 'w', "optwith", "options specified with --with-...",
38b43a04c9SMasatake YAMATO 	  .referenceOnly = false, ATTACH_ROLES(AutoconfOptwithRoles)},
39b43a04c9SMasatake YAMATO 	{ true, 'e', "optenable", "options specified with --enable-...",
40b43a04c9SMasatake YAMATO 	  .referenceOnly = false, ATTACH_ROLES(AutoconfOptenableRoles)},
41ce990805SThomas Braun 	{ true, 's', "subst", "substitution keys"},
42ce990805SThomas Braun 	{ true, 'c', "condition", "automake conditions" },
43ce990805SThomas Braun 	{ true, 'd', "definition", "definitions" },
443261ddc7SMasatake YAMATO };
453261ddc7SMasatake YAMATO 
463261ddc7SMasatake YAMATO typedef enum {
473261ddc7SMasatake YAMATO 	KEYWORD_init,
483261ddc7SMasatake YAMATO 	KEYWORD_template,
493261ddc7SMasatake YAMATO 	KEYWORD_defun,
503261ddc7SMasatake YAMATO 	KEYWORD_argwith,
513261ddc7SMasatake YAMATO 	KEYWORD_argenable,
523261ddc7SMasatake YAMATO 	KEYWORD_subst,
533261ddc7SMasatake YAMATO 	KEYWORD_conditional,
543261ddc7SMasatake YAMATO 	KEYWORD_define,
553261ddc7SMasatake YAMATO } autoconfKeywordId;
563261ddc7SMasatake YAMATO 
573261ddc7SMasatake YAMATO static const keywordTable autoconfKeywordTable[] = {
583261ddc7SMasatake YAMATO 	{ "AC_INIT",            KEYWORD_init, },
593261ddc7SMasatake YAMATO 	{ "AH_TEMPLATE",        KEYWORD_template, },
603261ddc7SMasatake YAMATO 	{ "AC_DEFUN",           KEYWORD_defun, },
613261ddc7SMasatake YAMATO 	{ "AC_DEFUN_ONCE",      KEYWORD_defun, },
623261ddc7SMasatake YAMATO 	{ "AC_ARG_WITH",        KEYWORD_argwith, },
633261ddc7SMasatake YAMATO 	{ "AC_ARG_ENABLE",      KEYWORD_argenable, },
643261ddc7SMasatake YAMATO 	{ "AC_SUBST",           KEYWORD_subst, },
653261ddc7SMasatake YAMATO 	{ "AM_CONDITIONAL",     KEYWORD_conditional, },
663261ddc7SMasatake YAMATO 	{ "AC_DEFINE",          KEYWORD_define, },
673261ddc7SMasatake YAMATO 	{ "AC_DEFINE_UNQUOTED", KEYWORD_define, },
683261ddc7SMasatake YAMATO };
693261ddc7SMasatake YAMATO 
doesLineCommentStart(m4Subparser * m4 CTAGS_ATTR_UNUSED,int c,const char * token CTAGS_ATTR_UNUSED)70e4d16241SMasatake YAMATO static bool doesLineCommentStart (m4Subparser *m4 CTAGS_ATTR_UNUSED, int c, const char* token CTAGS_ATTR_UNUSED)
713261ddc7SMasatake YAMATO {
723261ddc7SMasatake YAMATO 	return (c == '#');
733261ddc7SMasatake YAMATO }
743261ddc7SMasatake YAMATO 
doesStringLiteralStart(m4Subparser * m4 CTAGS_ATTR_UNUSED,int c CTAGS_ATTR_UNUSED)75e4d16241SMasatake YAMATO static bool doesStringLiteralStart (m4Subparser *m4 CTAGS_ATTR_UNUSED, int c CTAGS_ATTR_UNUSED)
763261ddc7SMasatake YAMATO {
77aba1da58SMasatake YAMATO 	// return (c == '"') || (c == '\'') || (c == '`');
78aba1da58SMasatake YAMATO 	return false;
793261ddc7SMasatake YAMATO }
803261ddc7SMasatake YAMATO 
probeLanguage(m4Subparser * m4 CTAGS_ATTR_UNUSED,const char * token)81e4d16241SMasatake YAMATO static bool probeLanguage (m4Subparser *m4 CTAGS_ATTR_UNUSED, const char* token)
823261ddc7SMasatake YAMATO {
833261ddc7SMasatake YAMATO 	return strncmp (token, "m4_", 3) == 0
843261ddc7SMasatake YAMATO 		|| strncmp (token, "AC_", 3) == 0
853261ddc7SMasatake YAMATO 		|| strncmp (token, "AM_", 3) == 0
863261ddc7SMasatake YAMATO 		|| strncmp (token, "AS_", 3) == 0
873261ddc7SMasatake YAMATO 		|| strncmp (token, "AH_", 3) == 0
883261ddc7SMasatake YAMATO 		;
893261ddc7SMasatake YAMATO }
903261ddc7SMasatake YAMATO 
makeAutoconfTag(int kind)913758eeebSMasatake YAMATO static int makeAutoconfTag (int kind)
923261ddc7SMasatake YAMATO {
933261ddc7SMasatake YAMATO 	int index = CORK_NIL;
9443fa8be3SMasatake YAMATO 	vString * name;
953261ddc7SMasatake YAMATO 
9643fa8be3SMasatake YAMATO 	name = vStringNew();
973261ddc7SMasatake YAMATO 	readM4MacroArgument(name);
983261ddc7SMasatake YAMATO 	if (vStringLength (name) > 0)
993261ddc7SMasatake YAMATO 	{
1003261ddc7SMasatake YAMATO 		tagEntryInfo e;
10116a2541cSMasatake YAMATO 		initTagEntry (&e, vStringValue(name), kind);
1023261ddc7SMasatake YAMATO 		index = makeTagEntry(&e);
1033261ddc7SMasatake YAMATO 	}
1043261ddc7SMasatake YAMATO 	vStringDelete (name);
1053261ddc7SMasatake YAMATO 
1063261ddc7SMasatake YAMATO 	return index;
1073261ddc7SMasatake YAMATO }
1083261ddc7SMasatake YAMATO 
newMacroCallback(m4Subparser * m4 CTAGS_ATTR_UNUSED,const char * token)109e4d16241SMasatake YAMATO static int newMacroCallback (m4Subparser *m4 CTAGS_ATTR_UNUSED, const char* token)
1103261ddc7SMasatake YAMATO {
1113261ddc7SMasatake YAMATO 	int keyword;
1123758eeebSMasatake YAMATO 	int index = CORK_NIL;
1133261ddc7SMasatake YAMATO 
1143758eeebSMasatake YAMATO 	keyword = lookupKeyword (token, getInputLanguage ());
1153261ddc7SMasatake YAMATO 
1163261ddc7SMasatake YAMATO 	/* TODO:
1173261ddc7SMasatake YAMATO 	   AH_VERBATIM
1183261ddc7SMasatake YAMATO 	 */
1193261ddc7SMasatake YAMATO 	switch (keyword)
1203261ddc7SMasatake YAMATO 	{
1213261ddc7SMasatake YAMATO 	case KEYWORD_NONE:
1223261ddc7SMasatake YAMATO 		break;
1233261ddc7SMasatake YAMATO 	case KEYWORD_init:
124b43a04c9SMasatake YAMATO 		index = makeAutoconfTag (AUTOCONF_PACKAGE_KIND);
1253261ddc7SMasatake YAMATO 		break;
1263261ddc7SMasatake YAMATO 	case KEYWORD_template:
127b43a04c9SMasatake YAMATO 		index = makeAutoconfTag (AUTOCONF_TEMPLATE_KIND);
1283261ddc7SMasatake YAMATO 		break;
1293261ddc7SMasatake YAMATO 	case KEYWORD_defun:
130b43a04c9SMasatake YAMATO 		index = makeAutoconfTag (AUTOCONF_MACRO_KIND);
1313261ddc7SMasatake YAMATO 		break;
1323261ddc7SMasatake YAMATO 	case KEYWORD_argwith:
133b43a04c9SMasatake YAMATO 		index = makeAutoconfTag (AUTOCONF_OPTWITH_KIND);
1343261ddc7SMasatake YAMATO 		break;
1353261ddc7SMasatake YAMATO 	case KEYWORD_argenable:
136b43a04c9SMasatake YAMATO 		index = makeAutoconfTag (AUTOCONF_OPTENABLE_KIND);
1373261ddc7SMasatake YAMATO 		break;
1383261ddc7SMasatake YAMATO 	case KEYWORD_subst:
139b43a04c9SMasatake YAMATO 		index = makeAutoconfTag (AUTOCONF_SUBST_KIND);
1403261ddc7SMasatake YAMATO 		break;
1413261ddc7SMasatake YAMATO 	case KEYWORD_conditional:
142b43a04c9SMasatake YAMATO 		index = makeAutoconfTag (AUTOCONF_CONDITION_KIND);
1433261ddc7SMasatake YAMATO 		break;
1443261ddc7SMasatake YAMATO 	case KEYWORD_define:
145b43a04c9SMasatake YAMATO 		index = makeAutoconfTag (AUTOCONF_DEFINITION_KIND);
1463261ddc7SMasatake YAMATO 		break;
1473261ddc7SMasatake YAMATO 	default:
1483261ddc7SMasatake YAMATO 		AssertNotReached ();
1493261ddc7SMasatake YAMATO 	}
1503758eeebSMasatake YAMATO 	return index;
1513261ddc7SMasatake YAMATO }
1523261ddc7SMasatake YAMATO 
exclusiveSubparserChosenCallback(subparser * s CTAGS_ATTR_UNUSED,void * data CTAGS_ATTR_UNUSED)153e4d16241SMasatake YAMATO static void exclusiveSubparserChosenCallback (subparser *s CTAGS_ATTR_UNUSED, void *data CTAGS_ATTR_UNUSED)
1543261ddc7SMasatake YAMATO {
1553758eeebSMasatake YAMATO 	setM4Quotes ('[', ']');
1563261ddc7SMasatake YAMATO }
1573261ddc7SMasatake YAMATO 
findAutoconfTags(void)1583261ddc7SMasatake YAMATO static void findAutoconfTags(void)
1593261ddc7SMasatake YAMATO {
1603758eeebSMasatake YAMATO 	scheduleRunningBaseparser (0);
1613261ddc7SMasatake YAMATO }
1623261ddc7SMasatake YAMATO 
AutoconfParser(void)1633261ddc7SMasatake YAMATO extern parserDefinition* AutoconfParser (void)
1643261ddc7SMasatake YAMATO {
1653261ddc7SMasatake YAMATO 	static const char *const patterns [] = { "configure.in", NULL };
1663261ddc7SMasatake YAMATO 	static const char *const extensions [] = { "ac", NULL };
1673261ddc7SMasatake YAMATO 	parserDefinition* const def = parserNew("Autoconf");
1683261ddc7SMasatake YAMATO 
1693758eeebSMasatake YAMATO 	static m4Subparser autoconfSubparser = {
1703758eeebSMasatake YAMATO 		.subparser = {
1713758eeebSMasatake YAMATO 			.direction = SUBPARSER_BI_DIRECTION,
1723758eeebSMasatake YAMATO 			.exclusiveSubparserChosenNotify = exclusiveSubparserChosenCallback,
1733758eeebSMasatake YAMATO 		},
1743758eeebSMasatake YAMATO 		.probeLanguage  = probeLanguage,
1753758eeebSMasatake YAMATO 		.newMacroNotify = newMacroCallback,
1763758eeebSMasatake YAMATO 		.doesLineCommentStart = doesLineCommentStart,
1773758eeebSMasatake YAMATO 		.doesStringLiteralStart = doesStringLiteralStart,
1783758eeebSMasatake YAMATO 	};
1793261ddc7SMasatake YAMATO 	static parserDependency dependencies [] = {
1803758eeebSMasatake YAMATO 		[0] = { DEPTYPE_SUBPARSER, "M4", &autoconfSubparser },
1813261ddc7SMasatake YAMATO 	};
1823261ddc7SMasatake YAMATO 
1833261ddc7SMasatake YAMATO 	def->dependencies = dependencies;
1843261ddc7SMasatake YAMATO 	def->dependencyCount = ARRAY_SIZE (dependencies);
1853261ddc7SMasatake YAMATO 
18609ae690fSMasatake YAMATO 	def->kindTable = AutoconfKinds;
1873261ddc7SMasatake YAMATO 	def->kindCount = ARRAY_SIZE(AutoconfKinds);
1883261ddc7SMasatake YAMATO 	def->patterns = patterns;
1893261ddc7SMasatake YAMATO 	def->extensions = extensions;
1903261ddc7SMasatake YAMATO 	def->parser = findAutoconfTags;
191*6b1a862eSMasatake YAMATO 	def->useCork = CORK_QUEUE;
1923261ddc7SMasatake YAMATO 
1933261ddc7SMasatake YAMATO 	def->keywordTable = autoconfKeywordTable;
1943261ddc7SMasatake YAMATO 	def->keywordCount = ARRAY_SIZE (autoconfKeywordTable);
1953261ddc7SMasatake YAMATO 
1963261ddc7SMasatake YAMATO 	return def;
1973261ddc7SMasatake YAMATO }
198