Sun Mar 14 01:34:13 2021 UTC ()
indent: fix off-by-one error in comment wrapping

The manual page says that the default maximum length of a comment line
is 78.  The test 'comments.0' wrongly assumed that this 78 would refer
to the maximum _column_ allowed, which is off by one.

Fix the wording in the test 'comments.0' and remove the (now satisfied)
expectation comments in the test 'token-comment.0'.

Several other tests just happened to hit that limit, fix these as well.


(rillig)
diff -r1.1 -r1.2 src/tests/usr.bin/indent/comments.0
diff -r1.1 -r1.2 src/tests/usr.bin/indent/comments.0.stdout
diff -r1.1 -r1.2 src/tests/usr.bin/indent/opt-bap+sob.0.stdout
diff -r1.1 -r1.2 src/tests/usr.bin/indent/token-keyword_do_else.0.stdout
diff -r1.2 -r1.3 src/tests/usr.bin/indent/opt-P.0.stdout
diff -r1.2 -r1.3 src/tests/usr.bin/indent/token-comment.0.stdout
diff -r1.31 -r1.32 src/usr.bin/indent/pr_comment.c

cvs diff -r1.1 -r1.2 src/tests/usr.bin/indent/Attic/comments.0 (expand / switch to unified diff)

--- src/tests/usr.bin/indent/Attic/comments.0 2019/04/04 15:27:35 1.1
+++ src/tests/usr.bin/indent/Attic/comments.0 2021/03/14 01:34:13 1.2
@@ -1,33 +1,34 @@ @@ -1,33 +1,34 @@
1/* $NetBSD: comments.0,v 1.1 2019/04/04 15:27:35 kamil Exp $ */ 1/* $NetBSD: comments.0,v 1.2 2021/03/14 01:34:13 rillig Exp $ */
2/* $FreeBSD: head/usr.bin/indent/tests/comments.0 321383 2017-07-23 15:07:52Z pstef $ */ 2/* $FreeBSD: head/usr.bin/indent/tests/comments.0 321383 2017-07-23 15:07:52Z pstef $ */
3typedef enum x { 3typedef enum x {
4 aaaaaaaaaaaaaaaaaaaaaa = 1 << 0, /* test a */ 4 aaaaaaaaaaaaaaaaaaaaaa = 1 << 0, /* test a */
5 bbbbbbbbbbbbbbbbb = 1 << 1, /* test b */ 5 bbbbbbbbbbbbbbbbb = 1 << 1, /* test b */
6 cccccccccccccc = 1 << 1, /* test c */ 6 cccccccccccccc = 1 << 1, /* test c */
7 dddddddddddddddddddddddddddddd = 1 << 2 /* test d */ 7 dddddddddddddddddddddddddddddd = 1 << 2 /* test d */
8} x; 8} x;
9 9
10/* See r303597, r303598, r309219, and r309343 */ 10/* See r303597, r303598, r309219, and r309343 */
11void t(void) { 11void t(void) {
12 /* 12 /*
13 * Old indent wrapped the URL near where this sentence ends. 13 * Old indent wrapped the URL near where this sentence ends.
14 * 14 *
15 * https://www.freebsd.org/cgi/man.cgi?query=indent&apropos=0&sektion=0&manpath=FreeBSD+12-current&arch=default&format=html 15 * https://www.freebsd.org/cgi/man.cgi?query=indent&apropos=0&sektion=0&manpath=FreeBSD+12-current&arch=default&format=html
16 */ 16 */
17  17
18 /* 18 /*
19 * Old indent did not wrap to column 78 19 * The default maximum line length for comments is 78, and the 'kk' at
20 *  20 * the end makes the line exactly 78 bytes long.
 21 *
21 * aaaaaa bbbbbb cccccc dddddd eeeeee ffffff ggggg hhhhh iiiii jjjj kk 22 * aaaaaa bbbbbb cccccc dddddd eeeeee ffffff ggggg hhhhh iiiii jjjj kk
22 */ 23 */
23  24
24 /* 25 /*
25 * Old indent unnecessarily removed the star comment continuation on the next line. 26 * Old indent unnecessarily removed the star comment continuation on the next line.
26 *  27 *
27 * *test* 28 * *test*
28 */ 29 */
29  30
30 /* r309219 Go through linked list, freeing from the malloced (t[-1]) address. */ 31 /* r309219 Go through linked list, freeing from the malloced (t[-1]) address. */
31  32
32 /* r309343 */ 33 /* r309343 */
33} 34}

