13ae02089SMasatake YAMATO /*
23ae02089SMasatake YAMATO * Copyright (c) 2000-2002, Darren Hiebert
33ae02089SMasatake YAMATO *
43ae02089SMasatake YAMATO * This source code is released for free distribution under the terms of the
50ce38835Sviccuad * GNU General Public License version 2 or (at your option) any later version.
63ae02089SMasatake YAMATO *
73ae02089SMasatake YAMATO * This module contains functions for generating tags for LISP files.
83ae02089SMasatake YAMATO */
93ae02089SMasatake YAMATO
103ae02089SMasatake YAMATO /*
113ae02089SMasatake YAMATO * INCLUDE FILES
123ae02089SMasatake YAMATO */
133ae02089SMasatake YAMATO #include "general.h" /* must always come first */
143ae02089SMasatake YAMATO
153ae02089SMasatake YAMATO #include "parse.h"
163ae02089SMasatake YAMATO #include "read.h"
173db72c21SMasatake YAMATO #include "routines.h"
18*f5bca49fSMasatake YAMATO #include "selectors.h"
193ae02089SMasatake YAMATO #include "vstring.h"
203ae02089SMasatake YAMATO
2149002b85SMasatake YAMATO #include <string.h>
2249002b85SMasatake YAMATO
233ae02089SMasatake YAMATO /*
243ae02089SMasatake YAMATO * DATA DEFINITIONS
253ae02089SMasatake YAMATO */
263ae02089SMasatake YAMATO typedef enum {
2749002b85SMasatake YAMATO K_UNKNOWN,
2849002b85SMasatake YAMATO K_FUNCTION,
2949002b85SMasatake YAMATO K_VARIABLE,
3049002b85SMasatake YAMATO K_MACRO,
3149002b85SMasatake YAMATO K_CONST,
323ae02089SMasatake YAMATO } lispKind;
333ae02089SMasatake YAMATO
34e112e8abSMasatake YAMATO static kindDefinition LispKinds [] = {
3549002b85SMasatake YAMATO { true, 'u', "unknown", "unknown type of definitions" },
3649002b85SMasatake YAMATO { true, 'f', "function", "functions" },
3749002b85SMasatake YAMATO { true, 'v', "variable", "variables" },
3849002b85SMasatake YAMATO { true, 'm', "macro", "macros" },
3949002b85SMasatake YAMATO { true, 'c', "const", "constants" },
403ae02089SMasatake YAMATO };
413ae02089SMasatake YAMATO
429adb049aSMasatake YAMATO typedef enum {
439adb049aSMasatake YAMATO eK_UNKNOWN,
449adb049aSMasatake YAMATO eK_FUNCTION,
459adb049aSMasatake YAMATO eK_VARIABLE,
469adb049aSMasatake YAMATO eK_CONST,
479adb049aSMasatake YAMATO eK_MACRO,
489adb049aSMasatake YAMATO eK_ALIAS,
499adb049aSMasatake YAMATO eK_VARALIAS,
509adb049aSMasatake YAMATO eK_SUBST,
519adb049aSMasatake YAMATO eK_INLINE,
529adb049aSMasatake YAMATO eK_ERROR,
539adb049aSMasatake YAMATO eK_MINOR_MODE,
549adb049aSMasatake YAMATO eK_DERIVED_MODE,
559adb049aSMasatake YAMATO /* custom.el */
569adb049aSMasatake YAMATO eK_CUSTOM,
579adb049aSMasatake YAMATO eK_GROUP,
589adb049aSMasatake YAMATO eK_FACE,
599adb049aSMasatake YAMATO eK_THEME,
609adb049aSMasatake YAMATO } emacsLispKind;
619adb049aSMasatake YAMATO
629adb049aSMasatake YAMATO /* Following macro/builtin doesn't define a name appeared
639adb049aSMasatake YAMATO * at car. So this parser doesn't handle it well.
649adb049aSMasatake YAMATO * -----------------------------------------------------
659adb049aSMasatake YAMATO * defadvice (=> cadadr)
669adb049aSMasatake YAMATO * defconst-mode-local (=> cadr)
679adb049aSMasatake YAMATO * defvar-mode-local (=> cadr)
689adb049aSMasatake YAMATO */
699adb049aSMasatake YAMATO static kindDefinition EmacsLispKinds [] = {
709adb049aSMasatake YAMATO { true, 'u', "unknown", "unknown type of definitions" },
719adb049aSMasatake YAMATO { true, 'f', "function", "functions" },
729adb049aSMasatake YAMATO { true, 'v', "variable", "variables" },
739adb049aSMasatake YAMATO { true, 'c', "const", "constants" },
749adb049aSMasatake YAMATO { true, 'm', "macro", "macros" },
759adb049aSMasatake YAMATO { true, 'a', "alias", "aliases for functions" },
769adb049aSMasatake YAMATO { true, 'V', "varalias", "aliases for variables" },
779adb049aSMasatake YAMATO { true, 's', "subst", "inline function" },
789adb049aSMasatake YAMATO { true, 'i', "inline", "inline function" },
799adb049aSMasatake YAMATO { true, 'e', "error", "errors" },
809adb049aSMasatake YAMATO { true, 'M', "minorMode", "minor modes" },
819adb049aSMasatake YAMATO { true, 'D', "derivedMode", "derived major mode" },
829adb049aSMasatake YAMATO /* custom.el */
839adb049aSMasatake YAMATO { true, 'C', "custom", "customizable variables" },
849adb049aSMasatake YAMATO { true, 'G', "group", "customization groups" },
859adb049aSMasatake YAMATO { true, 'H', "face", "customizable faces" }, /* 'F' is reserved by ctags */
869adb049aSMasatake YAMATO { true, 'T', "theme", "custom themes" },
879adb049aSMasatake YAMATO };
889adb049aSMasatake YAMATO
893ae02089SMasatake YAMATO /*
903ae02089SMasatake YAMATO * FUNCTION DEFINITIONS
913ae02089SMasatake YAMATO */
923ae02089SMasatake YAMATO
933ae02089SMasatake YAMATO /*
943ae02089SMasatake YAMATO * lisp tag functions
953ae02089SMasatake YAMATO * look for (def or (DEF, quote or QUOTE
963ae02089SMasatake YAMATO */
L_isdef(const unsigned char * strp,bool case_insensitive)9749002b85SMasatake YAMATO static int L_isdef (const unsigned char *strp, bool case_insensitive)
983ae02089SMasatake YAMATO {
9949002b85SMasatake YAMATO bool cis = case_insensitive; /* Renaming for making code short */
10049002b85SMasatake YAMATO
10149002b85SMasatake YAMATO return ( (strp [1] == 'd' || (cis && strp [1] == 'D'))
10249002b85SMasatake YAMATO && (strp [2] == 'e' || (cis && strp [2] == 'E'))
10349002b85SMasatake YAMATO && (strp [3] == 'f' || (cis && strp [3] == 'F')));
1043ae02089SMasatake YAMATO }
1053ae02089SMasatake YAMATO
L_isquote(const unsigned char * strp,bool case_insensitive)10649002b85SMasatake YAMATO static int L_isquote (const unsigned char *strp, bool case_insensitive)
1073ae02089SMasatake YAMATO {
10849002b85SMasatake YAMATO bool cis = case_insensitive; /* Renaming for making code short */
10949002b85SMasatake YAMATO
11049002b85SMasatake YAMATO return ( (*(++strp) == 'q' || (cis && *strp == 'Q'))
11149002b85SMasatake YAMATO && (*(++strp) == 'u' || (cis && *strp == 'U'))
11249002b85SMasatake YAMATO && (*(++strp) == 'o' || (cis && *strp == 'O'))
11349002b85SMasatake YAMATO && (*(++strp) == 't' || (cis && *strp == 'T'))
11449002b85SMasatake YAMATO && (*(++strp) == 'e' || (cis && *strp == 'E'))
1153ae02089SMasatake YAMATO && isspace (*(++strp)));
1163ae02089SMasatake YAMATO }
1173ae02089SMasatake YAMATO
lisp_hint2kind(const vString * const hint)11849002b85SMasatake YAMATO static int lisp_hint2kind (const vString *const hint)
11949002b85SMasatake YAMATO {
12049002b85SMasatake YAMATO int k = K_UNKNOWN;
12149002b85SMasatake YAMATO int n;
12249002b85SMasatake YAMATO
12349002b85SMasatake YAMATO /* 4 means strlen("(def"). */
124aec0c389SAvinash Sonawane #define EQN(X) strncmp(vStringValue (hint) + 4, &X[3], n) == 0
12549002b85SMasatake YAMATO switch (vStringLength (hint) - 4)
12649002b85SMasatake YAMATO {
12749002b85SMasatake YAMATO case 2:
12849002b85SMasatake YAMATO n = 2;
12949002b85SMasatake YAMATO if (EQN("DEFUN"))
13049002b85SMasatake YAMATO k = K_FUNCTION;
13149002b85SMasatake YAMATO break;
13249002b85SMasatake YAMATO case 3:
13349002b85SMasatake YAMATO n = 3;
13449002b85SMasatake YAMATO if (EQN("DEFVAR"))
13549002b85SMasatake YAMATO k = K_VARIABLE;
13649002b85SMasatake YAMATO break;
13749002b85SMasatake YAMATO case 5:
13849002b85SMasatake YAMATO n = 5;
13949002b85SMasatake YAMATO if (EQN("DEFMACRO"))
14049002b85SMasatake YAMATO k = K_MACRO;
14149002b85SMasatake YAMATO break;
14249002b85SMasatake YAMATO case 8:
14349002b85SMasatake YAMATO n = 8;
14449002b85SMasatake YAMATO if (EQN("DEFCONSTANT"))
14549002b85SMasatake YAMATO k = K_CONST;
14649002b85SMasatake YAMATO break;
14749002b85SMasatake YAMATO }
14849002b85SMasatake YAMATO #undef EQN
14949002b85SMasatake YAMATO return k;
15049002b85SMasatake YAMATO }
15149002b85SMasatake YAMATO
1529adb049aSMasatake YAMATO /* TODO: implement this in hashtable. */
elisp_hint2kind(const vString * const hint)1539adb049aSMasatake YAMATO static int elisp_hint2kind (const vString *const hint)
1549adb049aSMasatake YAMATO {
1559adb049aSMasatake YAMATO int k = eK_UNKNOWN;
1569adb049aSMasatake YAMATO int n;
1579adb049aSMasatake YAMATO
1589adb049aSMasatake YAMATO /* 4 means strlen("(def"). */
159aec0c389SAvinash Sonawane #define EQN(X) strncmp(vStringValue (hint) + 4, &X[3], n) == 0
1609adb049aSMasatake YAMATO switch (vStringLength (hint) - 4)
1619adb049aSMasatake YAMATO {
1629adb049aSMasatake YAMATO case 2:
1639adb049aSMasatake YAMATO n = 2;
1649adb049aSMasatake YAMATO if (EQN("defun"))
1659adb049aSMasatake YAMATO k = eK_FUNCTION;
1669adb049aSMasatake YAMATO break;
1679adb049aSMasatake YAMATO case 3:
1689adb049aSMasatake YAMATO n = 3;
1699adb049aSMasatake YAMATO if (EQN("defvar"))
1709adb049aSMasatake YAMATO k = eK_VARIABLE;
1719adb049aSMasatake YAMATO else if (EQN("defun*"))
1729adb049aSMasatake YAMATO k = eK_FUNCTION;
1739adb049aSMasatake YAMATO break;
1749adb049aSMasatake YAMATO case 4:
1759adb049aSMasatake YAMATO n = 4;
1769adb049aSMasatake YAMATO if (EQN("defface"))
1779adb049aSMasatake YAMATO k = eK_FACE;
1789adb049aSMasatake YAMATO case 5:
1799adb049aSMasatake YAMATO n = 5;
1809adb049aSMasatake YAMATO if (EQN("defconst"))
1819adb049aSMasatake YAMATO k = eK_CONST;
1829adb049aSMasatake YAMATO else if (EQN("defmacro"))
1839adb049aSMasatake YAMATO k = eK_MACRO;
1849adb049aSMasatake YAMATO else if (EQN("defalias"))
1859adb049aSMasatake YAMATO k = eK_ALIAS;
1869adb049aSMasatake YAMATO else if (EQN("defsubst"))
1879adb049aSMasatake YAMATO k = eK_SUBST;
1889adb049aSMasatake YAMATO else if (EQN("defgroup"))
1899adb049aSMasatake YAMATO k = eK_GROUP;
1909adb049aSMasatake YAMATO else if (EQN("deftheme"))
1919adb049aSMasatake YAMATO k = eK_THEME;
1929adb049aSMasatake YAMATO break;
1939adb049aSMasatake YAMATO case 6:
1949adb049aSMasatake YAMATO n = 6;
1959adb049aSMasatake YAMATO if (EQN("defcustom"))
1969adb049aSMasatake YAMATO k = eK_CUSTOM;
1979adb049aSMasatake YAMATO else if (EQN("defsubst*"))
1989adb049aSMasatake YAMATO k = eK_SUBST;
1999adb049aSMasatake YAMATO else if (EQN("defmacro*"))
2009adb049aSMasatake YAMATO k = eK_MACRO;
2019adb049aSMasatake YAMATO break;
2029adb049aSMasatake YAMATO case 7:
2039adb049aSMasatake YAMATO n = 7;
2049adb049aSMasatake YAMATO if (EQN("define-key"))
2059adb049aSMasatake YAMATO k = KIND_GHOST_INDEX;
2069adb049aSMasatake YAMATO break;
2079adb049aSMasatake YAMATO case 9:
2089adb049aSMasatake YAMATO n = 9;
2099adb049aSMasatake YAMATO if (EQN("defvar-local"))
2109adb049aSMasatake YAMATO k = eK_VARIABLE;
2119adb049aSMasatake YAMATO else if (EQN("define-error"))
2129adb049aSMasatake YAMATO k = eK_ERROR;
2139adb049aSMasatake YAMATO break;
2149adb049aSMasatake YAMATO case 8:
2159adb049aSMasatake YAMATO n = 8;
2169adb049aSMasatake YAMATO if (EQN("defvaralias"))
2179adb049aSMasatake YAMATO k = eK_VARALIAS;
2189adb049aSMasatake YAMATO break;
2199adb049aSMasatake YAMATO case 10:
2209adb049aSMasatake YAMATO n = 10;
2219adb049aSMasatake YAMATO if (EQN("define-inline"))
2229adb049aSMasatake YAMATO k = eK_INLINE;
2239adb049aSMasatake YAMATO break;
2249adb049aSMasatake YAMATO case 14:
2259adb049aSMasatake YAMATO n = 14;
2269adb049aSMasatake YAMATO if (EQN("define-minor-mode"))
2279adb049aSMasatake YAMATO k = eK_MINOR_MODE;
2289adb049aSMasatake YAMATO break;
2299adb049aSMasatake YAMATO case 16:
2309adb049aSMasatake YAMATO n = 16;
2319adb049aSMasatake YAMATO if (EQN("define-derived-mode"))
2329adb049aSMasatake YAMATO k = eK_DERIVED_MODE;
2339adb049aSMasatake YAMATO break;
2349adb049aSMasatake YAMATO case 21:
2359adb049aSMasatake YAMATO n = 21;
2369adb049aSMasatake YAMATO if (EQN("define-global-minor-mode"))
2379adb049aSMasatake YAMATO k = eK_MINOR_MODE;
2389adb049aSMasatake YAMATO break;
2399adb049aSMasatake YAMATO case 25:
2409adb049aSMasatake YAMATO n = 25;
2419adb049aSMasatake YAMATO if (EQN("define-globalized-minor-mode"))
2429adb049aSMasatake YAMATO k = eK_MINOR_MODE;
2439adb049aSMasatake YAMATO break;
2449adb049aSMasatake YAMATO case 27:
2459adb049aSMasatake YAMATO n = 27;
2469adb049aSMasatake YAMATO if (EQN("define-obsolete-function-alias"))
2479adb049aSMasatake YAMATO k = eK_ALIAS;
2489adb049aSMasatake YAMATO break;
2499adb049aSMasatake YAMATO }
2509adb049aSMasatake YAMATO #undef EQN
2519adb049aSMasatake YAMATO return k;
2529adb049aSMasatake YAMATO }
2539adb049aSMasatake YAMATO
L_getit(vString * const name,const unsigned char * dbp,bool case_insensitive,int (* hint2kind)(const vString *),const vString * const kind_hint)25449002b85SMasatake YAMATO static void L_getit (vString *const name, const unsigned char *dbp,
25549002b85SMasatake YAMATO bool case_insensitive,
25649002b85SMasatake YAMATO int (*hint2kind) (const vString *),
25749002b85SMasatake YAMATO const vString *const kind_hint)
2583ae02089SMasatake YAMATO {
2593ae02089SMasatake YAMATO const unsigned char *p;
2603ae02089SMasatake YAMATO
2613ae02089SMasatake YAMATO if (*dbp == '\'') /* Skip prefix quote */
2623ae02089SMasatake YAMATO dbp++;
26349002b85SMasatake YAMATO else if (*dbp == '(' && L_isquote (dbp, case_insensitive)) /* Skip "(quote " */
2643ae02089SMasatake YAMATO {
2653ae02089SMasatake YAMATO dbp += 7;
2663ae02089SMasatake YAMATO while (isspace (*dbp))
2673ae02089SMasatake YAMATO dbp++;
2683ae02089SMasatake YAMATO }
2693ae02089SMasatake YAMATO for (p=dbp ; *p!='\0' && *p!='(' && !isspace ((int) *p) && *p!=')' ; p++)
2703ae02089SMasatake YAMATO vStringPut (name, *p);
2713ae02089SMasatake YAMATO
2723ae02089SMasatake YAMATO if (vStringLength (name) > 0)
27349002b85SMasatake YAMATO {
27449002b85SMasatake YAMATO int kind = hint2kind (kind_hint);
27549002b85SMasatake YAMATO if (kind != KIND_GHOST_INDEX)
27649002b85SMasatake YAMATO makeSimpleTag (name, kind);
27749002b85SMasatake YAMATO }
2783ae02089SMasatake YAMATO vStringClear (name);
2793ae02089SMasatake YAMATO }
2803ae02089SMasatake YAMATO
2813ae02089SMasatake YAMATO /* Algorithm adapted from from GNU etags.
2823ae02089SMasatake YAMATO */
findLispTagsCommon(bool case_insensitive,bool has_namespace,int (* hint2kind)(const vString *))28349002b85SMasatake YAMATO static void findLispTagsCommon (bool case_insensitive,
28449002b85SMasatake YAMATO bool has_namespace,
28549002b85SMasatake YAMATO int (*hint2kind) (const vString *))
2863ae02089SMasatake YAMATO {
2873ae02089SMasatake YAMATO vString *name = vStringNew ();
28849002b85SMasatake YAMATO vString *kind_hint = vStringNew ();
2893ae02089SMasatake YAMATO const unsigned char* p;
2903ae02089SMasatake YAMATO
2913ae02089SMasatake YAMATO
2921b312fe7SMasatake YAMATO while ((p = readLineFromInputFile ()) != NULL)
2933ae02089SMasatake YAMATO {
2943ae02089SMasatake YAMATO if (*p == '(')
2953ae02089SMasatake YAMATO {
29649002b85SMasatake YAMATO if (L_isdef (p, case_insensitive))
2973ae02089SMasatake YAMATO {
29849002b85SMasatake YAMATO vStringClear (kind_hint);
2993ae02089SMasatake YAMATO while (*p != '\0' && !isspace ((int) *p))
30049002b85SMasatake YAMATO {
30149002b85SMasatake YAMATO vStringPut (kind_hint,
30249002b85SMasatake YAMATO case_insensitive? toupper((int)*p): *p);
3033ae02089SMasatake YAMATO p++;
30449002b85SMasatake YAMATO }
3053ae02089SMasatake YAMATO while (isspace ((int) *p))
3063ae02089SMasatake YAMATO p++;
30749002b85SMasatake YAMATO L_getit (name, p, case_insensitive, hint2kind, kind_hint);
3083ae02089SMasatake YAMATO }
30949002b85SMasatake YAMATO else if (has_namespace)
3103ae02089SMasatake YAMATO {
3113ae02089SMasatake YAMATO do
3123ae02089SMasatake YAMATO p++;
3133ae02089SMasatake YAMATO while (*p != '\0' && !isspace ((int) *p)
3143ae02089SMasatake YAMATO && *p != ':' && *p != '(' && *p != ')');
3153ae02089SMasatake YAMATO if (*p == ':')
3163ae02089SMasatake YAMATO {
3173ae02089SMasatake YAMATO do
3183ae02089SMasatake YAMATO p++;
3193ae02089SMasatake YAMATO while (*p == ':');
3203ae02089SMasatake YAMATO
32149002b85SMasatake YAMATO if (L_isdef (p - 1, case_insensitive))
3223ae02089SMasatake YAMATO {
32349002b85SMasatake YAMATO vStringClear (kind_hint);
3243ae02089SMasatake YAMATO while (*p != '\0' && !isspace ((int) *p))
32549002b85SMasatake YAMATO {
32649002b85SMasatake YAMATO vStringPut (kind_hint,
32749002b85SMasatake YAMATO case_insensitive? toupper((int)*p): *p);
3283ae02089SMasatake YAMATO p++;
32949002b85SMasatake YAMATO }
3303ae02089SMasatake YAMATO while (isspace (*p))
3313ae02089SMasatake YAMATO p++;
33249002b85SMasatake YAMATO L_getit (name, p, case_insensitive, hint2kind, kind_hint);
3333ae02089SMasatake YAMATO }
3343ae02089SMasatake YAMATO }
3353ae02089SMasatake YAMATO }
3363ae02089SMasatake YAMATO }
3373ae02089SMasatake YAMATO }
3383ae02089SMasatake YAMATO vStringDelete (name);
33949002b85SMasatake YAMATO vStringDelete (kind_hint);
34049002b85SMasatake YAMATO }
34149002b85SMasatake YAMATO
findLispTags(void)34249002b85SMasatake YAMATO static void findLispTags (void)
34349002b85SMasatake YAMATO {
34449002b85SMasatake YAMATO findLispTagsCommon (true, true, lisp_hint2kind);
3453ae02089SMasatake YAMATO }
3463ae02089SMasatake YAMATO
findEmacsLispTags(void)3479adb049aSMasatake YAMATO static void findEmacsLispTags (void)
3489adb049aSMasatake YAMATO {
3499adb049aSMasatake YAMATO findLispTagsCommon (false, false, elisp_hint2kind);
3509adb049aSMasatake YAMATO }
3519adb049aSMasatake YAMATO
LispParser(void)3523ae02089SMasatake YAMATO extern parserDefinition* LispParser (void)
3533ae02089SMasatake YAMATO {
3543ae02089SMasatake YAMATO static const char *const extensions [] = {
3559adb049aSMasatake YAMATO "cl", "clisp", "l", "lisp", "lsp", NULL
3563ae02089SMasatake YAMATO };
3573ae02089SMasatake YAMATO static const char *const aliases [] = {
3589adb049aSMasatake YAMATO "clisp", NULL
3593ae02089SMasatake YAMATO };
3603ae02089SMasatake YAMATO
361*f5bca49fSMasatake YAMATO static selectLanguage selectors[] = { selectLispOrLEXByLEXMarker, NULL };
362*f5bca49fSMasatake YAMATO
3633ae02089SMasatake YAMATO parserDefinition* def = parserNew ("Lisp");
36409ae690fSMasatake YAMATO def->kindTable = LispKinds;
3653db72c21SMasatake YAMATO def->kindCount = ARRAY_SIZE (LispKinds);
3663ae02089SMasatake YAMATO def->extensions = extensions;
3673ae02089SMasatake YAMATO def->aliases = aliases;
3683ae02089SMasatake YAMATO def->parser = findLispTags;
369*f5bca49fSMasatake YAMATO def->selectLanguage = selectors;
3703ae02089SMasatake YAMATO return def;
3713ae02089SMasatake YAMATO }
3729adb049aSMasatake YAMATO
EmacsLispParser(void)3739adb049aSMasatake YAMATO extern parserDefinition* EmacsLispParser (void)
3749adb049aSMasatake YAMATO {
3759adb049aSMasatake YAMATO static const char *const extensions [] = {
3769adb049aSMasatake YAMATO "el", NULL
3779adb049aSMasatake YAMATO };
3789adb049aSMasatake YAMATO static const char *const aliases [] = {
3799adb049aSMasatake YAMATO "emacs-lisp", NULL
3809adb049aSMasatake YAMATO };
3819adb049aSMasatake YAMATO
3829adb049aSMasatake YAMATO parserDefinition* def = parserNew ("EmacsLisp");
3839adb049aSMasatake YAMATO def->kindTable = EmacsLispKinds;
3849adb049aSMasatake YAMATO def->kindCount = ARRAY_SIZE (EmacsLispKinds);
3859adb049aSMasatake YAMATO def->extensions = extensions;
3869adb049aSMasatake YAMATO def->aliases = aliases;
3879adb049aSMasatake YAMATO def->parser = findEmacsLispTags;
3889adb049aSMasatake YAMATO return def;
3899adb049aSMasatake YAMATO }
390