diff options
| author | Francesco Potortì | 1993-09-06 11:39:39 +0000 |
|---|---|---|
| committer | Francesco Potortì | 1993-09-06 11:39:39 +0000 |
| commit | 31d4b31480bbce7bdff82a7da2414598afed9279 (patch) | |
| tree | f7b64e46fc8a405452bb5265270b3927fcaec6aa /lib-src | |
| parent | 1817fda04a1b9a20d564e9bd8c93865137bc4e73 (diff) | |
| download | emacs-31d4b31480bbce7bdff82a7da2414598afed9279.tar.gz emacs-31d4b31480bbce7bdff82a7da2414598afed9279.zip | |
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
(L_funcs): the (foo::defmumble stuff now should work.
(consider_token): function returned random value--corrected.
(C_entries): corrected == versus = typo.
* etags.c (FINCST): added the fignore status. Means we are
after the parameter list and before the open curly brace.
Allows correct parsing of C++ constructors.
(C_entries, consider_token): make use of fignore.
(consider_token): reset funcdef when next_token_is_func: when in
ctags mode makes DEFVAR and others work better.
(L_isquote): function that recognises the "(quote" string.
(L_getit): ignore quoting via "'" or "(quote". Useful for defalias.
Diffstat (limited to 'lib-src')
| -rw-r--r-- | lib-src/etags.c | 101 |
1 files changed, 74 insertions, 27 deletions
diff --git a/lib-src/etags.c b/lib-src/etags.c index b78a3f8d277..bca7a1eb8a0 100644 --- a/lib-src/etags.c +++ b/lib-src/etags.c | |||
| @@ -24,6 +24,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | |||
| 24 | * Ed Pelegri-Llopart added C typedefs. | 24 | * Ed Pelegri-Llopart added C typedefs. |
| 25 | * Gnu Emacs TAGS format and modifications by RMS? | 25 | * Gnu Emacs TAGS format and modifications by RMS? |
| 26 | * Sam Kendall added C++. | 26 | * Sam Kendall added C++. |
| 27 | * | ||
| 28 | * Francesco Potorti` is the current maintainer. 7.5 | ||
| 27 | */ | 29 | */ |
| 28 | 30 | ||
| 29 | #ifdef HAVE_CONFIG_H | 31 | #ifdef HAVE_CONFIG_H |
| @@ -157,7 +159,7 @@ char *savenstr (); | |||
| 157 | char *savestr (); | 159 | char *savestr (); |
| 158 | char *xmalloc (); | 160 | char *xmalloc (); |
| 159 | char *xrealloc (); | 161 | char *xrealloc (); |
| 160 | int L_isdef (); | 162 | int L_isdef (), L_isquote (); |
| 161 | int PF_funcs (); | 163 | int PF_funcs (); |
| 162 | int total_size_of_entries (); | 164 | int total_size_of_entries (); |
| 163 | logical consider_token (); | 165 | logical consider_token (); |
| @@ -1332,13 +1334,16 @@ C_create_stabs () | |||
| 1332 | } | 1334 | } |
| 1333 | 1335 | ||
| 1334 | /* | 1336 | /* |
| 1335 | * etags.c 4.2 1993/03/22 12:13:40 pot Exp | ||
| 1336 | * C functions are recognized using a simple finite automaton. | 1337 | * C functions are recognized using a simple finite automaton. |
| 1337 | * funcdef is its state variable. | 1338 | * funcdef is its state variable. |
| 1338 | */ | 1339 | */ |
| 1339 | typedef enum | 1340 | typedef enum |
| 1340 | { | 1341 | { |
| 1341 | fnone, ftagseen, finlist, flistseen | 1342 | fnone, /* nothing seen */ |
| 1343 | ftagseen, /* function-like tag seen */ | ||
| 1344 | finlist, /* in parameter list */ | ||
| 1345 | flistseen, /* after parameter list */ | ||
| 1346 | fignore, /* before open brace */ | ||
| 1342 | } FUNCST; | 1347 | } FUNCST; |
| 1343 | FUNCST funcdef; | 1348 | FUNCST funcdef; |
| 1344 | 1349 | ||
| @@ -1348,7 +1353,10 @@ FUNCST funcdef; | |||
| 1348 | */ | 1353 | */ |
| 1349 | typedef enum | 1354 | typedef enum |
| 1350 | { | 1355 | { |
| 1351 | tnone, ttypedseen, tinbody, tend | 1356 | tnone, /* nothing seen */ |
| 1357 | ttypedseen, /* typedef keyword seen */ | ||
| 1358 | tinbody, /* inside typedef body */ | ||
| 1359 | tend, /* just before typedef tag */ | ||
| 1352 | } TYPEDST; | 1360 | } TYPEDST; |
| 1353 | TYPEDST typdef; | 1361 | TYPEDST typdef; |
| 1354 | 1362 | ||
| @@ -1365,7 +1373,7 @@ typedef enum | |||
| 1365 | skeyseen, /* struct-like keyword seen */ | 1373 | skeyseen, /* struct-like keyword seen */ |
| 1366 | stagseen, /* struct-like tag seen */ | 1374 | stagseen, /* struct-like tag seen */ |
| 1367 | scolonseen, /* colon seen after struct-like tag */ | 1375 | scolonseen, /* colon seen after struct-like tag */ |
| 1368 | sinbody /* in struct body: recognize member func defs*/ | 1376 | sinbody, /* in struct body: recognize member func defs*/ |
| 1369 | } STRUCTST; | 1377 | } STRUCTST; |
| 1370 | STRUCTST structdef; | 1378 | STRUCTST structdef; |
| 1371 | /* | 1379 | /* |
| @@ -1383,7 +1391,7 @@ typedef enum | |||
| 1383 | dnone, /* nothing seen */ | 1391 | dnone, /* nothing seen */ |
| 1384 | dsharpseen, /* '#' seen as first char on line */ | 1392 | dsharpseen, /* '#' seen as first char on line */ |
| 1385 | ddefineseen, /* '#' and 'define' seen */ | 1393 | ddefineseen, /* '#' and 'define' seen */ |
| 1386 | dignorerest /* ignore rest of line */ | 1394 | dignorerest, /* ignore rest of line */ |
| 1387 | } DEFINEST; | 1395 | } DEFINEST; |
| 1388 | DEFINEST definedef; | 1396 | DEFINEST definedef; |
| 1389 | 1397 | ||
| @@ -1631,7 +1639,8 @@ C_entries (c_ext) | |||
| 1631 | { | 1639 | { |
| 1632 | case flistseen: | 1640 | case flistseen: |
| 1633 | MAKE_TAG_FROM_OTH_LB (TRUE); | 1641 | MAKE_TAG_FROM_OTH_LB (TRUE); |
| 1634 | /* FALLTHRU */ | 1642 | funcdef = fignore; |
| 1643 | break; | ||
| 1635 | case ftagseen: | 1644 | case ftagseen: |
| 1636 | funcdef = fnone; | 1645 | funcdef = fnone; |
| 1637 | break; | 1646 | break; |
| @@ -1659,7 +1668,7 @@ C_entries (c_ext) | |||
| 1659 | else if (yacc_rules && funcdef == ftagseen) | 1668 | else if (yacc_rules && funcdef == ftagseen) |
| 1660 | { | 1669 | { |
| 1661 | MAKE_TAG_FROM_OTH_LB (FALSE); | 1670 | MAKE_TAG_FROM_OTH_LB (FALSE); |
| 1662 | funcdef == fnone; | 1671 | funcdef = fignore; |
| 1663 | } | 1672 | } |
| 1664 | break; | 1673 | break; |
| 1665 | case ';': | 1674 | case ';': |
| @@ -1668,12 +1677,13 @@ C_entries (c_ext) | |||
| 1668 | typdef = tnone; | 1677 | typdef = tnone; |
| 1669 | MAKE_TAG_FROM_OTH_LB (FALSE); | 1678 | MAKE_TAG_FROM_OTH_LB (FALSE); |
| 1670 | } | 1679 | } |
| 1671 | funcdef = fnone; | 1680 | if (funcdef != fignore) |
| 1681 | funcdef = fnone; | ||
| 1672 | /* FALLTHRU */ | 1682 | /* FALLTHRU */ |
| 1673 | case ',': | 1683 | case ',': |
| 1674 | /* FALLTHRU */ | 1684 | /* FALLTHRU */ |
| 1675 | case '[': | 1685 | case '[': |
| 1676 | if (funcdef != finlist) | 1686 | if (funcdef != finlist && funcdef != fignore) |
| 1677 | funcdef = fnone; | 1687 | funcdef = fnone; |
| 1678 | if (structdef == stagseen) | 1688 | if (structdef == stagseen) |
| 1679 | structdef = snone; | 1689 | structdef = snone; |
| @@ -1709,13 +1719,21 @@ C_entries (c_ext) | |||
| 1709 | MAKE_TAG_FROM_OTH_LB (FALSE); | 1719 | MAKE_TAG_FROM_OTH_LB (FALSE); |
| 1710 | break; | 1720 | break; |
| 1711 | } | 1721 | } |
| 1722 | switch (funcdef) | ||
| 1723 | { | ||
| 1724 | case flistseen: | ||
| 1725 | MAKE_TAG_FROM_OTH_LB (TRUE); | ||
| 1726 | /* FALLTHRU */ | ||
| 1727 | case fignore: | ||
| 1728 | funcdef = fnone; | ||
| 1729 | } | ||
| 1712 | cblev++; | 1730 | cblev++; |
| 1713 | /* FALLTHRU */ | 1731 | break; |
| 1714 | case '*': | 1732 | case '*': |
| 1715 | if (funcdef == flistseen) | 1733 | if (funcdef == flistseen) |
| 1716 | { | 1734 | { |
| 1717 | MAKE_TAG_FROM_OTH_LB (TRUE); | 1735 | MAKE_TAG_FROM_OTH_LB (TRUE); |
| 1718 | funcdef = fnone; | 1736 | funcdef = fignore; |
| 1719 | } | 1737 | } |
| 1720 | break; | 1738 | break; |
| 1721 | case '}': | 1739 | case '}': |
| @@ -1920,7 +1938,8 @@ consider_token (c, lp, tokp, c_ext, cblev, is_func) | |||
| 1920 | if (next_token_is_func) | 1938 | if (next_token_is_func) |
| 1921 | { | 1939 | { |
| 1922 | next_token_is_func = FALSE; | 1940 | next_token_is_func = FALSE; |
| 1923 | *is_func = TRUE; | 1941 | funcdef = fnone; |
| 1942 | *is_func = TRUE; /* to force search string in ctags */ | ||
| 1924 | return (TRUE); | 1943 | return (TRUE); |
| 1925 | } | 1944 | } |
| 1926 | 1945 | ||
| @@ -1931,10 +1950,15 @@ consider_token (c, lp, tokp, c_ext, cblev, is_func) | |||
| 1931 | funcdef = fnone; /* should be useless */ | 1950 | funcdef = fnone; /* should be useless */ |
| 1932 | return (FALSE); | 1951 | return (FALSE); |
| 1933 | default: | 1952 | default: |
| 1934 | funcdef = ftagseen; | 1953 | if (funcdef == fnone) |
| 1935 | *is_func = TRUE; | 1954 | { |
| 1936 | return (TRUE); | 1955 | funcdef = ftagseen; |
| 1956 | *is_func = TRUE; | ||
| 1957 | return (TRUE); | ||
| 1958 | } | ||
| 1937 | } | 1959 | } |
| 1960 | |||
| 1961 | return (FALSE); | ||
| 1938 | } | 1962 | } |
| 1939 | 1963 | ||
| 1940 | /* Fortran parsing */ | 1964 | /* Fortran parsing */ |
| @@ -2343,15 +2367,17 @@ L_funcs (fi) | |||
| 2343 | else | 2367 | else |
| 2344 | { | 2368 | { |
| 2345 | /* Check for (foo::defmumble name-defined ... */ | 2369 | /* Check for (foo::defmumble name-defined ... */ |
| 2346 | while (*dbp && *dbp != ':' && !isspace (*dbp) | 2370 | do |
| 2347 | && *dbp != '(' && *dbp != ')') | ||
| 2348 | dbp++; | 2371 | dbp++; |
| 2372 | while (*dbp && !isspace (*dbp) | ||
| 2373 | && *dbp != ':' && *dbp != '(' && *dbp != ')'); | ||
| 2349 | if (*dbp == ':') | 2374 | if (*dbp == ':') |
| 2350 | { | 2375 | { |
| 2351 | while (*dbp == ':') | 2376 | do |
| 2352 | dbp++; | 2377 | dbp++; |
| 2378 | while (*dbp == ':'); | ||
| 2353 | 2379 | ||
| 2354 | if (L_isdef (dbp)) | 2380 | if (L_isdef (dbp - 1)) |
| 2355 | { | 2381 | { |
| 2356 | while (!isspace (*dbp)) | 2382 | while (!isspace (*dbp)) |
| 2357 | dbp++; | 2383 | dbp++; |
| @@ -2367,11 +2393,23 @@ L_funcs (fi) | |||
| 2367 | 2393 | ||
| 2368 | int | 2394 | int |
| 2369 | L_isdef (dbp) | 2395 | L_isdef (dbp) |
| 2370 | char *dbp; | 2396 | register char *dbp; |
| 2371 | { | 2397 | { |
| 2372 | return ((dbp[1] == 'D' || dbp[1] == 'd') && | 2398 | return ((dbp[1] == 'd' || dbp[1] == 'D') |
| 2373 | (dbp[2] == 'E' || dbp[2] == 'e') && | 2399 | && (dbp[2] == 'e' || dbp[2] == 'E') |
| 2374 | (dbp[3] == 'F' || dbp[3] == 'f')); | 2400 | && (dbp[3] == 'f' || dbp[3] == 'F')); |
| 2401 | } | ||
| 2402 | |||
| 2403 | int | ||
| 2404 | L_isquote (dbp) | ||
| 2405 | register char *dbp; | ||
| 2406 | { | ||
| 2407 | return ((*(++dbp) == 'q' || *dbp == 'Q') | ||
| 2408 | && (*(++dbp) == 'u' || *dbp == 'U') | ||
| 2409 | && (*(++dbp) == 'o' || *dbp == 'O') | ||
| 2410 | && (*(++dbp) == 't' || *dbp == 'T') | ||
| 2411 | && (*(++dbp) == 'e' || *dbp == 'E') | ||
| 2412 | && isspace(*(++dbp))); | ||
| 2375 | } | 2413 | } |
| 2376 | 2414 | ||
| 2377 | void | 2415 | void |
| @@ -2381,10 +2419,19 @@ L_getit () | |||
| 2381 | char c; | 2419 | char c; |
| 2382 | char nambuf[BUFSIZ]; | 2420 | char nambuf[BUFSIZ]; |
| 2383 | 2421 | ||
| 2384 | if (*dbp == 0) | 2422 | if (*dbp == '\'') /* Skip prefix quote */ |
| 2385 | return; | 2423 | dbp++; |
| 2386 | for (cp = dbp + 1; *cp && *cp != '(' && *cp != ' '; cp++) | 2424 | else if (*dbp == '(' && L_isquote (dbp)) /* Skip "(quote " */ |
| 2425 | { | ||
| 2426 | dbp += 7; | ||
| 2427 | while (isspace(*dbp)) | ||
| 2428 | dbp++; | ||
| 2429 | } | ||
| 2430 | for (cp = dbp /*+1*/; *cp && *cp != '(' && *cp != ' ' && *cp != ')'; cp++) | ||
| 2387 | continue; | 2431 | continue; |
| 2432 | if (cp == dbp) | ||
| 2433 | return; | ||
| 2434 | |||
| 2388 | c = cp[0]; | 2435 | c = cp[0]; |
| 2389 | cp[0] = 0; | 2436 | cp[0] = 0; |
| 2390 | (void) strcpy (nambuf, dbp); | 2437 | (void) strcpy (nambuf, dbp); |