cvs diff -r1.1 -r1.2 src/tests/usr.bin/indent/Attic/comments.0.stdout (expand / switch to unified diff)

--- src/tests/usr.bin/indent/Attic/comments.0.stdout 2019/04/04 15:27:35 1.1
+++ src/tests/usr.bin/indent/Attic/comments.0.stdout 2021/03/14 01:34:13 1.2
@@ -1,37 +1,37 @@ @@ -1,37 +1,37 @@
1/* $NetBSD: comments.0.stdout,v 1.1 2019/04/04 15:27:35 kamil Exp $ */ 1/* $NetBSD: comments.0.stdout,v 1.2 2021/03/14 01:34:13 rillig Exp $ */
2/* $FreeBSD: head/usr.bin/indent/tests/comments.0.stdout 334563 2018-06-03 15:28:55Z pstef $ */ 2/* $FreeBSD: head/usr.bin/indent/tests/comments.0.stdout 334563 2018-06-03 15:28:55Z pstef $ */
3typedef enum x { 3typedef enum x {
4 aaaaaaaaaaaaaaaaaaaaaa = 1 << 0, /* test a */ 4 aaaaaaaaaaaaaaaaaaaaaa = 1 << 0, /* test a */
5 bbbbbbbbbbbbbbbbb = 1 << 1, /* test b */ 5 bbbbbbbbbbbbbbbbb = 1 << 1, /* test b */
6 cccccccccccccc = 1 << 1, /* test c */ 6 cccccccccccccc = 1 << 1, /* test c */
7 dddddddddddddddddddddddddddddd = 1 << 2 /* test d */ 7 dddddddddddddddddddddddddddddd = 1 << 2 /* test d */
8} x; 8} x;
9 9
10/* See r303597, r303598, r309219, and r309343 */ 10/* See r303597, r303598, r309219, and r309343 */
11void 11void
12t(void) 12t(void)
13{ 13{
14 /* 14 /*
15 * Old indent wrapped the URL near where this sentence ends. 15 * Old indent wrapped the URL near where this sentence ends.
16 * 16 *
17 * https://www.freebsd.org/cgi/man.cgi?query=indent&apropos=0&sektion=0&manpath=FreeBSD+12-current&arch=default&format=html 17 * https://www.freebsd.org/cgi/man.cgi?query=indent&apropos=0&sektion=0&manpath=FreeBSD+12-current&arch=default&format=html
18 */ 18 */
19 19
20 /* 20 /*
21 * Old indent did not wrap to column 78 21 * The default maximum line length for comments is 78, and the 'kk' at
 22 * the end makes the line exactly 78 bytes long.
22 * 23 *
23 * aaaaaa bbbbbb cccccc dddddd eeeeee ffffff ggggg hhhhh iiiii jjjj 24 * aaaaaa bbbbbb cccccc dddddd eeeeee ffffff ggggg hhhhh iiiii jjjj kk
24 * kk 
25 */ 25 */
26 26
27 /* 27 /*
28 * Old indent unnecessarily removed the star comment continuation on 28 * Old indent unnecessarily removed the star comment continuation on
29 * the next line. 29 * the next line.
30 * 30 *
31 * *test* 31 * *test*
32 */ 32 */
33 33
34 /* 34 /*
35 * r309219 Go through linked list, freeing from the malloced (t[-1]) 35 * r309219 Go through linked list, freeing from the malloced (t[-1])
36 * address. 36 * address.
37 */ 37 */

cvs diff -r1.1 -r1.2 src/tests/usr.bin/indent/Attic/opt-bap+sob.0.stdout (expand / switch to unified diff)

--- src/tests/usr.bin/indent/Attic/opt-bap+sob.0.stdout 2021/03/08 22:13:05 1.1
+++ src/tests/usr.bin/indent/Attic/opt-bap+sob.0.stdout 2021/03/14 01:34:13 1.2
@@ -1,20 +1,20 @@ @@ -1,20 +1,20 @@
1/* $NetBSD: opt-bap+sob.0.stdout,v 1.1 2021/03/08 22:13:05 rillig Exp $ */ 1/* $NetBSD: opt-bap+sob.0.stdout,v 1.2 2021/03/14 01:34:13 rillig Exp $ */
2/* $FreeBSD$ */ 2/* $FreeBSD$ */
3 3
4/* 4/*
5 * As of 2021-03-08, the combination of -bap and -sob, which occurs in the 5 * As of 2021-03-08, the combination of -bap and -sob, which occurs in the
6 * example indent.pro from NetBSD, removes the empty line above the 6 * example indent.pro from NetBSD, removes the empty line above the separator.
7 * separator. Seen in games/cgram/cgram.c. 7 * Seen in games/cgram/cgram.c.
8 */ 8 */
9 9
10void 10void
11function1(void) 11function1(void)
12{ 12{
13} 13}
14/* $ FIXME: Keep the empty line between the '}' and the '//'. */ 14/* $ FIXME: Keep the empty line between the '}' and the '//'. */
15///// separator ///// 15///// separator /////
16 16
17void 17void
18function2(void) 18function2(void)
19{ 19{
20} 20}

cvs diff -r1.1 -r1.2 src/tests/usr.bin/indent/Attic/token-keyword_do_else.0.stdout (expand / switch to unified diff)

--- src/tests/usr.bin/indent/Attic/token-keyword_do_else.0.stdout 2021/03/12 00:13:06 1.1
+++ src/tests/usr.bin/indent/Attic/token-keyword_do_else.0.stdout 2021/03/14 01:34:13 1.2
@@ -1,10 +1,10 @@ @@ -1,10 +1,10 @@
1/* $NetBSD: token-keyword_do_else.0.stdout,v 1.1 2021/03/12 00:13:06 rillig Exp $ */ 1/* $NetBSD: token-keyword_do_else.0.stdout,v 1.2 2021/03/14 01:34:13 rillig Exp $ */
2/* $FreeBSD$ */ 2/* $FreeBSD$ */
3 3
4/* 4/*
5 * Tests for the keyword 'do' or 'else'. These two keywords are followed by 5 * Tests for the keyword 'do' or 'else'. These two keywords are followed by a
6 * a space. In contrast to 'for', 'if' and 'while', the space is not 6 * space. In contrast to 'for', 'if' and 'while', the space is not followed
7 * followed by a parenthesized expression. 7 * by a parenthesized expression.
8 */ 8 */
9 9
10/* TODO: Add some code to be formatted. */ 10/* TODO: Add some code to be formatted. */

cvs diff -r1.2 -r1.3 src/tests/usr.bin/indent/Attic/opt-P.0.stdout (expand / switch to unified diff)

--- src/tests/usr.bin/indent/Attic/opt-P.0.stdout 2021/03/07 10:12:18 1.2
+++ src/tests/usr.bin/indent/Attic/opt-P.0.stdout 2021/03/14 01:34:13 1.3
@@ -1,8 +1,7 @@ @@ -1,8 +1,7 @@
1/* $NetBSD: opt-P.0.stdout,v 1.2 2021/03/07 10:12:18 rillig Exp $ */ 1/* $NetBSD: opt-P.0.stdout,v 1.3 2021/03/14 01:34:13 rillig Exp $ */
2/* $FreeBSD$ */ 2/* $FreeBSD$ */
3 3
4/* 4/*
5 * Mentioning another profile via -P has no effect since only a single 5 * Mentioning another profile via -P has no effect since only a single profile
6 * profile can be specified on the command line, and there is no 'include' 6 * can be specified on the command line, and there is no 'include' option.
7 * option. 
8 */ 7 */

cvs diff -r1.2 -r1.3 src/tests/usr.bin/indent/Attic/token-comment.0.stdout (expand / switch to unified diff)

--- src/tests/usr.bin/indent/Attic/token-comment.0.stdout 2021/03/14 00:50:39 1.2
+++ src/tests/usr.bin/indent/Attic/token-comment.0.stdout 2021/03/14 01:34:13 1.3
@@ -1,25 +1,21 @@ @@ -1,25 +1,21 @@
1/* $NetBSD: token-comment.0.stdout,v 1.2 2021/03/14 00:50:39 rillig Exp $ */ 1/* $NetBSD: token-comment.0.stdout,v 1.3 2021/03/14 01:34:13 rillig Exp $ */
2/* $FreeBSD$ */ 2/* $FreeBSD$ */
3 3
4/* 4/*
5 * Tests for formatting comments. C99 defines block comments and end-of-line 5 * Tests for formatting comments. C99 defines block comments and end-of-line
6 * comments. Indent further distinguishes box comments that are a special 6 * comments. Indent further distinguishes box comments that are a special
7 * kind of block comments. 7 * kind of block comments.
8 */ 8 */
9 9
10/* TODO: Add some code to be formatted. */ 10/* TODO: Add some code to be formatted. */
11 11
12/* 456789 123456789 123456789 123456789 123456789 123456789 123456789 12345 */ 12/* 456789 123456789 123456789 123456789 123456789 123456789 123456789 12345 */
13/* 456789 123456789 123456789 123456789 123456789 123456789 123456789 123456 */ 13/* 456789 123456789 123456789 123456789 123456789 123456789 123456789 123456 */
14/* 456789 123456789 123456789 123456789 123456789 123456789 123456789 1234567 */ 14/* 456789 123456789 123456789 123456789 123456789 123456789 123456789 1234567 */
15/* $ XXX: The '12345678' should be kept on the main line since it adds up */ 
16/* $ XXX: to a line length of exactly 78, which according to the manual */ 
17/* $ XXX: page should be ok. */ 
18/* 15/*
19 * 456789 123456789 123456789 123456789 123456789 123456789 123456789 16 * 456789 123456789 123456789 123456789 123456789 123456789 123456789 12345678
20 * 12345678 
21 */ 17 */
22/* 18/*
23 * 456789 123456789 123456789 123456789 123456789 123456789 123456789 19 * 456789 123456789 123456789 123456789 123456789 123456789 123456789
24 * 123456789 20 * 123456789
25 */ 21 */

cvs diff -r1.31 -r1.32 src/usr.bin/indent/pr_comment.c (expand / switch to unified diff)

--- src/usr.bin/indent/pr_comment.c 2021/03/14 00:22:16 1.31
+++ src/usr.bin/indent/pr_comment.c 2021/03/14 01:34:13 1.32
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: pr_comment.c,v 1.31 2021/03/14 00:22:16 rillig Exp $ */ 1/* $NetBSD: pr_comment.c,v 1.32 2021/03/14 01:34:13 rillig Exp $ */
2 2
3/*- 3/*-
4 * SPDX-License-Identifier: BSD-4-Clause 4 * SPDX-License-Identifier: BSD-4-Clause
5 * 5 *
6 * Copyright (c) 1985 Sun Microsystems, Inc. 6 * Copyright (c) 1985 Sun Microsystems, Inc.
7 * Copyright (c) 1980, 1993 7 * Copyright (c) 1980, 1993
8 * The Regents of the University of California. All rights reserved. 8 * The Regents of the University of California. All rights reserved.
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions 12 * modification, are permitted provided that the following conditions
13 * are met: 13 * are met:
14 * 1. Redistributions of source code must retain the above copyright 14 * 1. Redistributions of source code must retain the above copyright
@@ -36,27 +36,27 @@ @@ -36,27 +36,27 @@
36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 * SUCH DAMAGE. 37 * SUCH DAMAGE.
38 */ 38 */
39 39
40#if 0 40#if 0
41#ifndef lint 41#ifndef lint
42static char sccsid[] = "@(#)pr_comment.c 8.1 (Berkeley) 6/6/93"; 42static char sccsid[] = "@(#)pr_comment.c 8.1 (Berkeley) 6/6/93";
43#endif /* not lint */ 43#endif /* not lint */
44#endif 44#endif
45 45
46#include <sys/cdefs.h> 46#include <sys/cdefs.h>
47#ifndef lint 47#ifndef lint
48#if defined(__NetBSD__) 48#if defined(__NetBSD__)
49__RCSID("$NetBSD: pr_comment.c,v 1.31 2021/03/14 00:22:16 rillig Exp $"); 49__RCSID("$NetBSD: pr_comment.c,v 1.32 2021/03/14 01:34:13 rillig Exp $");
50#elif defined(__FreeBSD__) 50#elif defined(__FreeBSD__)
51__FBSDID("$FreeBSD: head/usr.bin/indent/pr_comment.c 334927 2018-06-10 16:44:18Z pstef $"); 51__FBSDID("$FreeBSD: head/usr.bin/indent/pr_comment.c 334927 2018-06-10 16:44:18Z pstef $");
52#endif 52#endif
53#endif 53#endif
54 54
55#include <err.h> 55#include <err.h>
56#include <stdio.h> 56#include <stdio.h>
57#include <stdlib.h> 57#include <stdlib.h>
58#include <string.h> 58#include <string.h>
59 59
60#include "indent.h" 60#include "indent.h"
61 61
62static void 62static void
@@ -190,26 +190,31 @@ process_comment(void) @@ -190,26 +190,31 @@ process_comment(void)
190 *e_com++ = '/'; 190 *e_com++ = '/';
191 *e_com++ = e_token[-1]; 191 *e_com++ = e_token[-1];
192 if (*buf_ptr != ' ' && !ps.box_com) 192 if (*buf_ptr != ' ' && !ps.box_com)
193 *e_com++ = ' '; 193 *e_com++ = ' ';
194 194
195 /* 195 /*
196 * Don't put a break delimiter if this is a one-liner that won't wrap. 196 * Don't put a break delimiter if this is a one-liner that won't wrap.
197 */ 197 */
198 if (break_delim) 198 if (break_delim)
199 for (t_ptr = buf_ptr; *t_ptr != '\0' && *t_ptr != '\n'; t_ptr++) { 199 for (t_ptr = buf_ptr; *t_ptr != '\0' && *t_ptr != '\n'; t_ptr++) {
200 if (t_ptr >= buf_end) 200 if (t_ptr >= buf_end)
201 fill_buffer(); 201 fill_buffer();
202 if (t_ptr[0] == '*' && t_ptr[1] == '/') { 202 if (t_ptr[0] == '*' && t_ptr[1] == '/') {
 203 /*
 204 * XXX: This computation ignores the leading " * ", as well
 205 * as the trailing ' ' '*' '/'. In simple cases, these cancel
 206 * out since they are equally long.
 207 */
203 int right_margin = indentation_after_range(ps.com_col - 1, 208 int right_margin = indentation_after_range(ps.com_col - 1,
204 buf_ptr, t_ptr + 2); 209 buf_ptr, t_ptr + 2);
205 if (right_margin < adj_max_line_length) 210 if (right_margin < adj_max_line_length)
206 break_delim = false; 211 break_delim = false;
207 break; 212 break;
208 } 213 }
209 } 214 }
210 215
211 if (break_delim) { 216 if (break_delim) {
212 char *t = e_com; 217 char *t = e_com;
213 e_com = s_com + 2; 218 e_com = s_com + 2;
214 *e_com = 0; 219 *e_com = 0;
215 if (opt.blanklines_before_blockcomments && ps.last_token != lbrace) 220 if (opt.blanklines_before_blockcomments && ps.last_token != lbrace)
@@ -331,27 +336,27 @@ process_comment(void) @@ -331,27 +336,27 @@ process_comment(void)
331 do { 336 do {
332 check_size_comment(1, &last_bl); 337 check_size_comment(1, &last_bl);
333 *e_com = *buf_ptr++; 338 *e_com = *buf_ptr++;
334 if (buf_ptr >= buf_end) 339 if (buf_ptr >= buf_end)
335 fill_buffer(); 340 fill_buffer();
336 if (*e_com == ' ' || *e_com == '\t') 341 if (*e_com == ' ' || *e_com == '\t')
337 last_bl = e_com; /* remember we saw a blank */ 342 last_bl = e_com; /* remember we saw a blank */
338 ++e_com; 343 ++e_com;
339 now_len++; 344 now_len++;
340 } while (!memchr("*\n\r\b\t", *buf_ptr, 6) && 345 } while (!memchr("*\n\r\b\t", *buf_ptr, 6) &&
341 (now_len < adj_max_line_length || !last_bl)); 346 (now_len < adj_max_line_length || !last_bl));
342 ps.last_nl = false; 347 ps.last_nl = false;
343 /* XXX: signed character comparison '>' does not work for UTF-8 */ 348 /* XXX: signed character comparison '>' does not work for UTF-8 */
344 if (now_len >= adj_max_line_length && 349 if (now_len > adj_max_line_length &&
345 !ps.box_com && e_com[-1] > ' ') { 350 !ps.box_com && e_com[-1] > ' ') {
346 /* 351 /*
347 * the comment is too long, it must be broken up 352 * the comment is too long, it must be broken up
348 */ 353 */
349 if (last_bl == NULL) { 354 if (last_bl == NULL) {
350 dump_line(); 355 dump_line();
351 if (!ps.box_com && opt.star_comment_cont) 356 if (!ps.box_com && opt.star_comment_cont)
352 *e_com++ = ' ', *e_com++ = '*', *e_com++ = ' '; 357 *e_com++ = ' ', *e_com++ = '*', *e_com++ = ' ';
353 break; 358 break;
354 } 359 }
355 *e_com = '\0'; 360 *e_com = '\0';
356 e_com = last_bl; 361 e_com = last_bl;
357 dump_line(); 362 dump_line();