mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-11-22 07:09:54 +00:00
* etags.c (plain_C_entries): new function.
(lowcase): new macro. (tail, Fortran_functions, Pascal_functions): use new macro lowcase. (lang_suffixes): new suffix ".pc" for Pro*C files. (consider_token): don't tag all tokens beginning with DEFUN & Co.. (tail): look for the end of the token when comparing. (takeprec): since now tail behaves differently, use strneq.
This commit is contained in:
parent
d3bea05f1f
commit
79263656b0
@ -105,6 +105,8 @@ extern int errno;
|
|||||||
#define streq(s,t) (strcmp (s, t) == 0)
|
#define streq(s,t) (strcmp (s, t) == 0)
|
||||||
#define strneq(s,t,n) (strncmp (s, t, n) == 0)
|
#define strneq(s,t,n) (strncmp (s, t, n) == 0)
|
||||||
|
|
||||||
|
#define lowcase(c) ((c) | ' ')
|
||||||
|
|
||||||
#define iswhite(arg) (_wht[arg]) /* T if char is white */
|
#define iswhite(arg) (_wht[arg]) /* T if char is white */
|
||||||
#define begtoken(arg) (_btk[arg]) /* T if char can start token */
|
#define begtoken(arg) (_btk[arg]) /* T if char can start token */
|
||||||
#define intoken(arg) (_itk[arg]) /* T if char can be in token */
|
#define intoken(arg) (_itk[arg]) /* T if char can be in token */
|
||||||
@ -165,8 +167,9 @@ Lang_function TeX_functions;
|
|||||||
Lang_function just_read_file;
|
Lang_function just_read_file;
|
||||||
#else /* so let's write it this way */
|
#else /* so let's write it this way */
|
||||||
void Asm_labels ();
|
void Asm_labels ();
|
||||||
void default_C_entries ();
|
|
||||||
void C_entries ();
|
void C_entries ();
|
||||||
|
void default_C_entries ();
|
||||||
|
void plain_C_entries ();
|
||||||
void Cplusplus_entries ();
|
void Cplusplus_entries ();
|
||||||
void Cstar_entries ();
|
void Cstar_entries ();
|
||||||
void Fortran_functions ();
|
void Fortran_functions ();
|
||||||
@ -309,7 +312,7 @@ struct pattern *patterns = NULL;
|
|||||||
/* Language stuff. */
|
/* Language stuff. */
|
||||||
struct lang_entry
|
struct lang_entry
|
||||||
{
|
{
|
||||||
char *extension;
|
char *suffix;
|
||||||
Lang_function *function;
|
Lang_function *function;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -333,8 +336,8 @@ struct lang_entry lang_names[] =
|
|||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Table of file extensions and corresponding language functions. */
|
/* Table of file name suffixes and corresponding language functions. */
|
||||||
struct lang_entry lang_extensions[] =
|
struct lang_entry lang_suffixes[] =
|
||||||
{
|
{
|
||||||
/* Assume that ".s" or ".a" is assembly code. -wolfgang.
|
/* Assume that ".s" or ".a" is assembly code. -wolfgang.
|
||||||
Or even ".sa". */
|
Or even ".sa". */
|
||||||
@ -375,11 +378,14 @@ struct lang_entry lang_extensions[] =
|
|||||||
{ "t", Scheme_functions },
|
{ "t", Scheme_functions },
|
||||||
/* FIXME Can't do the `SCM' or `scm' prefix with a version number */
|
/* FIXME Can't do the `SCM' or `scm' prefix with a version number */
|
||||||
|
|
||||||
/* Note that ".c" and ".h" can be considered C++, if the --c++
|
/* Note that .c and .h can be considered C++, if the --c++ flag was
|
||||||
flag was given. That is why default_C_entries is called here. */
|
given. That is why default_C_entries is called here. */
|
||||||
{ "c", default_C_entries },
|
{ "c", default_C_entries },
|
||||||
{ "h", default_C_entries },
|
{ "h", default_C_entries },
|
||||||
|
|
||||||
|
/* .pc is a Pro*C file. */
|
||||||
|
{ "pc", plain_C_entries },
|
||||||
|
|
||||||
/* .C or .H or .c++ or .cc or .cpp or .cxx or .h++ or .hh or .hxx:
|
/* .C or .H or .c++ or .cc or .cpp or .cxx or .h++ or .hh or .hxx:
|
||||||
a C++ file */
|
a C++ file */
|
||||||
{ "C", Cplusplus_entries },
|
{ "C", Cplusplus_entries },
|
||||||
@ -424,18 +430,18 @@ print_language_names ()
|
|||||||
struct lang_entry *name, *ext;
|
struct lang_entry *name, *ext;
|
||||||
|
|
||||||
puts ("\nThese are the currently supported languages, along with the\n\
|
puts ("\nThese are the currently supported languages, along with the\n\
|
||||||
default extensions for files:");
|
default file name suffixes:");
|
||||||
for (name = lang_names; name->extension; ++name)
|
for (name = lang_names; name->suffix; ++name)
|
||||||
{
|
{
|
||||||
printf ("\t%s\t", name->extension);
|
printf ("\t%s\t", name->suffix);
|
||||||
for (ext = lang_extensions; ext->extension; ++ext)
|
for (ext = lang_suffixes; ext->suffix; ++ext)
|
||||||
if (name->function == ext->function)
|
if (name->function == ext->function)
|
||||||
printf (" .%s", ext->extension);
|
printf (" .%s", ext->suffix);
|
||||||
puts ("");
|
puts ("");
|
||||||
}
|
}
|
||||||
puts ("Where `auto' means use default language for files based on filename\n\
|
puts ("Where `auto' means use default language for files based on file\n\
|
||||||
extension, and `none' means only do regexp processing on files.\n\
|
name suffix, and `none' means only do regexp processing on files.\n\
|
||||||
If no language is specified and no extension is found for some file,\n\
|
If no language is specified and no matching suffix is found,\n\
|
||||||
Fortran is tried first; if no tags are found, C is tried next.");
|
Fortran is tried first; if no tags are found, C is tried next.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -467,7 +473,7 @@ names from stdin.\n\n", progname);
|
|||||||
backward-search command instead of '/', the forward-search command.");
|
backward-search command instead of '/', the forward-search command.");
|
||||||
|
|
||||||
puts ("-C, --c++\n\
|
puts ("-C, --c++\n\
|
||||||
Treat files whose extension defaults to C language as C++ files.");
|
Treat files whose name suffix defaults to C language as C++ files.");
|
||||||
|
|
||||||
if (CTAGS)
|
if (CTAGS)
|
||||||
puts ("-d, --defines\n\
|
puts ("-d, --defines\n\
|
||||||
@ -994,9 +1000,9 @@ get_language (language, func)
|
|||||||
{
|
{
|
||||||
struct lang_entry *lang;
|
struct lang_entry *lang;
|
||||||
|
|
||||||
for (lang = lang_names; lang->extension; ++lang)
|
for (lang = lang_names; lang->suffix; ++lang)
|
||||||
{
|
{
|
||||||
if (streq (language, lang->extension))
|
if (streq (language, lang->suffix))
|
||||||
{
|
{
|
||||||
*func = lang->function;
|
*func = lang->function;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -1117,9 +1123,9 @@ find_entries (file, inf)
|
|||||||
if (cp)
|
if (cp)
|
||||||
{
|
{
|
||||||
++cp;
|
++cp;
|
||||||
for (lang = lang_extensions; lang->extension; ++lang)
|
for (lang = lang_suffixes; lang->suffix; ++lang)
|
||||||
{
|
{
|
||||||
if (streq (cp, lang->extension))
|
if (streq (cp, lang->suffix))
|
||||||
{
|
{
|
||||||
lang->function (inf);
|
lang->function (inf);
|
||||||
fclose (inf);
|
fclose (inf);
|
||||||
@ -1774,16 +1780,16 @@ consider_token (str, len, c, c_ext, cblev, is_func)
|
|||||||
|
|
||||||
/* Detect GNU macros. */
|
/* Detect GNU macros. */
|
||||||
if (definedef == dnone)
|
if (definedef == dnone)
|
||||||
if (strneq (str, "DEFUN", 5) /* Used in emacs */
|
if (strneq (str, "DEFUN", len) /* Used in emacs */
|
||||||
#if FALSE
|
#if FALSE
|
||||||
These are defined inside C functions, so currently they
|
These are defined inside C functions, so currently they
|
||||||
are not met anyway.
|
are not met anyway.
|
||||||
|| strneq (str, "EXFUN", 5) /* Used in glibc */
|
|| strneq (str, "EXFUN", len) /* Used in glibc */
|
||||||
|| strneq (str, "DEFVAR_", 7) /* Used in emacs */
|
|| strneq (str, "DEFVAR_", 7) /* Used in emacs */
|
||||||
#endif
|
#endif
|
||||||
|| strneq (str, "SYSCALL", 7) /* Used in glibc (mach) */
|
|| strneq (str, "SYSCALL", len) /* Used in glibc (mach) */
|
||||||
|| strneq (str, "ENTRY", 5) /* Used in glibc */
|
|| strneq (str, "ENTRY", len) /* Used in glibc */
|
||||||
|| strneq (str, "PSEUDO", 6)) /* Used in glibc */
|
|| strneq (str, "PSEUDO", len)) /* Used in glibc */
|
||||||
|
|
||||||
{
|
{
|
||||||
next_token_is_func = TRUE;
|
next_token_is_func = TRUE;
|
||||||
@ -2376,6 +2382,14 @@ default_C_entries (inf)
|
|||||||
C_entries (cplusplus ? C_PLPL : 0, inf);
|
C_entries (cplusplus ? C_PLPL : 0, inf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Always do plain ANSI C. */
|
||||||
|
void
|
||||||
|
plain_C_entries (inf)
|
||||||
|
FILE *inf;
|
||||||
|
{
|
||||||
|
C_entries (0, inf);
|
||||||
|
}
|
||||||
|
|
||||||
/* Always do C++. */
|
/* Always do C++. */
|
||||||
void
|
void
|
||||||
Cplusplus_entries (inf)
|
Cplusplus_entries (inf)
|
||||||
@ -2410,9 +2424,9 @@ tail (cp)
|
|||||||
{
|
{
|
||||||
register int len = 0;
|
register int len = 0;
|
||||||
|
|
||||||
while (*cp && (*cp | ' ') == (dbp[len] | ' '))
|
while (*cp && lowcase(*cp) == lowcase(dbp[len]))
|
||||||
cp++, len++;
|
cp++, len++;
|
||||||
if (*cp == 0)
|
if (*cp == 0 && !intoken(dbp[len]))
|
||||||
{
|
{
|
||||||
dbp += len;
|
dbp += len;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -2430,8 +2444,11 @@ takeprec ()
|
|||||||
dbp++;
|
dbp++;
|
||||||
while (isspace (*dbp))
|
while (isspace (*dbp))
|
||||||
dbp++;
|
dbp++;
|
||||||
if (tail ("(*)"))
|
if (strneq (dbp, "(*)", 3))
|
||||||
return;
|
{
|
||||||
|
dbp += 3;
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!isdigit (*dbp))
|
if (!isdigit (*dbp))
|
||||||
{
|
{
|
||||||
--dbp; /* force failure */
|
--dbp; /* force failure */
|
||||||
@ -2494,7 +2511,7 @@ Fortran_functions (inf)
|
|||||||
dbp++;
|
dbp++;
|
||||||
if (*dbp == 0)
|
if (*dbp == 0)
|
||||||
continue;
|
continue;
|
||||||
switch (*dbp | ' ')
|
switch (lowcase (*dbp))
|
||||||
{
|
{
|
||||||
case 'i':
|
case 'i':
|
||||||
if (tail ("integer"))
|
if (tail ("integer"))
|
||||||
@ -2529,7 +2546,7 @@ Fortran_functions (inf)
|
|||||||
dbp++;
|
dbp++;
|
||||||
if (*dbp == 0)
|
if (*dbp == 0)
|
||||||
continue;
|
continue;
|
||||||
switch (*dbp | ' ')
|
switch (lowcase (*dbp))
|
||||||
{
|
{
|
||||||
case 'f':
|
case 'f':
|
||||||
if (tail ("function"))
|
if (tail ("function"))
|
||||||
@ -2762,7 +2779,7 @@ Pascal_functions (inf)
|
|||||||
else if (!incomment && !inquote && !found_tag)
|
else if (!incomment && !inquote && !found_tag)
|
||||||
{
|
{
|
||||||
/* check for proc/fn keywords */
|
/* check for proc/fn keywords */
|
||||||
switch (c | ' ')
|
switch (lowcase (c))
|
||||||
{
|
{
|
||||||
case 'p':
|
case 'p':
|
||||||
if (tail ("rocedure")) /* c = 'p', dbp has advanced */
|
if (tail ("rocedure")) /* c = 'p', dbp has advanced */
|
||||||
|
Loading…
Reference in New Issue
Block a user