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): extract ParseRawLine from ParseGetLine



details:   https://anonhg.NetBSD.org/src/rev/3084195e7705
branches:  trunk
changeset: 947586:3084195e7705
user:      rillig <rillig%NetBSD.org@localhost>
date:      Sat Dec 19 00:20:57 2020 +0000

description:
make(1): extract ParseRawLine from ParseGetLine

diffstat:

 usr.bin/make/parse.c |  131 ++++++++++++++++++++++++++++++--------------------
 1 files changed, 78 insertions(+), 53 deletions(-)

diffs (159 lines):

diff -r 21b679eb5892 -r 3084195e7705 usr.bin/make/parse.c
--- a/usr.bin/make/parse.c      Sat Dec 19 00:02:34 2020 +0000
+++ b/usr.bin/make/parse.c      Sat Dec 19 00:20:57 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: parse.c,v 1.488 2020/12/19 00:02:34 rillig Exp $       */
+/*     $NetBSD: parse.c,v 1.489 2020/12/19 00:20:57 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.488 2020/12/19 00:02:34 rillig Exp $");
+MAKE_RCSID("$NetBSD: parse.c,v 1.489 2020/12/19 00:20:57 rillig Exp $");
 
 /* types and constants */
 
@@ -2656,6 +2656,79 @@
        return TRUE;
 }
 
+/*
+ * Parse a line, joining physical lines that end with backslash-newline.
+ * Do not unescape "\#", that's done by UnescapeBackslash.
+ */
+static Boolean
+ParseRawLine(char **inout_line, char **out_ptr, char **out_line_end,
+             char **out_escaped, char **out_comment, char *inout_ch,
+             IFile *const cf)
+{
+       char *line = *inout_line;
+       char *ptr = line;
+       char *line_end = line;
+       char *escaped = NULL;
+       char *comment = NULL;
+       char ch = *inout_ch;
+
+       for (;;) {
+               if (ptr == cf->buf_end) {
+                       /* end of buffer */
+                       ch = '\0';
+                       break;
+               }
+
+               ch = *ptr;
+               if (ch == '\0' ||
+                   (ch == '\\' && ptr + 1 < cf->buf_end &&
+                    ptr[1] == '\0')) {
+                       Parse_Error(PARSE_FATAL,
+                           "Zero byte read from file");
+                       return FALSE;
+               }
+
+               /*
+                * Don't treat next character after '\' as special,
+                * remember first one.
+                */
+               if (ch == '\\') {
+                       if (escaped == NULL)
+                               escaped = ptr;
+                       if (ptr[1] == '\n')
+                               cf->lineno++;
+                       ptr += 2;
+                       line_end = ptr;
+                       continue;
+               }
+
+               /*
+                * Remember the first '#' for comment stripping,
+                * unless the previous char was '[', as in the
+                * modifier ':[#]'.
+                */
+               if (ch == '#' && comment == NULL &&
+                   !(ptr > line && ptr[-1] == '['))
+                       comment = line_end;
+
+               ptr++;
+               if (ch == '\n')
+                       break;
+
+               /* We are not interested in trailing whitespace. */
+               if (!ch_isspace(ch))
+                       line_end = ptr;
+       }
+
+       *inout_line = line;
+       *out_ptr = ptr;
+       *out_line_end = line_end;
+       *out_escaped = escaped;
+       *out_comment = comment;
+       *inout_ch = ch;
+       return TRUE;
+}
+
 static void
 UnescapeBackslash(char *escaped, char *const line)
 {
@@ -2733,57 +2806,9 @@
        for (;;) {
                cf->lineno++;
                line = cf->buf_ptr;
-               ptr = line;
-               line_end = line;
-               escaped = NULL;
-               comment = NULL;
-               for (;;) {
-                       if (ptr == cf->buf_end) {
-                               /* end of buffer */
-                               ch = '\0';
-                               break;
-                       }
-
-                       ch = *ptr;
-                       if (ch == '\0' ||
-                           (ch == '\\' && ptr + 1 < cf->buf_end &&
-                            ptr[1] == '\0')) {
-                               Parse_Error(PARSE_FATAL,
-                                   "Zero byte read from file");
-                               return NULL;
-                       }
-
-                       /*
-                        * Don't treat next character after '\' as special,
-                        * remember first one.
-                        */
-                       if (ch == '\\') {
-                               if (escaped == NULL)
-                                       escaped = ptr;
-                               if (ptr[1] == '\n')
-                                       cf->lineno++;
-                               ptr += 2;
-                               line_end = ptr;
-                               continue;
-                       }
-
-                       /*
-                        * Remember the first '#' for comment stripping,
-                        * unless the previous char was '[', as in the
-                        * modifier ':[#]'.
-                        */
-                       if (ch == '#' && comment == NULL &&
-                           !(ptr > line && ptr[-1] == '['))
-                               comment = line_end;
-
-                       ptr++;
-                       if (ch == '\n')
-                               break;
-
-                       /* We are not interested in trailing whitespace. */
-                       if (!ch_isspace(ch))
-                               line_end = ptr;
-               }
+               if (!ParseRawLine(&line, &ptr, &line_end, &escaped, &comment,
+                   &ch, cf))
+                       return NULL;
 
                /* Save next 'to be processed' location */
                cf->buf_ptr = ptr;



Home | Main Index | Thread Index | Old Index