Source-Changes-HG archive

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

[src/trunk]: src/usr.bin/make make(1): split ParseGetLine into separate funct...



details:   https://anonhg.NetBSD.org/src/rev/8301b3a35a0e
branches:  trunk
changeset: 1017207:8301b3a35a0e
user:      rillig <rillig%NetBSD.org@localhost>
date:      Fri Dec 18 19:02:37 2020 +0000

description:
make(1): split ParseGetLine into separate functions

diffstat:

 usr.bin/make/parse.c |  122 +++++++++++++++++++++++++++++++-------------------
 1 files changed, 75 insertions(+), 47 deletions(-)

diffs (150 lines):

diff -r 271a9cf3de7e -r 8301b3a35a0e usr.bin/make/parse.c
--- a/usr.bin/make/parse.c      Fri Dec 18 18:23:29 2020 +0000
+++ b/usr.bin/make/parse.c      Fri Dec 18 19:02:37 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: parse.c,v 1.484 2020/12/18 18:23:29 rillig Exp $       */
+/*     $NetBSD: parse.c,v 1.485 2020/12/18 19:02:37 rillig Exp $       */
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -117,7 +117,7 @@
 #include "pathnames.h"
 
 /*     "@(#)parse.c    8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: parse.c,v 1.484 2020/12/18 18:23:29 rillig Exp $");
+MAKE_RCSID("$NetBSD: parse.c,v 1.485 2020/12/18 19:02:37 rillig Exp $");
 
 /* types and constants */
 
@@ -2656,6 +2656,75 @@
        return TRUE;
 }
 
+static void
+UnescapeBackslash(char **out_tp, char **out_ptr, char **inout_escaped,
+                 char *const line) {
+       char *tp, *ptr;
+       char *escaped = *inout_escaped;
+
+       tp = ptr = escaped;
+       escaped = line;
+       for (;;) {
+               char ch = *ptr++;
+               if (ch != '\\') {
+                       if (ch == '\0')
+                               break;
+                       *tp++ = ch;
+                       continue;
+               }
+
+               ch = *ptr++;
+               if (ch == '\0') {
+                       /* Delete '\\' at end of buffer */
+                       tp--;
+                       break;
+               }
+
+               /* Delete '\\' from before '#' on non-command lines */
+               if (ch == '#' && line[0] != '\t') {
+                       *tp++ = ch;
+                       continue;
+               }
+
+               if (ch != '\n') {
+                       /* Leave '\\' in buffer for later */
+                       *tp++ = '\\';
+                       /*
+                        * Make sure we don't delete an escaped ' ' from the
+                        * line end.
+                        */
+                       escaped = tp + 1;
+                       *tp++ = ch;
+                       continue;
+               }
+
+               /*
+                * Escaped '\n' -- replace following whitespace with a single
+                * ' '.
+                */
+               pp_skip_hspace(&ptr);
+               ch = ' ';
+               *tp++ = ch;
+       }
+
+       *out_tp = tp;
+       *out_ptr = ptr;
+       *inout_escaped = escaped;
+}
+
+/* Delete any trailing spaces - eg from empty continuations */
+static void
+TrimRight(char **inout_tp, const char * const escaped)
+{
+       char *tp = *inout_tp;
+
+       while (tp > escaped && ch_isspace(tp[-1]))
+               tp--;
+       *tp = '\0';
+
+       *inout_tp = tp;
+}
+
 typedef enum GetLineMode {
        PARSE_NORMAL,
        PARSE_RAW,
@@ -2773,51 +2842,10 @@
                return line;
 
        /* Remove escapes from '\n' and '#' */
-       tp = ptr = escaped;
-       escaped = line;
-       for (;; *tp++ = ch) {
-               ch = *ptr++;
-               if (ch != '\\') {
-                       if (ch == '\0')
-                               break;
-                       continue;
-               }
-
-               ch = *ptr++;
-               if (ch == '\0') {
-                       /* Delete '\\' at end of buffer */
-                       tp--;
-                       break;
-               }
-
-               if (ch == '#' && line[0] != '\t')
-                       /* Delete '\\' from before '#' on non-command lines */
-                       continue;
-
-               if (ch != '\n') {
-                       /* Leave '\\' in buffer for later */
-                       *tp++ = '\\';
-                       /*
-                        * Make sure we don't delete an escaped ' ' from the
-                        * line end.
-                        */
-                       escaped = tp + 1;
-                       continue;
-               }
-
-               /*
-                * Escaped '\n' -- replace following whitespace with a single
-                * ' '.
-                */
-               pp_skip_hspace(&ptr);
-               ch = ' ';
-       }
-
-       /* Delete any trailing spaces - eg from empty continuations */
-       while (tp > escaped && ch_isspace(tp[-1]))
-               tp--;
-
-       *tp = '\0';
+       UnescapeBackslash(&tp, &ptr, &escaped, line);
+
+       TrimRight(&tp, escaped);
+
        return line;
 }
 



Home | Main Index | Thread Index | Old Index