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');

Reply via email to