https://gcc.gnu.org/g:7e9b16ff30b30bc37a584ade0e8900b518a73a11
commit r17-4371-g7e9b16ff30b30bc37a584ade0e8900b518a73a11 Author: Pietro Monteiro <[email protected]> Date: Wed Sep 16 14:09:00 2026 -0400 algol68: Skip backslash at the end of lines on the scanner The scanner builds a list of lines from the source code. Then it iterates over the list concatenating the lines that end with backslashes with the following line. Instead of iterating over all lines skip a backslash if it preceeds a newline. gcc/algol68/ChangeLog: * a68-parser-scanner.cc (concatenate_lines): Delete. (read_source_file): Stop calling concatenate_lines. (next_char): Skip backslash at the end of lines. (include_files): Stop calling concatenate_lines. gcc/testsuite/ChangeLog: * algol68/execute/backslash-1.a68: New test. Signed-off-by: Pietro Monteiro <[email protected]> Diff: --- gcc/algol68/a68-parser-scanner.cc | 43 +++++---------------------- gcc/testsuite/algol68/execute/backslash-1.a68 | 6 ++++ 2 files changed, 13 insertions(+), 36 deletions(-) diff --git a/gcc/algol68/a68-parser-scanner.cc b/gcc/algol68/a68-parser-scanner.cc index 30c23996dcd8..5ddf25894a24 100644 --- a/gcc/algol68/a68-parser-scanner.cc +++ b/gcc/algol68/a68-parser-scanner.cc @@ -285,38 +285,6 @@ unworthy (LINE_T *u, char *v, char ch) a68_scan_error (u, v, A68 (edit_line)); } -/* Concatenate lines that terminate in '\' with next line. */ - -static void -concatenate_lines (LINE_T * top) -{ - LINE_T *q; - /* Work from bottom backwards. */ - for (q = top; q != NO_LINE && NEXT (q) != NO_LINE; FORWARD (q)) - ; - - for (; q != NO_LINE; BACKWARD (q)) - { - char *z = STRING (q); - size_t len = strlen (z); - - if (len >= 2 - && z[len - 2] == BACKSLASH_CHAR - && z[len - 1] == NEWLINE_CHAR - && NEXT (q) != NO_LINE - && STRING (NEXT (q)) != NO_TEXT) - { - z[len - 2] = '\0'; - len += (int) strlen (STRING (NEXT (q))); - z = (char *) xmalloc (len + 1); - a68_bufcpy (z, STRING (q), len + 1); - a68_bufcat (z, STRING (NEXT (q)), len + 1); - STRING (NEXT (q))[0] = '\0'; - STRING (q) = z; - } - } -} - /* Read source file FILENAME and make internal copy. */ static bool @@ -400,9 +368,6 @@ read_source_file (const char *filename) ? upper_postlude : supper_postlude, &ref_l, &line_num, "postlude"); - /* Concatenate lines that end with \. */ - concatenate_lines (TOP_LINE (&A68_JOB)); - /* Include files. */ include_files (TOP_LINE (&A68_JOB)); @@ -439,6 +404,13 @@ next_char (LINE_T **ref_l, char **ref_s, bool allow_typo, else (*ref_s)++; + /* Skip backslash at the end of lines. */ + if ((*ref_s)[0] == BACKSLASH_CHAR && (*ref_s)[1] == NEWLINE_CHAR) + { + (*ref_s)++; + return next_char (ref_l, ref_s, allow_typo, allow_one_under, found_under); + } + /* Deliver next char. */ ch = (*ref_s)[0]; if ((allow_typo && (ISSPACE (ch) || ch == FORMFEED_CHAR)) @@ -1133,7 +1105,6 @@ include_files (LINE_T *top) /* Conclude and go find another include directive, if any. */ NEXT (t) = s; PREVIOUS (s) = t; - concatenate_lines (top); if (fclose (fp) != 0) gcc_unreachable (); make_pass = true; diff --git a/gcc/testsuite/algol68/execute/backslash-1.a68 b/gcc/testsuite/algol68/execute/backslash-1.a68 new file mode 100644 index 000000000000..120fc2188909 --- /dev/null +++ b/gcc/testsuite/algol68/execute/backslash-1.a68 @@ -0,0 +1,6 @@ +begin + string foobar = "foo bar"; + string fubar = "foo \ +bar"; + assert (foobar = fubar) +end
