summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib-src/etags.c179
1 files changed, 92 insertions, 87 deletions
diff --git a/lib-src/etags.c b/lib-src/etags.c
index 92a07c675bd..1e4875305a7 100644
--- a/lib-src/etags.c
+++ b/lib-src/etags.c
@@ -133,7 +133,6 @@ typedef struct nd_st
char *name; /* function or type name */
char *file; /* file name */
logical is_func; /* use pattern or line no */
- logical named; /* list name separately */
logical been_warned; /* set if noticed dup */
int lno; /* line number tag is on */
long cno; /* character number line starts on */
@@ -1109,6 +1108,7 @@ find_entries (file, inf)
NODE *old_last_node;
extern NODE *last_node;
+ /* The memory block pointed by curfile is never released for simplicity. */
curfile = savestr (file);
cp = etags_strrchr (file, '.');
@@ -1149,33 +1149,27 @@ find_entries (file, inf)
/* Record a tag. */
void
-pfnote (name, is_func, named, linestart, linelen, lno, cno)
- char *name; /* tag name */
+pfnote (name, is_func, linestart, linelen, lno, cno)
+ char *name; /* tag name, if different from definition */
logical is_func; /* tag is a function */
- logical named; /* tag different from text of definition */
char *linestart; /* start of the line where tag is */
int linelen; /* length of the line where tag is */
int lno; /* line number */
long cno; /* character number */
{
register NODE *np = xnew (1, NODE);
- register char *fp;
/* If ctags mode, change name "main" to M<thisfilename>. */
if (CTAGS && !cxref_style && streq (name, "main"))
{
- fp = etags_strrchr (curfile, '/');
+ register char *fp = etags_strrchr (curfile, '/');
np->name = concat ("M", fp == 0 ? curfile : fp + 1, "");
fp = etags_strrchr (np->name, '.');
if (fp && fp[1] != '\0' && fp[2] == '\0')
fp[0] = 0;
- np->named = TRUE;
}
else
- {
- np->name = name;
- np->named = named;
- }
+ np->name = name;
np->been_warned = FALSE;
np->file = curfile;
np->is_func = is_func;
@@ -1204,7 +1198,7 @@ free_tree (node)
{
register NODE *node_right = node->right;
free_tree (node->left);
- if (node->named)
+ if (node->name != NULL)
free (node->name);
free (node->pat);
free ((char *) node);
@@ -1255,7 +1249,7 @@ add_node (node, cur_node_p)
*/
if (!dif)
{
- if (node->file == cur_node->file)
+ if (streq (node->file, cur_node->file))
{
if (!no_warnings)
{
@@ -1304,18 +1298,12 @@ put_entries (node)
if (!CTAGS)
{
- if (node->named)
- {
- fprintf (tagf, "%s\177%s\001%d,%d\n",
- node->pat, node->name,
- node->lno, node->cno);
- }
+ if (node->name != NULL)
+ fprintf (tagf, "%s\177%s\001%d,%d\n",
+ node->pat, node->name, node->lno, node->cno);
else
- {
- fprintf (tagf, "%s\177%d,%d\n",
- node->pat,
- node->lno, node->cno);
- }
+ fprintf (tagf, "%s\177%d,%d\n",
+ node->pat, node->lno, node->cno);
}
else if (!cxref_style)
{
@@ -1390,7 +1378,7 @@ total_size_of_entries (node)
/* Count this entry */
total += strlen (node->pat) + 1;
total += number_len ((long) node->lno) + 1 + number_len (node->cno) + 1;
- if (node->named)
+ if (node->name != NULL)
total += 1 + strlen (node->name); /* \001name */
}
@@ -1873,8 +1861,12 @@ do { \
#define make_tag(isfun) do \
{ \
if (tok.valid) \
- pfnote (savestr (token_name.buffer), isfun, tok.named, \
- tok.buffer, tok.linelen, tok.lineno, tok.linepos); \
+ { \
+ char *name = NULL; \
+ if (tok.named) \
+ name = savestr (token_name.buffer); \
+ pfnote (name, isfun, tok.buffer, tok.linelen, tok.lineno, tok.linepos); \
+ } \
else if (DEBUG) abort (); \
tok.valid = FALSE; \
} while (0)
@@ -2341,10 +2333,9 @@ C_entries (c_ext, inf)
{
if (typdef == tinbody)
typdef = tend;
-#if FALSE /* too risky */
- if (structdef == sinbody)
- free (structtag);
-#endif
+ if (FALSE) /* too risky */
+ if (structdef == sinbody)
+ free (structtag);
structdef = snone;
structtag = "<error>";
@@ -2426,7 +2417,7 @@ tail (cp)
while (*cp && lowcase(*cp) == lowcase(dbp[len]))
cp++, len++;
- if (*cp == 0 && !intoken(dbp[len]))
+ if (*cp == '\0' && !intoken(dbp[len]))
{
dbp += len;
return TRUE;
@@ -2488,8 +2479,7 @@ getit (inf)
&& (isalpha (*cp) || isdigit (*cp) || (*cp == '_') || (*cp == '$')));
cp++)
continue;
- pfnote (savenstr (dbp, cp-dbp), TRUE, FALSE, lb.buffer,
- cp - lb.buffer + 1, lineno, linecharno);
+ pfnote (NULL, TRUE, lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
}
void
@@ -2509,7 +2499,7 @@ Fortran_functions (inf)
dbp++; /* Ratfor escape to fortran */
while (isspace (*dbp))
dbp++;
- if (*dbp == 0)
+ if (*dbp == '\0')
continue;
switch (lowcase (*dbp))
{
@@ -2534,7 +2524,7 @@ Fortran_functions (inf)
{
while (isspace (*dbp))
dbp++;
- if (*dbp == 0)
+ if (*dbp == '\0')
continue;
if (tail ("precision"))
break;
@@ -2544,7 +2534,7 @@ Fortran_functions (inf)
}
while (isspace (*dbp))
dbp++;
- if (*dbp == 0)
+ if (*dbp == '\0')
continue;
switch (lowcase (*dbp))
{
@@ -2605,7 +2595,7 @@ Asm_labels (inf)
if (*cp == ':' || isspace (*cp))
{
/* Found end of label, so copy it and add it to the table. */
- pfnote (savenstr (lb.buffer, cp-lb.buffer), TRUE, FALSE,
+ pfnote (NULL, TRUE,
lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
}
}
@@ -2634,26 +2624,26 @@ Pascal_functions (inf)
{
struct linebuffer tline; /* mostly copied from C_entries */
long save_lcno;
- int save_lineno;
- char c, *cp;
- char *nambuf;
+ int save_lineno, save_len;
+ char c;
logical /* each of these flags is TRUE iff: */
incomment, /* point is inside a comment */
inquote, /* point is inside '..' string */
- get_tagname, /* point is after PROCEDURE/FUNCTION */
- /* keyword, so next item = potential tag */
+ get_tagname, /* point is after PROCEDURE/FUNCTION
+ keyword, so next item = potential tag */
found_tag, /* point is after a potential tag */
inparms, /* point is within parameter-list */
- verify_tag; /* point has passed the parm-list, so the */
- /* next token will determine whether */
- /* this is a FORWARD/EXTERN to be */
- /* ignored, or whether it is a real tag */
+ verify_tag; /* point has passed the parm-list, so the
+ next token will determine whether this
+ is a FORWARD/EXTERN to be ignored, or
+ whether it is a real tag */
lineno = 0;
charno = 0;
dbp = lb.buffer;
- *dbp = 0;
+ *dbp = '\0';
+ save_len = 0;
initbuffer (&tline);
incomment = inquote = FALSE;
@@ -2673,15 +2663,15 @@ Pascal_functions (inf)
continue;
if (!((found_tag && verify_tag) ||
get_tagname))
- c = *dbp++; /* only if don't need *dbp pointing */
- /* to the beginning of the name of */
- /* the procedure or function */
+ c = *dbp++; /* only if don't need *dbp pointing
+ to the beginning of the name of
+ the procedure or function */
}
if (incomment)
{
- if (c == '}') /* within { - } comments */
+ if (c == '}') /* within { } comments */
incomment = FALSE;
- else if (c == '*' && dbp[1] == ')') /* within (* - *) comments */
+ else if (c == '*' && *dbp == ')') /* within (* *) comments */
{
dbp++;
incomment = FALSE;
@@ -2700,11 +2690,11 @@ Pascal_functions (inf)
case '\'':
inquote = TRUE; /* found first quote */
continue;
- case '{': /* found open-{-comment */
+ case '{': /* found open { comment */
incomment = TRUE;
continue;
case '(':
- if (*dbp == '*') /* found open-(*-comment */
+ if (*dbp == '*') /* found open (* comment */
{
incomment = TRUE;
dbp++;
@@ -2717,19 +2707,19 @@ Pascal_functions (inf)
inparms = FALSE;
continue;
case ';':
- if ((found_tag) && (!inparms)) /* end of proc or fn stmt */
+ if (found_tag && !inparms) /* end of proc or fn stmt */
{
verify_tag = TRUE;
break;
}
continue;
}
- if ((found_tag) && (verify_tag) && (*dbp != ' '))
+ if (found_tag && verify_tag && (*dbp != ' '))
{
/* check if this is an "extern" declaration */
- if (*dbp == 0)
+ if (*dbp == '\0')
continue;
- if ((*dbp == 'e') || (*dbp == 'E'))
+ if (lowcase (*dbp == 'e'))
{
if (tail ("extern")) /* superfluous, really! */
{
@@ -2737,7 +2727,7 @@ Pascal_functions (inf)
verify_tag = FALSE;
}
}
- else if ((*dbp == 'f') || (*dbp == 'F'))
+ else if (lowcase (*dbp) == 'f')
{
if (tail ("forward")) /* check for forward reference */
{
@@ -2745,31 +2735,37 @@ Pascal_functions (inf)
verify_tag = FALSE;
}
}
- if ((found_tag) && (verify_tag)) /* not external proc, so make tag */
+ if (found_tag && verify_tag) /* not external proc, so make tag */
{
found_tag = FALSE;
verify_tag = FALSE;
- pfnote (nambuf, TRUE, FALSE, tline.buffer,
- cp - tline.buffer + 1, save_lineno, save_lcno);
+ pfnote (NULL, TRUE,
+ tline.buffer, save_len, save_lineno, save_lcno);
continue;
}
}
if (get_tagname) /* grab name of proc or fn */
{
- if (*dbp == 0)
+ int size;
+
+ if (*dbp == '\0')
continue;
/* save all values for later tagging */
- tline.size = lb.size;
+ size = strlen (lb.buffer) + 1;
+ while (size > tline.size)
+ {
+ tline.size *= 2;
+ tline.buffer = (char *) xrealloc (tline.buffer, tline.size);
+ }
strcpy (tline.buffer, lb.buffer);
save_lineno = lineno;
save_lcno = linecharno;
/* grab block name */
- for (cp = dbp + 1; *cp && (!endtoken (*cp)); cp++)
+ for (dbp++; *dbp && (!endtoken (*dbp)); dbp++)
continue;
- nambuf = savenstr (dbp, cp-dbp);
- dbp = cp; /* restore dbp to e-o-token */
+ save_len = dbp - lb.buffer + 1;
get_tagname = FALSE;
found_tag = TRUE;
continue;
@@ -2792,6 +2788,8 @@ Pascal_functions (inf)
}
}
} /* while not eof */
+
+ free (tline.buffer);
}
/*
@@ -2839,8 +2837,7 @@ L_getit ()
if (cp == dbp)
return;
- pfnote (savenstr (dbp, cp-dbp), TRUE, FALSE, lb.buffer,
- cp - lb.buffer + 1, lineno, linecharno);
+ pfnote (NULL, TRUE, lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
}
void
@@ -2950,15 +2947,14 @@ get_scheme ()
{
register char *cp;
- if (*dbp == 0)
+ if (*dbp == '\0')
return;
/* Go till you get to white space or a syntactic break */
for (cp = dbp + 1;
*cp && *cp != '(' && *cp != ')' && !isspace (*cp);
cp++)
continue;
- pfnote (savenstr (dbp, cp-dbp), TRUE, FALSE,
- lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+ pfnote (NULL, TRUE, lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
}
/* Find tags in TeX and LaTeX input files. */
@@ -2982,8 +2978,10 @@ char *TEX_defenv = "\
void TEX_mode ();
struct TEX_tabent *TEX_decode_env ();
-void TEX_getit ();
int TEX_Token ();
+#if TeX_named_tokens
+void TEX_getit ();
+#endif
char TEX_esc = '\\';
char TEX_opgrp = '{';
@@ -3026,7 +3024,11 @@ TeX_functions (inf)
i = TEX_Token (lasthit);
if (0 <= i)
{
+ pfnote (NULL, TRUE,
+ lb.buffer, strlen (lb.buffer), lineno, linecharno);
+#if TeX_named_tokens
TEX_getit (lasthit, TEX_toktab[i].len);
+#endif
break; /* We only save a line once */
}
}
@@ -3121,6 +3123,7 @@ TEX_decode_env (evarname, defenv)
return tab;
}
+#if TeX_named_tokens
/* Record a tag defined by a TeX command of length LEN and starting at NAME.
The name being defined actually starts at (NAME + LEN + 1).
But we seem to include the TeX command in the tag name. */
@@ -3131,15 +3134,16 @@ TEX_getit (name, len)
{
char *p = name + len;
- if (*name == 0)
+ if (*name == '\0')
return;
/* Let tag name extend to next group close (or end of line) */
while (*p && *p != TEX_clgrp)
p++;
- pfnote (savenstr (name, p-name), TRUE, FALSE, lb.buffer,
- strlen (lb.buffer), lineno, linecharno);
+ pfnote (savenstr (name, p-name), TRUE,
+ lb.buffer, strlen (lb.buffer), lineno, linecharno);
}
+#endif
/* If the text at CP matches one of the tag-defining TeX command names,
return the pointer to the first occurrence of that command in TEX_toktab.
@@ -3208,8 +3212,7 @@ prolog_getit (s)
else
s++;
}
- pfnote (savenstr (save_s, s-save_s), TRUE, FALSE,
- save_s, s-save_s, lineno, linecharno);
+ pfnote (NULL, TRUE, save_s, s-save_s, lineno, linecharno);
}
/* It is assumed that prolog predicate starts from column 0. */
@@ -3538,14 +3541,14 @@ readline (linebuffer, stream)
patterns[i].name_pattern,
&patterns[i].regs);
if (name != NULL)
- pfnote (name, TRUE, TRUE, linebuffer->buffer,
- match, lineno, linecharno);
+ pfnote (name, TRUE,
+ linebuffer->buffer, match, lineno, linecharno);
}
else
{
/* Make an unnamed tag. */
- pfnote (NULL, TRUE, FALSE, linebuffer->buffer,
- match, lineno, linecharno);
+ pfnote (NULL, TRUE,
+ linebuffer->buffer, match, lineno, linecharno);
}
break;
}
@@ -3737,10 +3740,11 @@ char *
relative_filename (file, dir)
char *file, *dir;
{
- char *fp, *dp, *res;
+ char *fp, *dp, *abs, *res;
/* Find the common root of file and dir. */
- fp = absolute_filename (file, cwd);
+ abs = absolute_filename (file, cwd);
+ fp = abs;
dp = dir;
while (*fp++ == *dp++)
continue;
@@ -3761,8 +3765,9 @@ relative_filename (file, dir)
/* Add the filename relative to the common root of file and dir. */
res = concat (res, fp + 1, "");
+ free (abs);
- return res; /* temporary stub */
+ return res;
}
/* Return a newly allocated string containing the
@@ -3856,7 +3861,7 @@ xrealloc (ptr, size)
char *ptr;
unsigned int size;
{
- long *result = (long *) realloc (ptr, size);
+ long *result = (long *) realloc (ptr, size);
if (result == NULL)
fatal ("virtual memory exhausted");
return result;