summaryrefslogtreecommitdiff
path: root/lib-src
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1993-07-09 18:56:47 +0000
committerRichard M. Stallman <rms@gnu.org>1993-07-09 18:56:47 +0000
commitbde416f80edd03cbb02cfbb1b1db980bd0f6cd7e (patch)
treefea14b7a96db82952db6ad89e96205920250dc2f /lib-src
parent275dbfae56f0bc717812988c6ce5fa92cf58da7e (diff)
downloademacs-bde416f80edd03cbb02cfbb1b1db980bd0f6cd7e.tar.gz
(consider_token): was `==', now is `='.
(consider_token): DEFUNs now treated like funcs in ctags mode. (LEVEL_OK_FOR_FUNCDEF): removed. (C_entries): optimized the test that used LEVEL_OK_FOR_FUNCDEF. (C_entries): removed a piece of useless code. (C_entries): making typedef tags is delayed until a semicolon is met. This handles "typedef int X, Y, Z;" correctly.
Diffstat (limited to 'lib-src')
-rw-r--r--lib-src/etags.c71
1 files changed, 35 insertions, 36 deletions
diff --git a/lib-src/etags.c b/lib-src/etags.c
index c582d61b444..f3007c50836 100644
--- a/lib-src/etags.c
+++ b/lib-src/etags.c
@@ -1380,7 +1380,7 @@ typedef enum
skeyseen, /* struct-like keyword seen */
stagseen, /* struct-like tag seen */
scolonseen, /* colon seen after struct-like tag */
- sinbody /* in class body: recognize member func defs */
+ sinbody /* in struct body: recognize member func defs*/
} STRUCTST;
STRUCTST structdef;
/*
@@ -1420,14 +1420,6 @@ logical yacc_rules;
* to the list.
*/
-/*
- * LEVEL_OK_FOR_FUNCDEF allows C++ function definition within class body.
- * Currently typdef and structdef stuff (typedefs and struct
- * definitions) are only noticed when level==0, but that may change.
- */
-#define LEVEL_OK_FOR_FUNCDEF() \
- (level==0 || (cplpl && level==1 && structdef==sinbody))
-
#define curlb (lbs[curndx].lb)
#define othlb (lbs[1-curndx].lb)
#define newlb (lbs[newndx].lb)
@@ -1467,7 +1459,7 @@ C_entries (c_ext)
char tokb[BUFSIZ]; /* latest token name for funcdef & structdef */
register int tokoff; /* offset in line of start of latest token */
register int toklen; /* length of latest token */
- int level; /* current curly brace level */
+ int cblev; /* current curly brace level */
logical incomm, inquote, inchar, quotednl, midtoken;
logical cplpl;
@@ -1480,7 +1472,7 @@ C_entries (c_ext)
definedef = dnone; funcdef = fnone; typdef= tnone; structdef= snone;
next_token_is_func = yacc_rules = FALSE;
midtoken = inquote = inchar = incomm = quotednl = FALSE;
- level = 0;
+ cblev = 0;
cplpl = c_ext & C_PLPL;
C_create_stabs ();
@@ -1573,10 +1565,10 @@ C_entries (c_ext)
typdef= tnone; structdef= snone;
next_token_is_func = FALSE;
midtoken = inquote = inchar = incomm = quotednl = FALSE;
- level = 0;
+ cblev = 0;
yacc_rules = !yacc_rules;
continue;
- }
+ }
case '#':
if (lp == newlb.buffer + 1 && definedef == dnone)
definedef = dsharpseen;
@@ -1584,9 +1576,10 @@ C_entries (c_ext)
} /* switch (c) */
- if (LEVEL_OK_FOR_FUNCDEF ()
+ /* Consider token only if some complicated conditions are satisfied. */
+ if (((cblev == 0 && structdef != scolonseen)
+ || (cblev == 1 && cplpl && structdef == sinbody))
&& definedef != dignorerest
- && structdef != scolonseen
&& funcdef != finlist)
{
if (midtoken)
@@ -1612,7 +1605,7 @@ C_entries (c_ext)
tok.rewritten = FALSE;
if (yacc_rules
|| consider_token (c, lp, &tok,
- c_ext, level, &is_func))
+ c_ext, cblev, &is_func))
{
if (structdef == sinbody
&& definedef == dnone && is_func)
@@ -1628,7 +1621,9 @@ C_entries (c_ext)
sprintf (tokb, "%.*s", tok.len, tok.p);
}
- if (funcdef == ftagseen || structdef == stagseen)
+ if (funcdef == ftagseen
+ || structdef == stagseen
+ || typdef == tend)
{
if (newndx == curndx)
curndx = 1 - curndx; /* switch line buffers */
@@ -1683,13 +1678,14 @@ C_entries (c_ext)
}
break;
case ';':
+ if (cblev == 0 && typdef == tend)
+ {
+ typdef = tnone;
+ MAKE_TAG_FROM_OTH_LB (FALSE);
+ }
funcdef = fnone;
/* FALLTHRU */
case ',':
- if (funcdef != finlist)
- funcdef = fnone;
- if (level == 0 && typdef == tend)
- typdef = tnone;
/* FALLTHRU */
case '[':
if (funcdef != finlist)
@@ -1728,7 +1724,7 @@ C_entries (c_ext)
MAKE_TAG_FROM_OTH_LB (FALSE);
break;
}
- level++;
+ cblev++;
/* FALLTHRU */
case '*':
if (funcdef == flistseen)
@@ -1739,10 +1735,10 @@ C_entries (c_ext)
break;
case '}':
if (!noindentypedefs && lp == newlb.buffer + 1)
- level = 0; /* reset level if first column */
- else if (level > 0)
- level--;
- if (level == 0)
+ cblev = 0; /* reset curly brace level if first column */
+ else if (cblev > 0)
+ cblev--;
+ if (cblev == 0)
{
if (typdef == tinbody)
typdef = tend;
@@ -1785,12 +1781,12 @@ C_entries (c_ext)
*/
logical
-consider_token (c, lp, tokp, c_ext, level, is_func)
+consider_token (c, lp, tokp, c_ext, cblev, is_func)
register char c; /* IN: first char after the token */
register char *lp; /* IN: lp points to 2nd char after the token */
- register TOKEN *tokp; /* IN */
- int c_ext; /* IN */
- int level; /* IN */
+ register TOKEN *tokp; /* IN: token pointer */
+ int c_ext; /* IN: C extensions mask */
+ int cblev; /* IN: curly brace level */
logical *is_func; /* OUT */
{
logical firsttok; /* TRUE if have seen first token in ()'s */
@@ -1871,9 +1867,10 @@ consider_token (c, lp, tokp, c_ext, level, is_func)
}
/*
- * This structdef business is currently only invoked when level==0.
- * It should be recursively invoked whatever the level, and a stack of
- * states kept, to allow for definitions of structs within structs.
+ * This structdef business is currently only invoked when cblev==0.
+ * It should be recursively invoked whatever the curly brace level,
+ * and a stack of states kept, to allow for definitions of structs
+ * within structs.
*
* This structdef business is NOT invoked when we are ctags and the
* file is plain C. This is because a struct tag may have the same
@@ -1889,7 +1886,7 @@ consider_token (c, lp, tokp, c_ext, level, is_func)
case st_C_struct:
case st_C_enum:
if (typdef == ttypedseen
- || (typedefs_and_cplusplus && level == 0 && structdef == snone))
+ || (typedefs_and_cplusplus && cblev == 0 && structdef == snone))
{
structdef = skeyseen;
structkey = tokse;
@@ -1938,6 +1935,7 @@ consider_token (c, lp, tokp, c_ext, level, is_func)
if (next_token_is_func)
{
next_token_is_func = FALSE;
+ *is_func = TRUE;
return (TRUE);
}
@@ -1945,7 +1943,7 @@ consider_token (c, lp, tokp, c_ext, level, is_func)
switch (toktype)
{
case st_C_typespec:
- funcdef == fnone; /* should be useless */
+ funcdef = fnone; /* should be useless */
return (FALSE);
default:
funcdef = ftagseen;
@@ -2406,7 +2404,8 @@ L_getit ()
cp[0] = 0;
(void) strcpy (nambuf, dbp);
cp[0] = c;
- pfnote (nambuf, TRUE, FALSE, lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+ pfnote (nambuf, TRUE, FALSE, lb.buffer,
+ cp - lb.buffer + 1, lineno, linecharno);
pfcnt++;
}