(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.
This commit is contained in:
Richard M. Stallman 1993-07-09 18:56:47 +00:00
parent ce3be3d531
commit 591fa824dd

View file

@ -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++;
}