aboutsummaryrefslogtreecommitdiffstats
path: root/lib-src
diff options
context:
space:
mode:
authorFrancesco Potortì1993-09-06 11:39:39 +0000
committerFrancesco Potortì1993-09-06 11:39:39 +0000
commit31d4b31480bbce7bdff82a7da2414598afed9279 (patch)
treef7b64e46fc8a405452bb5265270b3927fcaec6aa /lib-src
parent1817fda04a1b9a20d564e9bd8c93865137bc4e73 (diff)
downloademacs-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.c101
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 ();
157char *savestr (); 159char *savestr ();
158char *xmalloc (); 160char *xmalloc ();
159char *xrealloc (); 161char *xrealloc ();
160int L_isdef (); 162int L_isdef (), L_isquote ();
161int PF_funcs (); 163int PF_funcs ();
162int total_size_of_entries (); 164int total_size_of_entries ();
163logical consider_token (); 165logical 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 */
1339typedef enum 1340typedef 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;
1343FUNCST funcdef; 1348FUNCST funcdef;
1344 1349
@@ -1348,7 +1353,10 @@ FUNCST funcdef;
1348 */ 1353 */
1349typedef enum 1354typedef 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;
1353TYPEDST typdef; 1361TYPEDST 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;
1370STRUCTST structdef; 1378STRUCTST 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;
1388DEFINEST definedef; 1396DEFINEST 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
2368int 2394int
2369L_isdef (dbp) 2395L_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
2403int
2404L_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
2377void 2415void
@@ -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);