mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-11-30 08:09:04 +00:00
* etags.c [TeX_named_tokens]: Set to FALSE if undefined.
(struct linebuffer): New member `len' is the length of the string. (find_entries, Pascal_functions, TeX_functions, TEX_getit): Use it instead of strlen. (TEX_getit): Declare and define unconditionally as static. (TeX_functions): Use if instead of #if TeX_named_tokens. (add_regex): Set RE_INTERVALS flag for regex compilation. (substitute): Code cleanup. (readline_internal): Code cleanup, set new member `len'. (readline): Bug corrected.
This commit is contained in:
parent
39445e6216
commit
e0903a92ea
171
lib-src/etags.c
171
lib-src/etags.c
@ -31,7 +31,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
* Francesco Potorti` (F.Potorti@cnuce.cnr.it) is the current maintainer.
|
||||
*/
|
||||
|
||||
char pot_etags_version[] = "@(#) pot revision number is $Revision: 11.84 $";
|
||||
char pot_etags_version[] = "@(#) pot revision number is 11.85";
|
||||
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
@ -40,6 +40,10 @@ char pot_etags_version[] = "@(#) pot revision number is $Revision: 11.84 $";
|
||||
# define DEBUG FALSE
|
||||
#endif
|
||||
|
||||
#ifndef TeX_named_tokens
|
||||
# define TeX_named_tokens FALSE
|
||||
#endif
|
||||
|
||||
#ifdef MSDOS
|
||||
# include <string.h>
|
||||
# include <fcntl.h>
|
||||
@ -245,10 +249,13 @@ NODE *head; /* the head of the binary tree of tags */
|
||||
* A `struct linebuffer' is a structure which holds a line of text.
|
||||
* `readline' reads a line from a stream into a linebuffer and works
|
||||
* regardless of the length of the line.
|
||||
* SIZE is the size of BUFFER, LEN is the length of the string in
|
||||
* BUFFER after readline reads it.
|
||||
*/
|
||||
struct linebuffer
|
||||
{
|
||||
long size;
|
||||
int len;
|
||||
char *buffer;
|
||||
};
|
||||
|
||||
@ -1206,7 +1213,8 @@ find_entries (file, inf)
|
||||
}
|
||||
|
||||
/* Look for sharp-bang as the first two characters. */
|
||||
if (readline_internal (&lb, inf) > 2
|
||||
if (readline_internal (&lb, inf)
|
||||
&& lb.len >= 2
|
||||
&& lb.buffer[0] == '#'
|
||||
&& lb.buffer[1] == '!')
|
||||
{
|
||||
@ -3114,7 +3122,7 @@ Pascal_functions (inf)
|
||||
continue;
|
||||
|
||||
/* save all values for later tagging */
|
||||
grow_linebuffer (&tline, strlen (lb.buffer) + 1);
|
||||
grow_linebuffer (&tline, lb.len + 1);
|
||||
strcpy (tline.buffer, lb.buffer);
|
||||
save_lineno = lineno;
|
||||
save_lcno = linecharno;
|
||||
@ -3341,9 +3349,7 @@ char *TEX_defenv = "\
|
||||
void TEX_mode ();
|
||||
struct TEX_tabent *TEX_decode_env ();
|
||||
int TEX_Token ();
|
||||
#if TeX_named_tokens
|
||||
void TEX_getit ();
|
||||
#endif
|
||||
static void TEX_getit ();
|
||||
|
||||
char TEX_esc = '\\';
|
||||
char TEX_opgrp = '{';
|
||||
@ -3387,10 +3393,9 @@ TeX_functions (inf)
|
||||
if (0 <= i)
|
||||
{
|
||||
pfnote ((char *)NULL, TRUE,
|
||||
lb.buffer, strlen (lb.buffer), lineno, linecharno);
|
||||
#if TeX_named_tokens
|
||||
TEX_getit (lasthit, TEX_toktab[i].len);
|
||||
#endif
|
||||
lb.buffer, lb.len, lineno, linecharno);
|
||||
if (TeX_named_tokens)
|
||||
TEX_getit (lasthit, TEX_toktab[i].len);
|
||||
break; /* We only save a line once */
|
||||
}
|
||||
}
|
||||
@ -3485,11 +3490,10 @@ 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. */
|
||||
void
|
||||
static void
|
||||
TEX_getit (name, len)
|
||||
char *name;
|
||||
int len;
|
||||
@ -3503,9 +3507,8 @@ TEX_getit (name, len)
|
||||
while (*p && *p != TEX_clgrp)
|
||||
p++;
|
||||
pfnote (savenstr (name, p-name), TRUE,
|
||||
lb.buffer, strlen (lb.buffer), lineno, linecharno);
|
||||
lb.buffer, lb.len, 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.
|
||||
@ -4015,6 +4018,7 @@ add_regex (regexp_pattern)
|
||||
patbuf->buffer = NULL;
|
||||
patbuf->allocated = 0;
|
||||
|
||||
re_syntax_options = RE_INTERVALS;
|
||||
err = re_compile_pattern (regexp_pattern, strlen (regexp_pattern), patbuf);
|
||||
if (err != NULL)
|
||||
{
|
||||
@ -4044,38 +4048,43 @@ substitute (in, out, regs)
|
||||
struct re_registers *regs;
|
||||
{
|
||||
char *result, *t;
|
||||
int size, i;
|
||||
int size, dig, diglen;
|
||||
|
||||
result = NULL;
|
||||
size = strlen (out);
|
||||
|
||||
/* Pass 1: figure out how much size to allocate. */
|
||||
if (out[strlen (out) - 1] == '\\')
|
||||
fatal ("pattern error in %s", out);
|
||||
for (t = out; *t != '\0'; ++t)
|
||||
if (*t == '\\' && isdigit (*++t))
|
||||
/* Pass 1: figure out how much to allocate by finding all \N strings. */
|
||||
if (out[size - 1] == '\\')
|
||||
fatal ("pattern error in \"%s\"", out);
|
||||
for (t = etags_strchr (out, '\\');
|
||||
t != NULL;
|
||||
t = etags_strchr (t + 2, '\\'))
|
||||
if (isdigit (t[1]))
|
||||
{
|
||||
int dig = *t - '0';
|
||||
size += regs->end[dig] - regs->start[dig] - 2;
|
||||
dig = t[1] - '0';
|
||||
diglen = regs->end[dig] - regs->start[dig];
|
||||
size += diglen - 2;
|
||||
}
|
||||
else
|
||||
size -= 1;
|
||||
|
||||
/* Allocate space and do the substitutions. */
|
||||
result = xnew (size + 1, char);
|
||||
for (i = 0; *out != '\0'; ++out)
|
||||
{
|
||||
if (*out == '\\' && isdigit (*++out))
|
||||
{
|
||||
/* Using "dig2" satisfies my debugger. Bleah. */
|
||||
int dig2 = *out - '0';
|
||||
int diglen = regs->end[dig2] - regs->start[dig2];
|
||||
strncpy (result + i, in + regs->start[dig2], diglen);
|
||||
i += diglen;
|
||||
}
|
||||
else
|
||||
result[i++] = *out;
|
||||
}
|
||||
result[i] = '\0';
|
||||
if (DEBUG && i > size)
|
||||
|
||||
for (t = result; *out != '\0'; out++)
|
||||
if (*out == '\\' && isdigit (*++out))
|
||||
{
|
||||
/* Using "dig2" satisfies my debugger. Bleah. */
|
||||
dig = *out - '0';
|
||||
diglen = regs->end[dig] - regs->start[dig];
|
||||
strncpy (t, in + regs->start[dig], diglen);
|
||||
t += diglen;
|
||||
}
|
||||
else
|
||||
*t++ = *out;
|
||||
*t = '\0';
|
||||
|
||||
if (DEBUG && (t > result + size || t - result != strlen (result)))
|
||||
abort ();
|
||||
|
||||
return result;
|
||||
@ -4129,7 +4138,7 @@ readline_internal (linebuffer, stream)
|
||||
{
|
||||
if (p > buffer && p[-1] == '\r')
|
||||
{
|
||||
*--p = '\0';
|
||||
p -= 1;
|
||||
#ifdef DOS_NT
|
||||
/* Assume CRLF->LF translation will be performed by Emacs
|
||||
when loading this file, so CRs won't appear in the buffer.
|
||||
@ -4143,20 +4152,21 @@ readline_internal (linebuffer, stream)
|
||||
}
|
||||
else
|
||||
{
|
||||
*p = '\0';
|
||||
chars_deleted = 1;
|
||||
}
|
||||
*p = '\0';
|
||||
break;
|
||||
}
|
||||
*p++ = c;
|
||||
}
|
||||
linebuffer->len = p - buffer;
|
||||
|
||||
return p - buffer + chars_deleted;
|
||||
return linebuffer->len + chars_deleted;
|
||||
}
|
||||
|
||||
/*
|
||||
* Like readline_internal, above, but try to match the input
|
||||
* line against any existing regular expressions.
|
||||
* Like readline_internal, above, but in addition try to match the
|
||||
* input line against any existing regular expressions.
|
||||
*/
|
||||
long
|
||||
readline (linebuffer, stream)
|
||||
@ -4169,46 +4179,47 @@ readline (linebuffer, stream)
|
||||
int i;
|
||||
|
||||
/* Match against all listed patterns. */
|
||||
for (i = 0; i < num_patterns; ++i)
|
||||
{
|
||||
int match = re_match (patterns[i].pattern, linebuffer->buffer,
|
||||
(int)result, 0, &patterns[i].regs);
|
||||
switch (match)
|
||||
{
|
||||
case -2:
|
||||
/* Some error. */
|
||||
if (!patterns[i].error_signaled)
|
||||
{
|
||||
error ("error while matching pattern %d", i);
|
||||
patterns[i].error_signaled = TRUE;
|
||||
}
|
||||
break;
|
||||
case -1:
|
||||
/* No match. */
|
||||
break;
|
||||
default:
|
||||
/* Match occurred. Construct a tag. */
|
||||
if (patterns[i].name_pattern[0] != '\0')
|
||||
{
|
||||
/* Make a named tag. */
|
||||
char *name = substitute (linebuffer->buffer,
|
||||
patterns[i].name_pattern,
|
||||
&patterns[i].regs);
|
||||
if (name != NULL)
|
||||
pfnote (name, TRUE,
|
||||
if (linebuffer->len > 0)
|
||||
for (i = 0; i < num_patterns; ++i)
|
||||
{
|
||||
int match = re_match (patterns[i].pattern, linebuffer->buffer,
|
||||
linebuffer->len, 0, &patterns[i].regs);
|
||||
switch (match)
|
||||
{
|
||||
case -2:
|
||||
/* Some error. */
|
||||
if (!patterns[i].error_signaled)
|
||||
{
|
||||
error ("error while matching pattern %d", i);
|
||||
patterns[i].error_signaled = TRUE;
|
||||
}
|
||||
break;
|
||||
case -1:
|
||||
/* No match. */
|
||||
break;
|
||||
default:
|
||||
/* Match occurred. Construct a tag. */
|
||||
if (patterns[i].name_pattern[0] != '\0')
|
||||
{
|
||||
/* Make a named tag. */
|
||||
char *name = substitute (linebuffer->buffer,
|
||||
patterns[i].name_pattern,
|
||||
&patterns[i].regs);
|
||||
if (name != NULL)
|
||||
pfnote (name, TRUE,
|
||||
linebuffer->buffer, match, lineno, linecharno);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Make an unnamed tag. */
|
||||
pfnote ((char *)NULL, TRUE,
|
||||
linebuffer->buffer, match, lineno, linecharno);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Make an unnamed tag. */
|
||||
pfnote ((char *)NULL, TRUE,
|
||||
linebuffer->buffer, match, lineno, linecharno);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif /* ETAGS_REGEXPS */
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user