Module Name: src Committed By: rillig Date: Tue Jun 6 06:51:44 UTC 2023
Modified Files: src/usr.bin/indent: pr_comment.c Log Message: indent: split printing of comments into smaller functions No functional change. To generate a diff of this commit: cvs rdiff -u -r1.151 -r1.152 src/usr.bin/indent/pr_comment.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/indent/pr_comment.c diff -u src/usr.bin/indent/pr_comment.c:1.151 src/usr.bin/indent/pr_comment.c:1.152 --- src/usr.bin/indent/pr_comment.c:1.151 Sun Jun 4 20:51:19 2023 +++ src/usr.bin/indent/pr_comment.c Tue Jun 6 06:51:44 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: pr_comment.c,v 1.151 2023/06/04 20:51:19 rillig Exp $ */ +/* $NetBSD: pr_comment.c,v 1.152 2023/06/06 06:51:44 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: pr_comment.c,v 1.151 2023/06/04 20:51:19 rillig Exp $"); +__RCSID("$NetBSD: pr_comment.c,v 1.152 2023/06/06 06:51:44 rillig Exp $"); #include <string.h> @@ -73,7 +73,8 @@ fits_in_one_line(int com_ind, int max_li } static void -analyze_comment(bool *p_may_wrap, bool *p_delim, int *p_line_length) +analyze_comment(bool *p_may_wrap, bool *p_delim, + int *p_ind, int *p_line_length) { bool may_wrap = true; bool delim = opt.comment_delimiter_on_blankline; @@ -134,6 +135,15 @@ analyze_comment(bool *p_may_wrap, bool * inp_p++; } + *p_may_wrap = may_wrap; + *p_delim = delim; + *p_ind = ind; + *p_line_length = line_length; +} + +static void +copy_comment_start(bool may_wrap, bool *delim, int ind, int line_length) +{ ps.comment_delta = 0; com_add_char('/'); com_add_char(token.s[token.len - 1]); /* either '*' or '/' */ @@ -141,152 +151,152 @@ analyze_comment(bool *p_may_wrap, bool * if (may_wrap && !ch_isblank(inp_p[0])) com_add_char(' '); - if (delim && fits_in_one_line(ind, line_length)) - delim = false; + if (*delim && fits_in_one_line(ind, line_length)) + *delim = false; - if (delim) { + if (*delim) { output_line(); com_add_delim(); } - - *p_line_length = line_length; - *p_delim = delim; - *p_may_wrap = may_wrap; } -/* - * Copy characters from 'inp' to 'com'. Try to keep comments from going over - * the maximum line length. To do that, remember where the last blank, tab, or - * newline was. When a line is filled, print up to the last blank and continue - * copying. - */ static void -copy_comment_wrap(int line_length, bool delim) +copy_comment_wrap_text(int line_length, ssize_t *last_blank) { - ssize_t last_blank = -1; /* index of the last blank in 'com' */ - + int now_len = ind_add(ps.com_ind, com.s, com.len); for (;;) { - switch (inp_p[0]) { - case '\n': - if (had_eof) { - diag(1, "Unterminated comment"); - output_line(); - return; - } - - last_blank = -1; - if (ps.next_col_1) { - if (com.len == 0) { - /* force empty line of output */ - com_add_char(' '); - } - if (com.len > 3) { - output_line(); - com_add_delim(); - } - output_line(); - com_add_delim(); + char ch = inp_next(); + if (ch_isblank(ch)) + *last_blank = (ssize_t)com.len; + com_add_char(ch); + now_len++; + if (memchr("*\n\r\b\t", inp_p[0], 6) != NULL) + break; + if (now_len >= line_length && *last_blank != -1) + break; + } - } else { - ps.next_col_1 = true; - if (!(com.len > 0 - && ch_isblank(com.s[com.len - 1]))) - com_add_char(' '); - last_blank = (int)com.len - 1; - } - ++line_no; + ps.next_col_1 = false; - bool skip_asterisk = true; - do { /* flush any blanks and/or tabs at start of - * next line */ - inp_skip(); - if (inp_p[0] == '*' && skip_asterisk) { - skip_asterisk = false; - inp_p++; - if (inp_p[0] == '/') - goto end_of_comment; - } - } while (ch_isblank(inp_p[0])); + if (now_len <= line_length) + return; + if (ch_isspace(com.s[com.len - 1])) + return; - break; /* end of case for newline */ + if (*last_blank == -1) { + /* only a single word in this line */ + output_line(); + com_add_delim(); + return; + } - case '*': - inp_p++; - if (inp_p[0] == '/') { - end_of_comment: - inp_p++; + const char *last_word_s = com.s + *last_blank + 1; + size_t last_word_len = com.len - (size_t)(*last_blank + 1); + com.len = (size_t)*last_blank; + output_line(); + com_add_delim(); + + /* Assume that output_line and com_add_delim don't + * invalidate the "unused" part of the buffer beyond + * com.s + com.len. */ + memmove(com.s + com.len, last_word_s, last_word_len); + com.len += last_word_len; + *last_blank = -1; +} - if (delim) { - if (com.len > 3) - output_line(); - else - com.len = 0; - com_add_char(' '); - } else { - size_t len = com.len; - while (ch_isblank(com.s[len - 1])) - len--; - int now_len = ind_add( - ps.com_ind, com.s, len); - if (now_len + 3 > line_length) - output_line(); - } - - if (!(com.len > 0 - && ch_isblank(com.s[com.len - 1]))) - com_add_char(' '); - com_add_char('*'); - com_add_char('/'); - return; +static bool +copy_comment_wrap_newline(ssize_t *last_blank) +{ + *last_blank = -1; + if (ps.next_col_1) { + if (com.len == 0) + com_add_char(' '); /* force empty output line */ + if (com.len > 3) { + output_line(); + com_add_delim(); + } + output_line(); + com_add_delim(); + } else { + ps.next_col_1 = true; + if (!(com.len > 0 && ch_isblank(com.s[com.len - 1]))) + com_add_char(' '); + *last_blank = (int)com.len - 1; + } + ++line_no; - } else /* handle isolated '*' */ - com_add_char('*'); - break; + /* flush any blanks and/or tabs at start of next line */ + bool skip_asterisk = true; + do { + inp_skip(); + if (inp_p[0] == '*' && skip_asterisk) { + skip_asterisk = false; + inp_p++; + if (inp_p[0] == '/') + return false; + } + } while (ch_isblank(inp_p[0])); - default: - ; - int now_len = ind_add(ps.com_ind, com.s, com.len); - for (;;) { - char ch = inp_next(); - if (ch_isblank(ch)) - last_blank = (ssize_t)com.len; - com_add_char(ch); - now_len++; - if (memchr("*\n\r\b\t", inp_p[0], 6) != NULL) - break; - if (now_len >= line_length && last_blank != -1) - break; - } + return true; +} - ps.next_col_1 = false; +static void +copy_comment_wrap_finish(int line_length, bool delim) +{ + inp_p++; - if (now_len <= line_length) - break; - if (ch_isspace(com.s[com.len - 1])) - break; + if (delim) { + if (com.len > 3) + output_line(); + else + com.len = 0; + com_add_char(' '); + } else { + size_t len = com.len; + while (ch_isblank(com.s[len - 1])) + len--; + int now_len = ind_add(ps.com_ind, com.s, len); + if (now_len + 3 > line_length) + output_line(); + } - if (last_blank == -1) { - /* only a single word in this line */ - output_line(); - com_add_delim(); - break; - } + if (!(com.len > 0 && ch_isblank(com.s[com.len - 1]))) + com_add_char(' '); + com_add_char('*'); + com_add_char('/'); +} - const char *last_word_s = com.s + last_blank + 1; - size_t last_word_len = com.len - - (size_t)(last_blank + 1); - com.len = (size_t)last_blank; - output_line(); - com_add_delim(); +/* + * Copy characters from 'inp' to 'com'. Try to keep comments from going over + * the maximum line length. To do that, remember where the last blank, tab, or + * newline was. When a line is filled, print up to the last blank and continue + * copying. + */ +static void +copy_comment_wrap(int line_length, bool delim) +{ + ssize_t last_blank = -1; /* index of the last blank in 'com' */ - /* Assume that output_line and com_add_delim don't - * invalidate the "unused" part of the buffer beyond - * com.s + com.len. */ - memmove(com.s + com.len, last_word_s, last_word_len); - com.len += last_word_len; - last_blank = -1; - } + for (;;) { + if (inp_p[0] == '\n') { + if (had_eof) + goto unterminated_comment; + if (!copy_comment_wrap_newline(&last_blank)) + goto end_of_comment; + } else if (inp_p[0] == '*' && inp_p[1] == '/') { + inp_p++; + goto end_of_comment; + } else + copy_comment_wrap_text(line_length, &last_blank); } + +end_of_comment: + copy_comment_wrap_finish(line_length, delim); + return; + +unterminated_comment: + diag(1, "Unterminated comment"); + output_line(); } static void @@ -330,10 +340,11 @@ copy_comment_nowrap(void) void process_comment(void) { - int line_length; bool may_wrap, delim; + int ind, line_length; - analyze_comment(&may_wrap, &delim, &line_length); + analyze_comment(&may_wrap, &delim, &ind, &line_length); + copy_comment_start(may_wrap, &delim, ind, line_length); if (may_wrap) copy_comment_wrap(line_length, delim); else