Module Name:    src
Committed By:   rillig
Date:           Mon Aug 30 21:35:23 UTC 2021

Modified Files:
        src/usr.bin/xlint/lint2: read.c

Log Message:
lint: extract parse_function_attribute from decldef

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.62 -r1.63 src/usr.bin/xlint/lint2/read.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/xlint/lint2/read.c
diff -u src/usr.bin/xlint/lint2/read.c:1.62 src/usr.bin/xlint/lint2/read.c:1.63
--- src/usr.bin/xlint/lint2/read.c:1.62	Mon Aug 30 20:20:20 2021
+++ src/usr.bin/xlint/lint2/read.c	Mon Aug 30 21:35:23 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: read.c,v 1.62 2021/08/30 20:20:20 rillig Exp $ */
+/* $NetBSD: read.c,v 1.63 2021/08/30 21:35:23 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: read.c,v 1.62 2021/08/30 20:20:20 rillig Exp $");
+__RCSID("$NetBSD: read.c,v 1.63 2021/08/30 21:35:23 rillig Exp $");
 #endif
 
 #include <ctype.h>
@@ -369,6 +369,76 @@ funccall(pos_t *posp, const char *cp)
 		inperr("trailing line data: %s", cp);
 }
 
+static bool
+parse_function_attribute(const char **pp, sym_t *sym, bool *used)
+{
+
+	switch (*(*pp)++) {
+	case 'd':
+		if (sym->s_def != NODECL)
+			inperr("def");
+		sym->s_def = DEF;
+		break;
+	case 'e':
+		if (sym->s_def != NODECL)
+			inperr("decl");
+		sym->s_def = DECL;
+		break;
+	case 'i':
+		if (sym->s_inline)
+			inperr("inline");
+		sym->s_inline = true;
+		break;
+	case 'o':
+		if (sym->s_old_style_function)
+			inperr("osdef");
+		sym->s_old_style_function = true;
+		break;
+	case 'r':
+		if (sym->s_function_has_return_value)
+			inperr("r");
+		sym->s_function_has_return_value = true;
+		break;
+	case 's':
+		if (sym->s_static)
+			inperr("static");
+		sym->s_static = true;
+		break;
+	case 't':
+		if (sym->s_def != NODECL)
+			inperr("tdef");
+		sym->s_def = TDEF;
+		break;
+	case 'u':
+		if (*used)
+			inperr("used");
+		*used = true;
+		break;
+	case 'v':
+		if (sym->s_check_only_first_args)
+			inperr("v");
+		sym->s_check_only_first_args = true;
+		sym->s_check_num_args = parse_short(pp);
+		break;
+	case 'P':
+		if (sym->s_printflike)
+			inperr("P");
+		sym->s_printflike = true;
+		sym->s_printflike_arg = parse_short(pp);
+		break;
+	case 'S':
+		if (sym->s_scanflike)
+			inperr("S");
+		sym->s_scanflike = true;
+		sym->s_scanflike_arg = parse_short(pp);
+		break;
+	default:
+		(*pp)--;
+		return false;
+	}
+	return true;
+}
+
 /*
  * Process a declaration or definition (d-record).
  */
@@ -376,7 +446,7 @@ static void
 decldef(pos_t *posp, const char *cp)
 {
 	sym_t	*symp, sym;
-	char	c, *pos1, *tname;
+	char	*pos1, *tname;
 	bool	used, renamed;
 	hte_t	*hte, *renamehte = NULL;
 	const char *name, *newname;
@@ -387,73 +457,9 @@ decldef(pos_t *posp, const char *cp)
 
 	used = false;
 
-	for (;;) {
-		switch (c = *cp++) {
-		case 'd':
-			if (sym.s_def != NODECL)
-				inperr("def");
-			sym.s_def = DEF;
-			break;
-		case 'e':
-			if (sym.s_def != NODECL)
-				inperr("decl");
-			sym.s_def = DECL;
-			break;
-		case 'i':
-			if (sym.s_inline)
-				inperr("inline");
-			sym.s_inline = true;
-			break;
-		case 'o':
-			if (sym.s_old_style_function)
-				inperr("osdef");
-			sym.s_old_style_function = true;
-			break;
-		case 'r':
-			if (sym.s_function_has_return_value)
-				inperr("r");
-			sym.s_function_has_return_value = true;
-			break;
-		case 's':
-			if (sym.s_static)
-				inperr("static");
-			sym.s_static = true;
-			break;
-		case 't':
-			if (sym.s_def != NODECL)
-				inperr("tdef");
-			sym.s_def = TDEF;
-			break;
-		case 'u':
-			if (used)
-				inperr("used");
-			used = true;
-			break;
-		case 'v':
-			if (sym.s_check_only_first_args)
-				inperr("v");
-			sym.s_check_only_first_args = true;
-			sym.s_check_num_args = parse_short(&cp);
-			break;
-		case 'P':
-			if (sym.s_printflike)
-				inperr("P");
-			sym.s_printflike = true;
-			sym.s_printflike_arg = parse_short(&cp);
-			break;
-		case 'S':
-			if (sym.s_scanflike)
-				inperr("S");
-			sym.s_scanflike = true;
-			sym.s_scanflike_arg = parse_short(&cp);
-			break;
-		default:
-			cp--;
-			goto done_function_attributes;
-		}
-	}
+	while (parse_function_attribute(&cp, &sym, &used))
+		continue;
 
-done_function_attributes:
 	/* read symbol name, doing renaming if necessary */
 	name = inpname(cp, &cp);
 	renamed = false;

Reply via email to