Module Name:    src
Committed By:   rillig
Date:           Sat Jan 27 15:53:28 UTC 2024

Modified Files:
        src/usr.bin/xlint/lint1: lex.c

Log Message:
lint: split determining the type of an integer constant

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.201 -r1.202 src/usr.bin/xlint/lint1/lex.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/lint1/lex.c
diff -u src/usr.bin/xlint/lint1/lex.c:1.201 src/usr.bin/xlint/lint1/lex.c:1.202
--- src/usr.bin/xlint/lint1/lex.c:1.201	Sat Jan 27 12:14:58 2024
+++ src/usr.bin/xlint/lint1/lex.c	Sat Jan 27 15:53:27 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: lex.c,v 1.201 2024/01/27 12:14:58 rillig Exp $ */
+/* $NetBSD: lex.c,v 1.202 2024/01/27 15:53:27 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: lex.c,v 1.201 2024/01/27 12:14:58 rillig Exp $");
+__RCSID("$NetBSD: lex.c,v 1.202 2024/01/27 15:53:27 rillig Exp $");
 #endif
 
 #include <ctype.h>
@@ -502,6 +502,67 @@ is_unsigned_since_c90(tspec_t typ, uint6
 	return typ == LONG && ui > TARG_LONG_MAX;
 }
 
+static tspec_t
+integer_constant_type(tspec_t typ, uint64_t ui, int base, bool warned)
+{
+	switch (typ) {
+	case INT:
+		if (ui <= TARG_INT_MAX) {
+			/* ok */
+		} else if (ui <= TARG_UINT_MAX && base != 10) {
+			typ = UINT;
+		} else if (ui <= TARG_LONG_MAX) {
+			typ = LONG;
+		} else {
+			typ = ULONG;
+			if (ui > TARG_ULONG_MAX && !warned) {
+				/* integer constant out of range */
+				warning(252);
+			}
+		}
+		if ((typ == UINT || typ == ULONG) && !allow_c90)
+			typ = LONG;
+		break;
+	case UINT:
+		if (ui > TARG_UINT_MAX) {
+			typ = ULONG;
+			if (ui > TARG_ULONG_MAX && !warned) {
+				/* integer constant out of range */
+				warning(252);
+			}
+		}
+		break;
+	case LONG:
+		if (ui > TARG_LONG_MAX && allow_c90) {
+			typ = ULONG;
+			if (ui > TARG_ULONG_MAX && !warned) {
+				/* integer constant out of range */
+				warning(252);
+			}
+		}
+		break;
+	case ULONG:
+		if (ui > TARG_ULONG_MAX && !warned) {
+			/* integer constant out of range */
+			warning(252);
+		}
+		break;
+	case LLONG:
+		if (ui > TARG_LLONG_MAX && allow_c90)
+			typ = ULLONG;
+		break;
+	case ULLONG:
+		if (ui > TARG_ULLONG_MAX && !warned) {
+			/* integer constant out of range */
+			warning(252);
+		}
+		break;
+	default:
+		break;
+	}
+	return typ;
+}
+
 int
 lex_integer_constant(const char *yytext, size_t yyleng, int base)
 {
@@ -543,7 +604,7 @@ lex_integer_constant(const char *yytext,
 		/* suffix 'U' is illegal in traditional C */
 		warning(97);
 	}
-	tspec_t typ = suffix_type[u_suffix][l_suffix];
+	tspec_t ct = suffix_type[u_suffix][l_suffix];
 
 	bool warned = false;
 	errno = 0;
@@ -561,67 +622,13 @@ lex_integer_constant(const char *yytext,
 		query_message(8, (int)len, cp);
 	}
 
-	bool ansiu = is_unsigned_since_c90(typ, ui, base);
-	switch (typ) {
-	case INT:
-		if (ui <= TARG_INT_MAX) {
-			/* ok */
-		} else if (ui <= TARG_UINT_MAX && base != 10) {
-			typ = UINT;
-		} else if (ui <= TARG_LONG_MAX) {
-			typ = LONG;
-		} else {
-			typ = ULONG;
-			if (ui > TARG_ULONG_MAX && !warned) {
-				/* integer constant out of range */
-				warning(252);
-			}
-		}
-		if ((typ == UINT || typ == ULONG) && !allow_c90)
-			typ = LONG;
-		break;
-	case UINT:
-		if (ui > TARG_UINT_MAX) {
-			typ = ULONG;
-			if (ui > TARG_ULONG_MAX && !warned) {
-				/* integer constant out of range */
-				warning(252);
-			}
-		}
-		break;
-	case LONG:
-		if (ui > TARG_LONG_MAX && allow_c90) {
-			typ = ULONG;
-			if (ui > TARG_ULONG_MAX && !warned) {
-				/* integer constant out of range */
-				warning(252);
-			}
-		}
-		break;
-	case ULONG:
-		if (ui > TARG_ULONG_MAX && !warned) {
-			/* integer constant out of range */
-			warning(252);
-		}
-		break;
-	case LLONG:
-		if (ui > TARG_LLONG_MAX && allow_c90)
-			typ = ULLONG;
-		break;
-	case ULLONG:
-		if (ui > TARG_ULLONG_MAX && !warned) {
-			/* integer constant out of range */
-			warning(252);
-		}
-		break;
-	default:
-		break;
-	}
+	bool ansiu = is_unsigned_since_c90(ct, ui, base);
 
-	ui = (uint64_t)convert_integer((int64_t)ui, typ, 0);
+	tspec_t t = integer_constant_type(ct, ui, base, warned);
+	ui = (uint64_t)convert_integer((int64_t)ui, t, 0);
 
 	yylval.y_val = xcalloc(1, sizeof(*yylval.y_val));
-	yylval.y_val->v_tspec = typ;
+	yylval.y_val->v_tspec = t;
 	yylval.y_val->v_unsigned_since_c90 = ansiu;
 	yylval.y_val->u.integer = (int64_t)ui;
 

Reply via email to