Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/indent indent: split search_brace into smaller funct...



details:   https://anonhg.NetBSD.org/src/rev/515ea96b56d6
branches:  trunk
changeset: 1023846:515ea96b56d6
user:      rillig <rillig%NetBSD.org@localhost>
date:      Mon Sep 27 20:00:41 2021 +0000

description:
indent: split search_brace into smaller functions

No functional change.

diffstat:

 usr.bin/indent/indent.c |  364 ++++++++++++++++++++++++++---------------------
 1 files changed, 201 insertions(+), 163 deletions(-)

diffs (truncated from 402 to 300 lines):

diff -r 012087b988cd -r 515ea96b56d6 usr.bin/indent/indent.c
--- a/usr.bin/indent/indent.c   Mon Sep 27 19:02:44 2021 +0000
+++ b/usr.bin/indent/indent.c   Mon Sep 27 20:00:41 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: indent.c,v 1.90 2021/09/27 18:21:47 rillig Exp $       */
+/*     $NetBSD: indent.c,v 1.91 2021/09/27 20:00:41 rillig Exp $       */
 
 /*-
  * SPDX-License-Identifier: BSD-4-Clause
@@ -43,7 +43,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__NetBSD__)
-__RCSID("$NetBSD: indent.c,v 1.90 2021/09/27 18:21:47 rillig Exp $");
+__RCSID("$NetBSD: indent.c,v 1.91 2021/09/27 20:00:41 rillig Exp $");
 #elif defined(__FreeBSD__)
 __FBSDID("$FreeBSD: head/usr.bin/indent/indent.c 340138 2018-11-04 19:24:49Z oshogbo $");
 #endif
@@ -161,184 +161,222 @@
 #endif
 
 static void
+search_brace_newline(bool *inout_force_nl)
+{
+    if (sc_end == NULL) {
+       save_com = sc_buf;
+       save_com[0] = save_com[1] = ' ';
+       sc_end = &save_com[2];
+    }
+    *sc_end++ = '\n';
+
+    /*
+     * We may have inherited a force_nl == true from the previous
+     * token (like a semicolon). But once we know that a newline has
+     * been scanned in this loop, force_nl should be false.
+     *
+     * However, the force_nl == true must be preserved if newline is
+     * never scanned in this loop, so this assignment cannot be done
+     * earlier.
+     */
+    *inout_force_nl = false;
+}
+
+static void
+search_brace_comment(bool *inout_comment_buffered)
+{
+    if (sc_end == NULL) {
+       /*
+        * Copy everything from the start of the line, because
+        * process_comment() will use that to calculate original
+        * indentation of a boxed comment.
+        */
+       memcpy(sc_buf, in_buffer, (size_t)(buf_ptr - in_buffer) - 4);
+       save_com = sc_buf + (buf_ptr - in_buffer - 4);
+       save_com[0] = save_com[1] = ' ';
+       sc_end = &save_com[2];
+    }
+    *inout_comment_buffered = true;
+    *sc_end++ = '/';   /* copy in start of comment */
+    *sc_end++ = '*';
+    for (;;) {         /* loop until the end of the comment */
+       *sc_end = *buf_ptr++;
+       if (buf_ptr >= buf_end)
+           fill_buffer();
+       if (*sc_end++ == '*' && *buf_ptr == '/')
+           break;      /* we are at end of comment */
+       if (sc_end >= &save_com[sc_size]) {     /* check for temp buffer
+                                                * overflow */
+           diag(1, "Internal buffer overflow - Move big comment from right after if, while, or whatever");
+           fflush(output);
+           exit(1);
+       }
+    }
+    *sc_end++ = '/';   /* add ending slash */
+    if (++buf_ptr >= buf_end)  /* get past / in buffer */
+       fill_buffer();
+}
+
+static bool
+search_brace_lbrace(void)
+{
+    /*
+     * Put KNF-style lbraces before the buffered up tokens and jump
+     * out of this loop in order to avoid copying the token again
+     * under the default case of the switch below.
+     */
+    if (sc_end != NULL && opt.btype_2) {
+       save_com[0] = '{';
+       /*
+        * Originally the lbrace may have been alone on its own line,
+        * but it will be moved into "the else's line", so if there
+        * was a newline resulting from the "{" before, it must be
+        * scanned now and ignored.
+        */
+       while (isspace((unsigned char)*buf_ptr)) {
+           if (++buf_ptr >= buf_end)
+               fill_buffer();
+           if (*buf_ptr == '\n')
+               break;
+       }
+       return true;
+    }
+    return false;
+}
+
+static bool
+search_brace_other(token_type ttype, bool *inout_force_nl,
+    bool comment_buffered, bool last_else)
+{
+    bool remove_newlines;
+
+    remove_newlines =
+           /* "} else" */
+           (ttype == keyword_do_else && *token.s == 'e' &&
+            code.e != code.s && code.e[-1] == '}')
+           /* "else if" */
+           || (ttype == keyword_for_if_while &&
+               *token.s == 'i' && last_else && opt.else_if);
+    if (remove_newlines)
+       *inout_force_nl = false;
+    if (sc_end == NULL) {      /* ignore buffering if comment wasn't saved
+                                * up */
+       ps.search_brace = false;
+       return false;
+    }
+    while (sc_end > save_com && isblank((unsigned char)sc_end[-1])) {
+       sc_end--;
+    }
+    if (opt.swallow_optional_blanklines ||
+       (!comment_buffered && remove_newlines)) {
+       *inout_force_nl = !remove_newlines;
+       while (sc_end > save_com && sc_end[-1] == '\n') {
+           sc_end--;
+       }
+    }
+    if (*inout_force_nl) {     /* if we should insert a nl here, put it into
+                                * the buffer */
+       *inout_force_nl = false;
+       --line_no;              /* this will be re-increased when the newline
+                                * is read from the buffer */
+       *sc_end++ = '\n';
+       *sc_end++ = ' ';
+       if (opt.verbose)        /* print error msg if the line was not already
+                                * broken */
+           diag(0, "Line broken");
+    }
+    for (const char *t_ptr = token.s; *t_ptr != '\0'; ++t_ptr)
+       *sc_end++ = *t_ptr;
+    return true;
+}
+
+static void
+switch_buffer(void)
+{
+    ps.search_brace = false;   /* stop looking for start of stmt */
+    bp_save = buf_ptr;         /* save current input buffer */
+    be_save = buf_end;
+    buf_ptr = save_com;                /* fix so that subsequent calls to lexi will
+                                * take tokens out of save_com */
+    *sc_end++ = ' ';           /* add trailing blank, just in case */
+    buf_end = sc_end;
+    sc_end = NULL;
+    debug_println("switched buf_ptr to save_com");
+}
+
+static void
+search_brace_lookahead(token_type *inout_ttype)
+{
+    /*
+     * We must make this check, just in case there was an unexpected EOF.
+     */
+    if (*inout_ttype != end_of_file) {
+       /*
+        * The only intended purpose of calling lexi() below is to categorize
+        * the next token in order to decide whether to continue buffering
+        * forthcoming tokens. Once the buffering is over, lexi() will be
+        * called again elsewhere on all of the tokens - this time for normal
+        * processing.
+        *
+        * Calling it for this purpose is a bug, because lexi() also changes
+        * the parser state and discards leading whitespace, which is needed
+        * mostly for comment-related considerations.
+        *
+        * Work around the former problem by giving lexi() a copy of the
+        * current parser state and discard it if the call turned out to be
+        * just a look ahead.
+        *
+        * Work around the latter problem by copying all whitespace characters
+        * into the buffer so that the later lexi() call will read them.
+        */
+       if (sc_end != NULL) {
+           while (*buf_ptr == ' ' || *buf_ptr == '\t') {
+               *sc_end++ = *buf_ptr++;
+               if (sc_end >= &save_com[sc_size]) {
+                   errx(1, "input too long");
+               }
+           }
+           if (buf_ptr >= buf_end) {
+               fill_buffer();
+           }
+       }
+
+       struct parser_state transient_state;
+       transient_state = ps;
+       *inout_ttype = lexi(&transient_state);  /* read another token */
+       if (*inout_ttype != newline && *inout_ttype != form_feed &&
+           *inout_ttype != comment && !transient_state.search_brace) {
+           ps = transient_state;
+       }
+    }
+}
+
+static void
 search_brace(token_type *inout_ttype, bool *inout_force_nl,
     bool *inout_comment_buffered, bool *inout_last_else)
 {
     while (ps.search_brace) {
        switch (*inout_ttype) {
        case newline:
-           if (sc_end == NULL) {
-               save_com = sc_buf;
-               save_com[0] = save_com[1] = ' ';
-               sc_end = &save_com[2];
-           }
-           *sc_end++ = '\n';
-           /*
-            * We may have inherited a force_nl == true from the previous
-            * token (like a semicolon). But once we know that a newline has
-            * been scanned in this loop, force_nl should be false.
-            *
-            * However, the force_nl == true must be preserved if newline is
-            * never scanned in this loop, so this assignment cannot be done
-            * earlier.
-            */
-           *inout_force_nl = false;
+           search_brace_newline(inout_force_nl);
            break;
        case form_feed:
            break;
        case comment:
-           if (sc_end == NULL) {
-               /*
-                * Copy everything from the start of the line, because
-                * process_comment() will use that to calculate original
-                * indentation of a boxed comment.
-                */
-               memcpy(sc_buf, in_buffer, (size_t)(buf_ptr - in_buffer) - 4);
-               save_com = sc_buf + (buf_ptr - in_buffer - 4);
-               save_com[0] = save_com[1] = ' ';
-               sc_end = &save_com[2];
-           }
-           *inout_comment_buffered = true;
-           *sc_end++ = '/';    /* copy in start of comment */
-           *sc_end++ = '*';
-           for (;;) {          /* loop until the end of the comment */
-               *sc_end = *buf_ptr++;
-               if (buf_ptr >= buf_end)
-                   fill_buffer();
-               if (*sc_end++ == '*' && *buf_ptr == '/')
-                   break;      /* we are at end of comment */
-               if (sc_end >= &save_com[sc_size]) {     /* check for temp buffer
-                                                        * overflow */
-                   diag(1, "Internal buffer overflow - Move big comment from right after if, while, or whatever");
-                   fflush(output);
-                   exit(1);
-               }
-           }
-           *sc_end++ = '/';    /* add ending slash */
-           if (++buf_ptr >= buf_end)   /* get past / in buffer */
-               fill_buffer();
+           search_brace_comment(inout_comment_buffered);
            break;
        case lbrace:
-           /*
-            * Put KNF-style lbraces before the buffered up tokens and jump
-            * out of this loop in order to avoid copying the token again
-            * under the default case of the switch below.
-            */
-           if (sc_end != NULL && opt.btype_2) {
-               save_com[0] = '{';
-               /*
-                * Originally the lbrace may have been alone on its own line,
-                * but it will be moved into "the else's line", so if there
-                * was a newline resulting from the "{" before, it must be
-                * scanned now and ignored.
-                */
-               while (isspace((unsigned char)*buf_ptr)) {
-                   if (++buf_ptr >= buf_end)
-                       fill_buffer();
-                   if (*buf_ptr == '\n')
-                       break;
-               }
+           if (search_brace_lbrace())
                goto sw_buffer;
-           }
            /* FALLTHROUGH */
        default:                /* it is the start of a normal statement */
-       {
-           bool remove_newlines;
-



Home | Main Index | Thread Index | Old Index