diff options
-rw-r--r-- | mandoc.h | 3 | ||||
-rw-r--r-- | read.c | 3 | ||||
-rw-r--r-- | roff.7 | 29 | ||||
-rw-r--r-- | roff.c | 88 |
4 files changed, 72 insertions, 51 deletions
@@ -1,4 +1,4 @@ -/* $Id: mandoc.h,v 1.137 2014/07/06 19:09:00 schwarze Exp $ */ +/* $Id: mandoc.h,v 1.138 2014/07/07 11:35:06 schwarze Exp $ */ /* * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org> @@ -141,7 +141,6 @@ enum mandocerr { MANDOCERR_NONAME, /* manual name not yet set */ MANDOCERR_NOTEXT, /* skipping text before first section header */ MANDOCERR_MACRO, /* skipping unknown macro */ - MANDOCERR_REQUEST, /* NOT IMPLEMENTED: skipping request */ MANDOCERR_ARGCOUNT, /* argument count wrong */ MANDOCERR_RS_SKIP, /* skipping invalid content in .Rs block: macro */ MANDOCERR_ST_BAD, /* unknown standard specifier: standard */ @@ -1,4 +1,4 @@ -/* $Id: read.c,v 1.64 2014/07/06 19:09:00 schwarze Exp $ */ +/* $Id: read.c,v 1.65 2014/07/07 11:35:06 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org> @@ -185,7 +185,6 @@ static const char * const mandocerrs[MANDOCERR_MAX] = { "manual name not yet set", "skipping text before first section header", "skipping unknown macro", - "NOT IMPLEMENTED, please use groff: skipping request", "argument count wrong", "skipping invalid content in .Rs block", "unknown standard specifier", @@ -1,4 +1,4 @@ -.\" $Id: roff.7,v 1.54 2014/04/08 01:37:27 schwarze Exp $ +.\" $Id: roff.7,v 1.55 2014/07/07 11:35:06 schwarze Exp $ .\" .\" Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv> .\" Copyright (c) 2010, 2011, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org> @@ -15,7 +15,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: April 8 2014 $ +.Dd $Mdocdate: July 7 2014 $ .Dt ROFF 7 .Os .Sh NAME @@ -409,24 +409,21 @@ and the number of arguments is not checked. Append to a macro definition. The syntax of this request is the same as that of .Sx \&de . -It is currently ignored by -.Xr mandoc 1 , -as are its children. .Ss \&ami Append to a macro definition, specifying the macro name indirectly. The syntax of this request is the same as that of .Sx \&dei . -It is currently ignored by -.Xr mandoc 1 , -as are its children. .Ss \&am1 Append to a macro definition, switching roff compatibility mode off during macro execution. The syntax of this request is the same as that of .Sx \&de1 . -It is currently ignored by -.Xr mandoc 1 , -as are its children. +Since +.Xr mandoc 1 +does not implement +.Nm +compatibility mode at all, it handles this request as an alias for +.Sx \&am . .Ss \&as Append to a user-defined string. The syntax of this request is the same as that of @@ -554,9 +551,13 @@ Define a macro, specifying the macro name indirectly. The syntax of this request is the same as that of .Sx \&de . -It is currently ignored by -.Xr mandoc 1 , -as are its children. +The request +.Pp +.D1 Pf . Cm \&dei Ar name Op Ar end +.Pp +has the same effect as: +.Pp +.D1 Pf . Cm \&de No \e* Ns Bo Ar name Bc Op \e* Ns Bq Ar end .Ss \&de1 Define a .Nm @@ -1,4 +1,4 @@ -/* $Id: roff.c,v 1.219 2014/07/06 19:09:00 schwarze Exp $ */ +/* $Id: roff.c,v 1.220 2014/07/07 11:35:06 schwarze Exp $ */ /* * Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org> @@ -847,11 +847,10 @@ roff_cblock(ROFF_ARGS) switch (r->last->tok) { case ROFF_am: + /* ROFF_am1 is remapped to ROFF_am in roff_block(). */ /* FALLTHROUGH */ case ROFF_ami: /* FALLTHROUGH */ - case ROFF_am1: - /* FALLTHROUGH */ case ROFF_de: /* ROFF_de1 is remapped to ROFF_de in roff_block(). */ /* FALLTHROUGH */ @@ -919,34 +918,47 @@ roff_ccond(struct roff *r, int ln, int ppos) static enum rofferr roff_block(ROFF_ARGS) { - char *name, *cp; + const char *name; + char *iname, *cp; size_t namesz; - name = cp = *bufp + pos; - namesz = 0; - - if (ROFF_ig != tok) { - if ('\0' == *cp) { - mandoc_msg(MANDOCERR_REQ_EMPTY, r->parse, - ln, ppos, roffs[tok].name); - return(ROFF_IGN); - } + /* Ignore groff compatibility mode for now. */ - /* - * Re-write `de1', since we don't really care about - * groff's strange compatibility mode, into `de'. - */ + if (ROFF_de1 == tok) + tok = ROFF_de; + else if (ROFF_am1 == tok) + tok = ROFF_am; - if (ROFF_de1 == tok) - tok = ROFF_de; - else if (ROFF_de != tok) - mandoc_msg(MANDOCERR_REQUEST, r->parse, ln, ppos, - roffs[tok].name); + /* Parse the macro name argument. */ + cp = *bufp + pos; + if (ROFF_ig == tok) { + iname = NULL; + namesz = 0; + } else { + iname = cp; namesz = roff_getname(r, &cp, ln, ppos); - name[namesz] = '\0'; + iname[namesz] = '\0'; + } + + /* Resolve the macro name argument if it is indirect. */ + + if (namesz && (ROFF_dei == tok || ROFF_ami == tok)) { + if (NULL == (name = roff_getstrn(r, iname, namesz))) { + mandoc_vmsg(MANDOCERR_STR_UNDEF, + r->parse, ln, (int)(iname - *bufp), + "%.*s", (int)namesz, iname); + namesz = 0; + } else + namesz = strlen(name); } else - name = NULL; + name = iname; + + if (0 == namesz && ROFF_ig != tok) { + mandoc_msg(MANDOCERR_REQ_EMPTY, r->parse, + ln, ppos, roffs[tok].name); + return(ROFF_IGN); + } roffnode_push(r, tok, name, ln, ppos); @@ -956,16 +968,30 @@ roff_block(ROFF_ARGS) * appended from roff_block_text() in multiline mode. */ - if (namesz && ROFF_de == tok) + if (ROFF_de == tok || ROFF_dei == tok) roff_setstrn(&r->strtab, name, namesz, "", 0, 0); if ('\0' == *cp) return(ROFF_IGN); - /* If present, process the custom end-of-line marker. */ + /* Get the custom end marker. */ - name = cp; + iname = cp; namesz = roff_getname(r, &cp, ln, ppos); + + /* Resolve the end marker if it is indirect. */ + + if (namesz && (ROFF_dei == tok || ROFF_ami == tok)) { + if (NULL == (name = roff_getstrn(r, iname, namesz))) { + mandoc_vmsg(MANDOCERR_STR_UNDEF, + r->parse, ln, (int)(iname - *bufp), + "%.*s", (int)namesz, iname); + namesz = 0; + } else + namesz = strlen(name); + } else + name = iname; + if (namesz) r->last->end = mandoc_strndup(name, namesz); @@ -1020,12 +1046,8 @@ roff_block_sub(ROFF_ARGS) t = roff_parse(r, *bufp, &pos, ln, ppos); - /* - * Macros other than block-end are only significant - * in `de' blocks; elsewhere, simply throw them away. - */ if (ROFF_cblock != t) { - if (ROFF_de == tok) + if (ROFF_ig != tok) roff_setstr(r, r->last->name, *bufp + ppos, 2); return(ROFF_IGN); } @@ -1038,7 +1060,7 @@ static enum rofferr roff_block_text(ROFF_ARGS) { - if (ROFF_de == tok) + if (ROFF_ig != tok) roff_setstr(r, r->last->name, *bufp + pos, 2); return(ROFF_IGN); |