=================================================================== RCS file: /cvs/mandoc/roff.c,v retrieving revision 1.247 retrieving revision 1.250 diff -u -p -r1.247 -r1.250 --- mandoc/roff.c 2015/01/01 19:28:49 1.247 +++ mandoc/roff.c 2015/01/16 16:53:49 1.250 @@ -1,4 +1,4 @@ -/* $Id: roff.c,v 1.247 2015/01/01 19:28:49 schwarze Exp $ */ +/* $Id: roff.c,v 1.250 2015/01/16 16:53:49 schwarze Exp $ */ /* * Copyright (c) 2010, 2011, 2012, 2014 Kristaps Dzonsons * Copyright (c) 2010-2015 Ingo Schwarze @@ -75,6 +75,7 @@ enum rofft { ROFF_T_, ROFF_EQ, ROFF_EN, + ROFF_IX, ROFF_cblock, ROFF_USERDEF, ROFF_MAX @@ -274,6 +275,7 @@ static struct roffmac roffs[ROFF_MAX] = { { "T&", roff_T_, NULL, NULL, 0, NULL }, { "EQ", roff_EQ, NULL, NULL, 0, NULL }, { "EN", roff_EN, NULL, NULL, 0, NULL }, + { "IX", roff_line_ignore, NULL, NULL, 0, NULL }, { ".", roff_cblock, NULL, NULL, 0, NULL }, { NULL, roff_userdef, NULL, NULL, 0, NULL }, }; @@ -2103,7 +2105,7 @@ roff_tr(ROFF_ARGS) static enum rofferr roff_so(ROFF_ARGS) { - char *name; + char *name, *cp; name = buf->buf + pos; mandoc_vmsg(MANDOCERR_SO, r->parse, ln, ppos, "so %s", name); @@ -2118,7 +2120,12 @@ roff_so(ROFF_ARGS) if (*name == '/' || strstr(name, "../") || strstr(name, "/..")) { mandoc_vmsg(MANDOCERR_SO_PATH, r->parse, ln, ppos, ".so %s", name); - return(ROFF_ERR); + buf->sz = mandoc_asprintf(&cp, + ".sp\nSee the file %s.\n.sp", name) + 1; + free(buf->buf); + buf->buf = cp; + *offs = 0; + return(ROFF_REPARSE); } *offs = pos; @@ -2169,6 +2176,7 @@ roff_userdef(ROFF_ARGS) buf->buf = n1; if (buf->sz == 0) buf->sz = strlen(buf->buf) + 1; + *offs = 0; return(buf->sz > 1 && buf->buf[buf->sz - 2] == '\n' ? ROFF_REPARSE : ROFF_APPEND);