diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2014-11-19 03:08:17 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2014-11-19 03:08:17 +0000 |
commit | d447db580f83836c66e1273a0c4ccbf7bbc939eb (patch) | |
tree | e3ed791538e2e22d40928364ba431ae159bbaf98 /mdoc.c | |
parent | 2eb6f6bbb8ff74e47725a337d3eaab3f1ffa44f0 (diff) | |
download | mandoc-d447db580f83836c66e1273a0c4ccbf7bbc939eb.tar.gz mandoc-d447db580f83836c66e1273a0c4ccbf7bbc939eb.tar.zst mandoc-d447db580f83836c66e1273a0c4ccbf7bbc939eb.zip |
Escape sequences terminate high-level macro names, and when doing so,
they are ignored, just in the same way as for request names
and for low-level macro names.
This also cures a warning in the pod2man(1) preamble.
Diffstat (limited to 'mdoc.c')
-rw-r--r-- | mdoc.c | 26 |
1 files changed, 18 insertions, 8 deletions
@@ -1,4 +1,4 @@ -/* $Id: mdoc.c,v 1.228 2014/10/20 15:50:24 schwarze Exp $ */ +/* $Id: mdoc.c,v 1.229 2014/11/19 03:08:17 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2010, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org> @@ -734,37 +734,47 @@ mdoc_ptext(struct mdoc *mdoc, int line, char *buf, int offs) static int mdoc_pmacro(struct mdoc *mdoc, int ln, char *buf, int offs) { + struct mdoc_node *n; + const char *cp; enum mdoct tok; int i, sv; char mac[5]; - struct mdoc_node *n; sv = offs; /* * Copy the first word into a nil-terminated buffer. - * Stop copying when a tab, space, or eoln is encountered. + * Stop when a space, tab, escape, or eoln is encountered. */ i = 0; - while (i < 4 && '\0' != buf[offs] && ' ' != buf[offs] && - '\t' != buf[offs]) + while (i < 4 && strchr(" \t\\", buf[offs]) == NULL) mac[i++] = buf[offs++]; mac[i] = '\0'; tok = (i > 1 && i < 4) ? mdoc_hash_find(mac) : MDOC_MAX; - if (MDOC_MAX == tok) { + if (tok == MDOC_MAX) { mandoc_msg(MANDOCERR_MACRO, mdoc->parse, ln, sv, buf + sv - 1); return(1); } - /* Disregard the first trailing tab, if applicable. */ + /* Skip a leading escape sequence or tab. */ - if ('\t' == buf[offs]) + switch (buf[offs]) { + case '\\': + cp = buf + offs + 1; + mandoc_escape(&cp, NULL, NULL); + offs = cp - buf; + break; + case '\t': offs++; + break; + default: + break; + } /* Jump to the next non-whitespace word. */ |