--- etags.c.~3.93.~ 2009-11-29 08:42:32.000000000 +1100 +++ etags.c 2010-02-20 10:14:45.000000000 +1100 @@ -433,6 +433,7 @@ static char *concat __P((char *, char *, char *)); static char *skip_spaces __P((char *)); static char *skip_non_spaces __P((char *)); +static char *skip_name __P((char *)); static char *savenstr __P((char *, int)); static char *savestr __P((char *)); static char *etags_strchr __P((const char *, int)); @@ -699,7 +700,9 @@ "In Lisp code, any function defined with `defun', any variable\n\ defined with `defvar' or `defconst', and in general the first\n\ argument of any expression that starts with `(def' in column zero\n\ -is a tag."; +is a tag.\n\ +`--declarations' tags declarations \"(defvar foo)\" as well as\n\ +definitions."; static char *Lua_suffixes [] = { "lua", "LUA", NULL }; @@ -4858,6 +4861,19 @@ if (dbp[0] != '(') continue; + /* "(defvar foo)" is a declaration rather than a definition. + ENHANCE-ME: Maybe also Elisp (declare-function funcname ...), + and/or CL and Elisp (declare (special varname)), or (proclaim). */ + if (! declarations) { + char *p = dbp+1; + if (LOOKING_AT (p, "defvar")) { + p = skip_name (p); /* past var name */ + p = skip_spaces (p); + if (*p == ')') + continue; + } + } + if (strneq (dbp+1, "def", 3) || strneq (dbp+1, "DEF", 3)) { dbp = skip_non_spaces (dbp); @@ -6510,6 +6526,16 @@ cp++; return cp; } + +/* Skip past any chars at cp which are "name" class, meaning not notinname().*/ +static char * +skip_name (char *cp) +{ + /* '\0' is a notinname() so loop stops there too */ + while (! notinname (*cp)) + cp++; + return cp; +} /* Print error message and exit. */ void