Module Name: src Committed By: rillig Date: Wed Jun 14 10:26:00 UTC 2023
Modified Files: src/tests/usr.bin/indent: lsym_preprocessing.c t_errors.sh src/usr.bin/indent: indent.c Log Message: indent: allow more than 5 levels of #if/#endif To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/tests/usr.bin/indent/lsym_preprocessing.c cvs rdiff -u -r1.35 -r1.36 src/tests/usr.bin/indent/t_errors.sh cvs rdiff -u -r1.359 -r1.360 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/lsym_preprocessing.c diff -u src/tests/usr.bin/indent/lsym_preprocessing.c:1.10 src/tests/usr.bin/indent/lsym_preprocessing.c:1.11 --- src/tests/usr.bin/indent/lsym_preprocessing.c:1.10 Sat May 13 08:33:39 2023 +++ src/tests/usr.bin/indent/lsym_preprocessing.c Wed Jun 14 10:26:00 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: lsym_preprocessing.c,v 1.10 2023/05/13 08:33:39 rillig Exp $ */ +/* $NetBSD: lsym_preprocessing.c,v 1.11 2023/06/14 10:26:00 rillig Exp $ */ /* * Tests for the token lsym_preprocessing, which represents a '#' that starts @@ -256,3 +256,55 @@ int before; #endif int after; //indent end + + +/* + * Before 2023-06-14, indent was limited to 5 levels of conditional compilation + * directives. + */ +//indent input +#if 1 +#if 2 +#if 3 +#if 4 +#if 5 +#if 6 +#endif 6 +#endif 5 +#endif 4 +#endif 3 +#endif 2 +#endif 1 +//indent end + +//indent run-equals-input + + +/* + * Unrecognized and unmatched preprocessing directives are preserved. + */ +//indent input +#else +#elif 0 +#elifdef var +#endif + +#unknown +# 3 "file.c" +//indent end + +//indent run +error: Standard Input:1: Unmatched #else +error: Standard Input:2: Unmatched #elif +// $ TODO: '#elifdef' instead of '#elif' +error: Standard Input:3: Unmatched #elif +error: Standard Input:4: Unmatched #endif +#else +#elif 0 +#elifdef var +#endif + +#unknown +# 3 "file.c" +exit 1 +//indent end Index: src/tests/usr.bin/indent/t_errors.sh diff -u src/tests/usr.bin/indent/t_errors.sh:1.35 src/tests/usr.bin/indent/t_errors.sh:1.36 --- src/tests/usr.bin/indent/t_errors.sh:1.35 Sat Jun 10 17:35:41 2023 +++ src/tests/usr.bin/indent/t_errors.sh Wed Jun 14 10:26:00 2023 @@ -1,5 +1,5 @@ #! /bin/sh -# $NetBSD: t_errors.sh,v 1.35 2023/06/10 17:35:41 rillig Exp $ +# $NetBSD: t_errors.sh,v 1.36 2023/06/14 10:26:00 rillig Exp $ # # Copyright (c) 2021 The NetBSD Foundation, Inc. # All rights reserved. @@ -348,54 +348,6 @@ unexpected_closing_brace_decl_body() cat code.c } -atf_test_case 'preprocessing_overflow' -preprocessing_overflow_body() -{ - cat <<-\EOF > code.c - #if 1 - #if 2 - #if 3 - #if 4 - #if 5 - #if 6 - #endif 6 - #endif 5 - #endif 4 - #endif 3 - #endif 2 - #endif 1 - #endif too much - EOF - cat <<-\EOF > stderr.exp - error: code.c:6: #if stack overflow - error: code.c:12: Unmatched #endif - error: code.c:13: Unmatched #endif - EOF - - atf_check -s 'exit:1' \ - -e 'file:stderr.exp' \ - "$indent" code.c -} - -atf_test_case 'preprocessing_unrecognized' -preprocessing_unrecognized_body() -{ - cat <<-\EOF > code.c - #unknown - # 3 "file.c" - #elif 3 - #else - EOF - cat <<-\EOF > stderr.exp - error: code.c:3: Unmatched #elif - error: code.c:4: Unmatched #else - EOF - - atf_check -s 'exit:1' \ - -e 'file:stderr.exp' \ - "$indent" code.c -} - atf_test_case 'unbalanced_parentheses' unbalanced_parentheses_body() { @@ -544,8 +496,6 @@ atf_init_test_cases() atf_add_test_case 'unexpected_end_of_file' atf_add_test_case 'unexpected_closing_brace_top_level' atf_add_test_case 'unexpected_closing_brace_decl' - atf_add_test_case 'preprocessing_overflow' - atf_add_test_case 'preprocessing_unrecognized' atf_add_test_case 'unbalanced_parentheses' atf_add_test_case 'gcc_statement_expression' atf_add_test_case 'crash_comment_after_controlling_expression' Index: src/usr.bin/indent/indent.c diff -u src/usr.bin/indent/indent.c:1.359 src/usr.bin/indent/indent.c:1.360 --- src/usr.bin/indent/indent.c:1.359 Wed Jun 14 08:36:51 2023 +++ src/usr.bin/indent/indent.c Wed Jun 14 10:26:00 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: indent.c,v 1.359 2023/06/14 08:36:51 rillig Exp $ */ +/* $NetBSD: indent.c,v 1.360 2023/06/14 10:26:00 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: indent.c,v 1.359 2023/06/14 08:36:51 rillig Exp $"); +__RCSID("$NetBSD: indent.c,v 1.360 2023/06/14 10:26:00 rillig Exp $"); #include <sys/param.h> #include <err.h> @@ -82,8 +82,11 @@ bool found_err; bool had_eof; int line_no = 1; -static int ifdef_level; -static struct parser_state state_stack[5]; +static struct { + struct parser_state *item; + size_t len; + size_t cap; +} ifdef; FILE *input; FILE *output; @@ -456,24 +459,26 @@ process_preprocessing(void) dir_len++; if (dir_len >= 2 && memcmp(dir, "if", 2) == 0) { - if ((size_t)ifdef_level < array_length(state_stack)) - state_stack[ifdef_level++] = ps; - else - diag(1, "#if stack overflow"); + if (ifdef.len >= ifdef.cap) { + ifdef.cap += 5; + ifdef.item = nonnull(realloc(ifdef.item, + sizeof(ifdef.item[0]) * ifdef.cap)); + } + ifdef.item[ifdef.len++] = ps; out.line_kind = lk_if; } else if (dir_len >= 2 && memcmp(dir, "el", 2) == 0) { - if (ifdef_level <= 0) + if (ifdef.len == 0) diag(1, dir[2] == 'i' ? "Unmatched #elif" : "Unmatched #else"); else - ps = state_stack[ifdef_level - 1]; + ps = ifdef.item[ifdef.len - 1]; } else if (dir_len == 5 && memcmp(dir, "endif", 5) == 0) { - if (ifdef_level <= 0) + if (ifdef.len == 0) diag(1, "Unmatched #endif"); else - ifdef_level--; + ifdef.len--; out.line_kind = lk_endif; } }