Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/indent indent: fix parsing of preprocessor lines wit...



details:   https://anonhg.NetBSD.org/src/rev/53a8844749af
branches:  trunk
changeset: 1024049:53a8844749af
user:      rillig <rillig%NetBSD.org@localhost>
date:      Fri Oct 08 20:14:52 2021 +0000

description:
indent: fix parsing of preprocessor lines with comments and strings

diffstat:

 tests/usr.bin/indent/token-preprocessing.0.stdout |   6 +-
 usr.bin/indent/indent.c                           |  39 ++++++++++++----------
 2 files changed, 24 insertions(+), 21 deletions(-)

diffs (107 lines):

diff -r f40a6d4815a2 -r 53a8844749af tests/usr.bin/indent/token-preprocessing.0.stdout
--- a/tests/usr.bin/indent/token-preprocessing.0.stdout Fri Oct 08 20:07:44 2021 +0000
+++ b/tests/usr.bin/indent/token-preprocessing.0.stdout Fri Oct 08 20:14:52 2021 +0000
@@ -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            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;
diff -r f40a6d4815a2 -r 53a8844749af usr.bin/indent/indent.c
--- a/usr.bin/indent/indent.c   Fri Oct 08 20:07:44 2021 +0000
+++ b/usr.bin/indent/indent.c   Fri Oct 08 20:14:52 2021 +0000
@@ -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 @@
 
 #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 @@
 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);
            }



Home | Main Index | Thread Index | Old Index