aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/main.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2011-01-24 23:41:55 +0000
committerIngo Schwarze <schwarze@openbsd.org>2011-01-24 23:41:55 +0000
commitc29161e56461191da37128e0f7c0112b64d9764a (patch)
tree20cbdf04500f6341a3acfd07b5f8b5baf70a8ba7 /main.c
parent9196add7c079579b6cd408e463c07bebac189abc (diff)
downloadmandoc-c29161e56461191da37128e0f7c0112b64d9764a.tar.gz
mandoc-c29161e56461191da37128e0f7c0112b64d9764a.tar.zst
mandoc-c29161e56461191da37128e0f7c0112b64d9764a.zip
Skip carriage return before newline, if any.
As pointed out by Joerg Sonnenberger, this is useful because we use mmap(3) and look for '\n' by hand. "check it in" kristaps@
Diffstat (limited to 'main.c')
-rw-r--r--main.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/main.c b/main.c
index a29c71b2..e70a010d 100644
--- a/main.c
+++ b/main.c
@@ -1,7 +1,7 @@
-/* $Id: main.c,v 1.139 2011/01/22 13:16:02 schwarze Exp $ */
+/* $Id: main.c,v 1.140 2011/01/24 23:41:55 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -684,6 +684,16 @@ parsebuf(struct curparse *curp, struct buf blk, int start)
}
while (i < (int)blk.sz && (start || '\0' != blk.buf[i])) {
+
+ /*
+ * When finding an unescaped newline character,
+ * leave the character loop to process the line.
+ * Skip a preceding carriage return, if any.
+ */
+
+ if ('\r' == blk.buf[i] && i + 1 < (int)blk.sz &&
+ '\n' == blk.buf[i + 1])
+ ++i;
if ('\n' == blk.buf[i]) {
++i;
++lnn;
@@ -718,11 +728,18 @@ parsebuf(struct curparse *curp, struct buf blk, int start)
continue;
}
- /* Found escape & at least one other char. */
+ /*
+ * Found escape and at least one other character.
+ * When it's a newline character, skip it.
+ * When there is a carriage return in between,
+ * skip that one as well.
+ */
+ if ('\r' == blk.buf[i + 1] && i + 2 < (int)blk.sz &&
+ '\n' == blk.buf[i + 2])
+ ++i;
if ('\n' == blk.buf[i + 1]) {
i += 2;
- /* Escaped newlines are skipped over */
++lnn;
continue;
}