Module Name: src
Committed By: rillig
Date: Sat Aug 12 06:43:16 UTC 2023
Modified Files:
src/usr.bin/xlint/lint1: lex.c
Log Message:
lint: clean up lexing of preprocessing lines
The relation between 'c' and 'cp' was tricky to follow.
No functional change.
To generate a diff of this commit:
cvs rdiff -u -r1.190 -r1.191 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.190 src/usr.bin/xlint/lint1/lex.c:1.191
--- src/usr.bin/xlint/lint1/lex.c:1.190 Tue Aug 1 16:08:58 2023
+++ src/usr.bin/xlint/lint1/lex.c Sat Aug 12 06:43:16 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lex.c,v 1.190 2023/08/01 16:08:58 rillig Exp $ */
+/* $NetBSD: lex.c,v 1.191 2023/08/12 06:43:16 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.190 2023/08/01 16:08:58 rillig Exp $");
+__RCSID("$NetBSD: lex.c,v 1.191 2023/08/12 06:43:16 rillig Exp $");
#endif
#include <ctype.h>
@@ -991,71 +991,72 @@ parse_line_directive_flags(const char *p
}
/*
+ * The first directive of the preprocessed translation unit provides the name
+ * of the C source file as specified at the command line.
+ */
+static void
+set_csrc_pos(void)
+{
+ static bool done;
+
+ if (done)
+ return;
+ done = true;
+ csrc_pos.p_file = curr_pos.p_file;
+ outsrc(transform_filename(curr_pos.p_file, strlen(curr_pos.p_file)));
+}
+
+/*
* Called for preprocessor directives. Currently implemented are:
* # pragma [argument...]
* # lineno
- * # lineno "filename"
- * # lineno "filename" GCC-flag...
+ * # lineno "filename" [GCC-flag...]
*/
void
lex_directive(const char *yytext)
{
- const char *cp, *fn;
- char c, *eptr;
- size_t fnl;
- long ln;
- bool is_begin, is_end, is_system;
+ const char *p = yytext + 1; /* skip '#' */
- static bool first = true;
+ while (*p == ' ' || *p == '\t')
+ p++;
- /* Go to first non-whitespace after # */
- for (cp = yytext + 1; (c = *cp) == ' ' || c == '\t'; cp++)
- continue;
-
- if (!ch_isdigit(c)) {
- if (strncmp(cp, "pragma", 6) == 0 && ch_isspace(cp[6]))
+ if (!ch_isdigit(*p)) {
+ if (strncmp(p, "pragma", 6) == 0 && ch_isspace(p[6]))
return;
- error:
- /* undefined or invalid '#' directive */
- warning(255);
- return;
+ goto error;
}
- ln = strtol(--cp, &eptr, 10);
- if (eptr == cp)
+
+ char *end;
+ long ln = strtol(--p, &end, 10);
+ if (end == p)
goto error;
- if ((c = *(cp = eptr)) != ' ' && c != '\t' && c != '\0')
+ p = end;
+
+ if (*p != ' ' && *p != '\t' && *p != '\0')
goto error;
- while ((c = *cp++) == ' ' || c == '\t')
- continue;
- if (c != '\0') {
- if (c != '"')
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ if (*p != '\0') {
+ if (*p != '"')
goto error;
- fn = cp;
- while ((c = *cp) != '"' && c != '\0')
- cp++;
- if (c != '"')
+ const char *fn = ++p;
+ while (*p != '"' && *p != '\0')
+ p++;
+ if (*p != '"')
goto error;
- if ((fnl = cp++ - fn) > PATH_MAX)
+ size_t fn_len = p++ - fn;
+ if (fn_len > PATH_MAX)
goto error;
- /* empty string means stdin */
- if (fnl == 0) {
+ if (fn_len == 0) {
fn = "{standard input}";
- fnl = 16; /* strlen (fn) */
- }
- curr_pos.p_file = record_filename(fn, fnl);
- /*
- * If this is the first directive, the name is the name
- * of the C source file as specified at the command line.
- * It is written to the output file.
- */
- if (first) {
- csrc_pos.p_file = curr_pos.p_file;
- outsrc(transform_filename(curr_pos.p_file,
- strlen(curr_pos.p_file)));
- first = false;
+ fn_len = strlen(fn);
}
+ curr_pos.p_file = record_filename(fn, fn_len);
+ set_csrc_pos();
- parse_line_directive_flags(cp, &is_begin, &is_end, &is_system);
+ bool is_begin, is_end, is_system;
+ parse_line_directive_flags(p, &is_begin, &is_end, &is_system);
update_location(curr_pos.p_file, (int)ln, is_begin, is_end);
in_system_header = is_system;
}
@@ -1065,6 +1066,11 @@ lex_directive(const char *yytext)
csrc_pos.p_line = (int)ln - 1;
csrc_pos.p_uniq = 0;
}
+ return;
+
+error:
+ /* undefined or invalid '#' directive */
+ warning(255);
}
/* Handle lint comments such as ARGSUSED. */