Module Name: src
Committed By: rillig
Date: Fri Oct 8 20:14:52 UTC 2021
Modified Files:
src/tests/usr.bin/indent: token-preprocessing.0.stdout
src/usr.bin/indent: indent.c
Log Message:
indent: fix parsing of preprocessor lines with comments and strings
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 \
src/tests/usr.bin/indent/token-preprocessing.0.stdout
cvs rdiff -u -r1.128 -r1.129 src/usr.bin/indent/indent.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/tests/usr.bin/indent/token-preprocessing.0.stdout
diff -u src/tests/usr.bin/indent/token-preprocessing.0.stdout:1.5 src/tests/usr.bin/indent/token-preprocessing.0.stdout:1.6
--- src/tests/usr.bin/indent/token-preprocessing.0.stdout:1.5 Fri Oct 8 20:04:26 2021
+++ src/tests/usr.bin/indent/token-preprocessing.0.stdout Fri Oct 8 20:14:52 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: token-preprocessing.0.stdout,v 1.5 2021/10/08 20:04:26 rillig Exp $ */
+/* $NetBSD: token-preprocessing.0.stdout,v 1.6 2021/10/08 20:14:52 rillig Exp $ */
/* $FreeBSD$ */
/*-
@@ -49,12 +49,12 @@ int this_is_an_ordinary_line_again;
*/
int d1;
#define confuse_d /*"*/ "/*"
-int d2 ;
+int d2;
#define resolve_d "*/"
int d3;
int s1;
#define confuse_s /*'*/ '/*'
-int s2 ;
+int s2;
#define resolve_s '*/'
int s3;
Index: src/usr.bin/indent/indent.c
diff -u src/usr.bin/indent/indent.c:1.128 src/usr.bin/indent/indent.c:1.129
--- src/usr.bin/indent/indent.c:1.128 Fri Oct 8 19:03:34 2021
+++ src/usr.bin/indent/indent.c Fri Oct 8 20:14:52 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: indent.c,v 1.128 2021/10/08 19:03:34 rillig Exp $ */
+/* $NetBSD: indent.c,v 1.129 2021/10/08 20:14:52 rillig Exp $ */
/*-
* SPDX-License-Identifier: BSD-4-Clause
@@ -43,7 +43,7 @@ static char sccsid[] = "@(#)indent.c 5.1
#include <sys/cdefs.h>
#if defined(__NetBSD__)
-__RCSID("$NetBSD: indent.c,v 1.128 2021/10/08 19:03:34 rillig Exp $");
+__RCSID("$NetBSD: indent.c,v 1.129 2021/10/08 20:14:52 rillig Exp $");
#elif defined(__FreeBSD__)
__FBSDID("$FreeBSD: head/usr.bin/indent/indent.c 340138 2018-11-04 19:24:49Z oshogbo $");
#endif
@@ -1117,45 +1117,48 @@ process_comma(int decl_ind, bool tabs_to
static void
read_preprocessing_line(void)
{
+ enum {
+ PLAIN, STR, CHR, COMM
+ } state;
+
buf_add_char(&lab, '#');
- bool in_comment = false;
+ state = PLAIN;
int com_start = 0, com_end = 0;
- char quote = '\0';
while (is_hspace(*inp.s))
inbuf_skip();
- while (*inp.s != '\n' || (in_comment && !had_eof)) {
+ while (*inp.s != '\n' || (state == COMM && !had_eof)) {
buf_reserve(&lab, 2);
*lab.e++ = inbuf_next();
switch (lab.e[-1]) {
case '\\':
- if (!in_comment)
+ if (state != COMM)
*lab.e++ = inbuf_next();
break;
case '/':
- if (*inp.s == '*' && !in_comment && quote == '\0') {
- in_comment = true;
+ if (*inp.s == '*' && state == PLAIN) {
+ state = COMM;
*lab.e++ = *inp.s++;
com_start = (int)buf_len(&lab) - 2;
}
break;
case '"':
- if (quote == '"')
- quote = '\0';
- else if (quote == '\0')
- quote = '"';
+ if (state == STR)
+ state = PLAIN;
+ else if (state == PLAIN)
+ state = STR;
break;
case '\'':
- if (quote == '\'')
- quote = '\0';
- else if (quote == '\0')
- quote = '\'';
+ if (state == CHR)
+ state = PLAIN;
+ else if (state == PLAIN)
+ state = CHR;
break;
case '*':
- if (*inp.s == '/' && in_comment) {
- in_comment = false;
+ if (*inp.s == '/' && state == COMM) {
+ state = PLAIN;
*lab.e++ = *inp.s++;
com_end = (int)buf_len(&lab);
}