1
0
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:
Francesco Potortì 1995-06-27 14:21:23 +00:00
parent d3bea05f1f
commit 79263656b0

View File

@ -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 */