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);
 	    }

Reply via email to