aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Forney <mforney@mforney.org>2019-02-24 11:22:34 -0800
committerMichael Forney <mforney@mforney.org>2019-02-24 12:35:09 -0800
commit05a8ff0ee5a003e816519486ae78aa4156dfffb4 (patch)
tree15b8cd2245430c7ef5332277fc5d7de766fb1de5
parentf7f0a1c3241640bccb5a2e07241b69f2331cca87 (diff)
scan: Handle escaped newlines
-rw-r--r--scan.c20
-rw-r--r--tests/escaped-newline.c2
-rw-r--r--tests/escaped-newline.qbe1
3 files changed, 19 insertions, 4 deletions
diff --git a/scan.c b/scan.c
index 22c1821..473400f 100644
--- a/scan.c
+++ b/scan.c
@@ -47,13 +47,25 @@ bufget(struct buffer *b)
static void
nextchar(struct scanner *s)
{
+ int c;
+
if (s->usebuf)
bufadd(&s->buf, s->chr);
- s->chr = getchar();
- if (s->chr == '\n')
+ for (;;) {
+ s->chr = getchar();
+ if (s->chr == '\n')
+ ++s->loc.line, s->loc.col = 1;
+ else
+ ++s->loc.col;
+ if (s->chr != '\\')
+ break;
+ c = getchar();
+ if (c != '\n') {
+ ungetc(c, stdin);
+ break;
+ }
++s->loc.line, s->loc.col = 1;
- else
- ++s->loc.col;
+ }
}
static int
diff --git a/tests/escaped-newline.c b/tests/escaped-newline.c
new file mode 100644
index 0000000..d659179
--- /dev/null
+++ b/tests/escaped-newline.c
@@ -0,0 +1,2 @@
+int split\
+ident = 3;
diff --git a/tests/escaped-newline.qbe b/tests/escaped-newline.qbe
new file mode 100644
index 0000000..cd2b5bf
--- /dev/null
+++ b/tests/escaped-newline.qbe
@@ -0,0 +1 @@
+export data $splitident = align 4 { w 3, }