Module Name:    src
Committed By:   rillig
Date:           Thu Oct  7 19:17:07 UTC 2021

Modified Files:
        src/usr.bin/indent: indent.c

Log Message:
indent: add high-level API for working with buffers

This makes the code more boring to read, which is actually good. Less
fiddling with memcpy and pointer arithmetics.

Since indent is not a high-performance tool used for bulk operations on
terabytes of source code, there is no need to squeeze out every possible
CPU cycle.

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.111 -r1.112 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/usr.bin/indent/indent.c
diff -u src/usr.bin/indent/indent.c:1.111 src/usr.bin/indent/indent.c:1.112
--- src/usr.bin/indent/indent.c:1.111	Thu Oct  7 18:48:31 2021
+++ src/usr.bin/indent/indent.c	Thu Oct  7 19:17:07 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: indent.c,v 1.111 2021/10/07 18:48:31 rillig Exp $	*/
+/*	$NetBSD: indent.c,v 1.112 2021/10/07 19:17:07 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-4-Clause
@@ -43,7 +43,7 @@ static char sccsid[] = "@(#)indent.c	5.1
 
 #include <sys/cdefs.h>
 #if defined(__NetBSD__)
-__RCSID("$NetBSD: indent.c,v 1.111 2021/10/07 18:48:31 rillig Exp $");
+__RCSID("$NetBSD: indent.c,v 1.112 2021/10/07 19:17:07 rillig Exp $");
 #elif defined(__FreeBSD__)
 __FBSDID("$FreeBSD: head/usr.bin/indent/indent.c 340138 2018-11-04 19:24:49Z oshogbo $");
 #endif
@@ -128,20 +128,6 @@ static const char *out_name = "Standard 
 static const char *backup_suffix = ".BAK";
 static char bakfile[MAXPATHLEN] = "";
 
-static void
-check_size_code(size_t desired_size)
-{
-    if (code.e + desired_size >= code.l)
-	buf_expand(&code, desired_size);
-}
-
-static void
-check_size_label(size_t desired_size)
-{
-    if (lab.e + desired_size >= lab.l)
-	buf_expand(&lab, desired_size);
-}
-
 #if HAVE_CAPSICUM
 static void
 init_capsicum(void)
@@ -404,6 +390,42 @@ buf_expand(struct buffer *buf, size_t de
 }
 
 static void
+buf_reserve(struct buffer *buf, size_t n)
+{
+    if (buf->e + n >= buf->l)
+	buf_expand(buf, n);
+}
+
+static void
+buf_add_char(struct buffer *buf, char ch)
+{
+    buf_reserve(buf, 1);
+    *buf->e++ = ch;
+}
+
+static void
+buf_add_buf(struct buffer *buf, const struct buffer *add)
+{
+    size_t len = buf_len(add);
+    buf_reserve(buf, len);
+    memcpy(buf->e, add->s, len);
+    buf->e += len;
+}
+
+static void
+buf_terminate(struct buffer *buf)
+{
+    buf_reserve(buf, 1);
+    *buf->e = '\0';
+}
+
+static void
+buf_reset(struct buffer *buf)
+{
+    buf->e = buf->s;
+}
+
+static void
 main_init_globals(void)
 {
     found_err = false;
@@ -566,16 +588,12 @@ process_comment_in_code(token_type ttype
 				 * '}' */
     if (com.s != com.e) {	/* the turkey has embedded a comment in a
 				 * line. fix it */
-	size_t len = buf_len(&com);
-
-	check_size_code(len + 3);
-	*code.e++ = ' ';
-	memcpy(code.e, com.s, len);
-	code.e += len;
-	*code.e++ = ' ';
-	*code.e = '\0';
+	buf_add_char(&code, ' ');
+	buf_add_buf(&code, &com);
+	buf_add_char(&code, ' ');
+	buf_terminate(&code);
+	buf_reset(&com);
 	ps.want_blank = false;
-	com.e = com.s;
     }
 }
 
@@ -706,27 +724,16 @@ process_unary_op(int decl_ind, bool tabs
     } else if (ps.want_blank)
 	*code.e++ = ' ';
 
-    {
-	size_t len = buf_len(&token);
-
-	check_size_code(len);
-	memcpy(code.e, token.s, len);
-	code.e += len;
-    }
+    buf_add_buf(&code, &token);
     ps.want_blank = false;
 }
 
 static void
 process_binary_op(void)
 {
-    size_t len = buf_len(&token);
-
-    check_size_code(len + 1);
     if (ps.want_blank)
-	*code.e++ = ' ';
-    memcpy(code.e, token.s, len);
-    code.e += len;
-
+	buf_add_char(&code, ' ');
+    buf_add_buf(&code, &token);
     ps.want_blank = true;
 }
 
@@ -768,19 +775,13 @@ process_colon(int *seen_quest, bool *for
     }
     ps.in_stmt = false;		/* seeing a label does not imply we are in a
 				 * stmt */
