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