From da3cd52d0a58e1c0042cb5f9dd8293e40e8f310d Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Sun, 07 Oct 2018 10:40:39 -0400 Subject: [PATCH] Add support for explicit line breaks --- scdoc.5.scd | 7 +++++++ src/main.c | 26 ++++++++++++++++++++++++++ diff --git a/scdoc.5.scd b/scdoc.5.scd index 293193ffb1a099b7a991d4a6c813b97a05f1bb61..b94952e8c1b4f2901f7c18780512fbfde496a49a 100644 --- a/scdoc.5.scd +++ b/scdoc.5.scd @@ -35,6 +35,13 @@ ## PARAGRAPHS Begin a new paragraph with an empty line. +## LINE BREAKS + +Insert a line break by ending a line with \+\+. + +The result looks++ +like this. + ## FORMATTING Text can be made *bold* or _underlined_ with asterisks and underscores: \*bold\* diff --git a/src/main.c b/src/main.c index cb6b5bd9d57dd530d822a17707a46bc257ee2c61..3765f7e425ff50a343471a74fa896ea56cee4852 100644 --- a/src/main.c +++ b/src/main.c @@ -133,6 +133,29 @@ } p->flags ^= fmt; } +static void parse_linebreak(struct parser *p) { + uint32_t plus = parser_getch(p); + if (plus != '+') { + fprintf(p->output, "+"); + parser_pushch(p, plus); + return; + } + uint32_t lf = parser_getch(p); + if (lf != '\n') { + fprintf(p->output, "+"); + parser_pushch(p, plus); + parser_pushch(p, '\n'); + return; + } + uint32_t ch = parser_getch(p); + if (ch == '\n') { + parser_fatal( + p, "Explicit line breaks cannot be followed by a blank line"); + } + parser_pushch(p, ch); + fprintf(p->output, "\n.br\n"); +} + static void parse_text(struct parser *p) { uint32_t ch; int i = 0; @@ -153,6 +176,9 @@ parse_format(p, FORMAT_BOLD); break; case '_': parse_format(p, FORMAT_UNDERLINE); + break; + case '+': + parse_linebreak(p); break; case '\n': utf8_fputch(p->output, ch); -- 2.48.1