-    /*
-     * turn everything so far into a label
-     */
-    {
-	size_t len = buf_len(&code);
 
-	check_size_label(len + 3);
-	memcpy(lab.e, code.s, len);
-	lab.e += len;
-	*lab.e++ = ':';
-	*lab.e = '\0';
-	code.e = code.s;
-    }
+    /* turn everything so far into a label */
+    buf_add_buf(&lab, &code);
+    buf_add_char(&lab, ':');
+    buf_terminate(&lab);
+    buf_reset(&code);
+
     ps.pcase = *seen_case;	/* will be used by dump_line to decide how to
 				 * indent the label. */
     *force_nl = *seen_case;	/* will force a 'case n:' to be on a
@@ -1042,26 +1043,15 @@ process_ident(token_type ttype, int decl
 static void
 copy_token(void)
 {
-    size_t len = buf_len(&token);
-
-    check_size_code(len + 1);
     if (ps.want_blank)
-	*code.e++ = ' ';
-    memcpy(code.e, token.s, len);
-    code.e += len;
+	buf_add_char(&code, ' ');
+    buf_add_buf(&code, &token);
 }
 
 static void
 process_string_prefix(void)
 {
-    size_t len = buf_len(&token);
-
-    check_size_code(len + 1);
-    if (ps.want_blank)
-	*code.e++ = ' ';
-    memcpy(code.e, token.s, len);
-    code.e += len;
-
+    copy_token();
     ps.want_blank = false;
 }
 
@@ -1097,13 +1087,14 @@ process_comma(int decl_ind, bool tabs_to
     }
 }
 
+/* move the whole line to the 'label' buffer */
 static void
 process_preprocessing(void)
 {
     if (com.s != com.e || lab.s != lab.e || code.s != code.e)
 	dump_line();
-    check_size_label(1);
-    *lab.e++ = '#';		/* move whole line to 'label' buffer */
+
+    buf_add_char(&lab, '#');
 
     {
 	bool in_comment = false;
@@ -1115,7 +1106,7 @@ process_preprocessing(void)
 	    inbuf_skip();
 
 	while (*buf_ptr != '\n' || (in_comment && !had_eof)) {
-	    check_size_label(2);
+	    buf_reserve(&lab, 2);
 	    *lab.e++ = inbuf_next();
 	    switch (lab.e[-1]) {
 	    case '\\':
@@ -1126,7 +1117,7 @@ process_preprocessing(void)
 		if (*buf_ptr == '*' && !in_comment && quote == '\0') {
 		    in_comment = true;
 		    *lab.e++ = *buf_ptr++;
-		    com_start = (int)(lab.e - lab.s) - 2;
+		    com_start = (int)buf_len(&lab) - 2;
 		}
 		break;
 	    case '"':
@@ -1145,7 +1136,7 @@ process_preprocessing(void)
 		if (*buf_ptr == '/' && in_comment) {
 		    in_comment = false;
 		    *lab.e++ = *buf_ptr++;
-		    com_end = (int)(lab.e - lab.s);
+		    com_end = (int)buf_len(&lab);
 		}
 		break;
 	    }
@@ -1180,8 +1171,7 @@ process_preprocessing(void)
 	    sc_end = NULL;
 	    debug_println("switched buf_ptr to save_com");
 	}
-	check_size_label(1);
-	*lab.e = '\0';		/* null terminate line */
+	buf_terminate(&lab);
 	ps.pcase = false;
     }
 
@@ -1282,15 +1272,8 @@ main_loop(void)
 	    force_nl = false;	/* cancel forced newline after newline, form
 				 * feed, etc */
 
+	buf_reserve(&code, 3);	/* space for 2 characters plus '\0' */
 
-
-	/*-----------------------------------------------------*\
-	|	   do switch on type of token scanned		|
-	\*-----------------------------------------------------*/
-	check_size_code(3);	/* maximum number of increments of code.e
-				 * before the next check_size_code or
-				 * dump_line() is 2. After that there's the
-				 * final increment for the null character. */
 	switch (ttype) {
 
 	case form_feed:
@@ -1485,20 +1468,21 @@ indent_declaration(int cur_decl_ind, boo
 	pos += (ps.ind_level * opt.indent_size) % opt.tabsize;
 	cur_decl_ind += (ps.ind_level * opt.indent_size) % opt.tabsize;
     }
+
     if (tabs_to_var) {
 	int tpos;
 
-	check_size_code((size_t)(cur_decl_ind / opt.tabsize));
 	while ((tpos = opt.tabsize * (1 + pos / opt.tabsize)) <= cur_decl_ind) {
-	    *code.e++ = '\t';
+	    buf_add_char(&code, '\t');
 	    pos = tpos;
 	}
     }
-    check_size_code((size_t)(cur_decl_ind - pos) + 1);
+
     while (pos < cur_decl_ind) {
-	*code.e++ = ' ';
+	buf_add_char(&code, ' ');
 	pos++;
     }
+
     if (code.e == startpos && ps.want_blank) {
 	*code.e++ = ' ';
 	ps.want_blank = false;

Reply via email to