Module Name: src Committed By: rillig Date: Fri Oct 8 17:56:12 UTC 2021
Modified Files: src/usr.bin/indent: io.c Log Message: indent: split dump_line into smaller functions No functional change. To generate a diff of this commit: cvs rdiff -u -r1.85 -r1.86 src/usr.bin/indent/io.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/io.c diff -u src/usr.bin/indent/io.c:1.85 src/usr.bin/indent/io.c:1.86 --- src/usr.bin/indent/io.c:1.85 Fri Oct 8 17:19:49 2021 +++ src/usr.bin/indent/io.c Fri Oct 8 17:56:12 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: io.c,v 1.85 2021/10/08 17:19:49 rillig Exp $ */ +/* $NetBSD: io.c,v 1.86 2021/10/08 17:56:12 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -43,7 +43,7 @@ static char sccsid[] = "@(#)io.c 8.1 (Be #include <sys/cdefs.h> #if defined(__NetBSD__) -__RCSID("$NetBSD: io.c,v 1.85 2021/10/08 17:19:49 rillig Exp $"); +__RCSID("$NetBSD: io.c,v 1.86 2021/10/08 17:56:12 rillig Exp $"); #elif defined(__FreeBSD__) __FBSDID("$FreeBSD: head/usr.bin/indent/io.c 334927 2018-06-10 16:44:18Z pstef $"); #endif @@ -102,15 +102,123 @@ output_indent(int old_ind, int new_ind) return ind; } +static int +dump_line_label(void) +{ + int ind; + + if (comment_open) { + comment_open = false; + output_string(".*/\n"); + } + + while (lab.e > lab.s && is_hspace(lab.e[-1])) + lab.e--; + *lab.e = '\0'; + + ind = output_indent(0, compute_label_indent()); + + if (lab.s[0] == '#' && (strncmp(lab.s, "#else", 5) == 0 + || strncmp(lab.s, "#endif", 6) == 0)) { + const char *s = lab.s; + if (lab.e[-1] == '\n') + lab.e--; + do { + output_char(*s++); + } while (s < lab.e && 'a' <= *s && *s <= 'z'); + + while (s < lab.e && is_hspace(*s)) + s++; + + if (s < lab.e) { + if (s[0] == '/' && s[1] == '*') { + output_char('\t'); + output_range(s, lab.e); + } else { + output_string("\t/* "); + output_range(s, lab.e); + output_string(" */"); + } + } + } else + output_range(lab.s, lab.e); + ind = indentation_after(ind, lab.s); + + ps.is_case_label = false; + return ind; +} + +static int +dump_line_code(int ind) +{ + if (comment_open) { + comment_open = false; + output_string(".*/\n"); + } + + int target_ind = compute_code_indent(); + for (int i = 0; i < ps.p_l_follow; i++) { + if (ps.paren_indents[i] >= 0) { + int paren_ind = ps.paren_indents[i]; + /* XXX: the '+ 1' smells like an off-by-one error. */ + ps.paren_indents[i] = (short)-(paren_ind + target_ind + 1); + debug_println( + "setting pi[%d] from %d to %d for column %d", + i, paren_ind, ps.paren_indents[i], target_ind + 1); + } + } + + ind = output_indent(ind, target_ind); + output_range(code.s, code.e); + return indentation_after(ind, code.s); +} + +static void +dump_line_comment(int ind) +{ + int target_ind = ps.com_ind; + char *com_st = com.s; + + target_ind += ps.comment_delta; + + /* consider original indentation in case this is a box comment */ + while (*com_st == '\t') + com_st++, target_ind += opt.tabsize; + + while (target_ind < 0) { + if (*com_st == ' ') + target_ind++, com_st++; + else if (*com_st == '\t') { + target_ind = opt.tabsize * (1 + target_ind / opt.tabsize); + com_st++; + } else + target_ind = 0; + } + + /* if comment can't fit on this line, put it on next line */ + if (ind > target_ind) { + output_char('\n'); + ind = 0; + ps.stats.lines++; + } + + while (com.e > com_st && isspace((unsigned char)com.e[-1])) + com.e--; + + (void)output_indent(ind, target_ind); + output_range(com_st, com.e); + + ps.comment_delta = ps.n_comment_delta; + ps.stats.comment_lines++; +} + /* - * dump_line is the routine that actually effects the printing of the new - * source. It prints the label section, followed by the code section with - * the appropriate nesting level, followed by any comments. + * Write a line of formatted source to the output file. The line consists of a + * label, the code and the comment. */ void dump_line(void) { - int cur_ind; static bool not_first_line; if (ps.procname[0] != '\0') { @@ -148,101 +256,13 @@ dump_line(void) if (lab.e != lab.s || code.e != code.s) ps.stats.code_lines++; - if (lab.e != lab.s) { /* print lab, if any */ - if (comment_open) { - comment_open = false; - output_string(".*/\n"); - } - - while (lab.e > lab.s && is_hspace(lab.e[-1])) - lab.e--; - *lab.e = '\0'; - - cur_ind = output_indent(0, compute_label_indent()); - - if (lab.s[0] == '#' && (strncmp(lab.s, "#else", 5) == 0 - || strncmp(lab.s, "#endif", 6) == 0)) { - char *s = lab.s; - if (lab.e[-1] == '\n') - lab.e--; - do { - output_char(*s++); - } while (s < lab.e && 'a' <= *s && *s <= 'z'); - - while (s < lab.e && is_hspace(*s)) - s++; - - if (s < lab.e) { - if (s[0] == '/' && s[1] == '*') { - output_char('\t'); - output_range(s, lab.e); - } else { - output_string("\t/* "); - output_range(s, lab.e); - output_string(" */"); - } - } - } else - output_range(lab.s, lab.e); - cur_ind = indentation_after(cur_ind, lab.s); - } else - cur_ind = 0; /* there is no label section */ - - ps.is_case_label = false; - - if (code.s != code.e) { /* print code section, if any */ - if (comment_open) { - comment_open = false; - output_string(".*/\n"); - } - - int target_ind = compute_code_indent(); - for (int i = 0; i < ps.p_l_follow; i++) { - if (ps.paren_indents[i] >= 0) { - int ind = ps.paren_indents[i]; - /* XXX: the '+ 1' smells like an off-by-one error. */ - ps.paren_indents[i] = (short)-(ind + target_ind + 1); - debug_println( - "setting pi[%d] from %d to %d for column %d", - i, ind, ps.paren_indents[i], target_ind + 1); - } - } - - cur_ind = output_indent(cur_ind, target_ind); - output_range(code.s, code.e); - cur_ind = indentation_after(cur_ind, code.s); - } - - if (com.s != com.e) { /* print comment, if any */ - int target_ind = ps.com_ind; - char *com_st = com.s; - - target_ind += ps.comment_delta; - while (*com_st == '\t') /* consider original indentation in - * case this is a box comment */ - com_st++, target_ind += opt.tabsize; - while (target_ind < 0) { - if (*com_st == ' ') - target_ind++, com_st++; - else if (*com_st == '\t') { - target_ind = opt.tabsize * (1 + target_ind / opt.tabsize); - com_st++; - } else - target_ind = 0; - } - if (cur_ind > target_ind) { /* if comment can't fit on this line, - * put it on next line */ - output_char('\n'); - cur_ind = 0; - ps.stats.lines++; - } - while (com.e > com_st && isspace((unsigned char)com.e[-1])) - com.e--; - (void)output_indent(cur_ind, target_ind); - output_range(com_st, com.e); - ps.comment_delta = ps.n_comment_delta; - ps.stats.comment_lines++; - } + int ind = 0; + if (lab.e != lab.s) + ind = dump_line_label(); + if (code.e != code.s) + ind = dump_line_code(ind); + if (com.e != com.s) + dump_line_comment(ind); if (ps.use_ff) output_char('\f');