git: 9f35eb8f96a5 - main - ctags: Recognize __attribute__ in function declarations.

From: Dag-Erling Smørgrav <des_at_FreeBSD.org>
Date: Thu, 25 May 2023 18:16:50 UTC
The branch main has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=9f35eb8f96a55aac92fc0c7d08f4b6ab0ae9bc39

commit 9f35eb8f96a55aac92fc0c7d08f4b6ab0ae9bc39
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2023-05-25 17:07:25 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2023-05-25 18:02:24 +0000

    ctags: Recognize __attribute__ in function declarations.
    
    MFC after:      1 week
    Obtained from:  NetBSD
    Sponsored by:   Klara, Inc.
    Reviewed by:    kevans
    Differential Revision:  https://reviews.freebsd.org/D40264
---
 usr.bin/ctags/C.c | 33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/usr.bin/ctags/C.c b/usr.bin/ctags/C.c
index aca50c67226b..80b6c42a7a5c 100644
--- a/usr.bin/ctags/C.c
+++ b/usr.bin/ctags/C.c
@@ -39,6 +39,7 @@ static char sccsid[] = "@(#)C.c	8.4 (Berkeley) 4/2/94";
 __FBSDID("$FreeBSD$");
 
 #include <limits.h>
+#include <stddef.h>
 #include <stdio.h>
 #include <string.h>
 
@@ -261,6 +262,9 @@ func_entry(void)
 {
 	int	c;			/* current character */
 	int	level = 0;		/* for matching '()' */
+	static char attribute[] = "__attribute__";
+	char	maybe_attribute[sizeof attribute + 1],
+		*anext;
 
 	/*
 	 * Find the end of the assumed function declaration.
@@ -298,10 +302,37 @@ fnd:
 	 * is a token character if it's a function and a non-token
 	 * character if it's a declaration.  Comments don't count...
 	 */
-	for (;;) {
+	for (anext = maybe_attribute;;) {
 		while (GETC(!=, EOF) && iswhite(c))
 			if (c == '\n')
 				SETLINE;
+		if (c == EOF)
+			return NO;
+		/*
+		 * Recognize the gnu __attribute__ extension, which would
+		 * otherwise make the heuristic test DTWT
+		 */
+		if (anext == maybe_attribute) {
+			if (intoken(c)) {
+				*anext++ = c;
+				continue;
+			}
+		} else {
+			if (intoken(c)) {
+				if (anext - maybe_attribute 
+				 < (ptrdiff_t)(sizeof attribute - 1))
+					*anext++ = c;
+				else	break;
+				continue;
+			} else {
+				*anext++ = '\0';
+				if (strcmp(maybe_attribute, attribute) == 0) {
+					(void)ungetc(c, inf);
+					return NO;
+				}
+				break;
+			}
+		}
 		if (intoken(c) || c == '{')
 			break;
 		if (c == '/' && (GETC(==, '*') || c == '/'))