version 1.9, 2022/06/05 10:19:54 |
version 1.13, 2022/06/07 09:54:40 |
|
|
/* $OpenBSD$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2011, 2012, 2013, 2014, 2015, 2017, 2018, 2020, 2022 |
* Copyright (c) 2011, 2012, 2013, 2014, 2015, 2017, 2018, 2020, 2022 |
* Ingo Schwarze <schwarze@openbsd.org> |
* Ingo Schwarze <schwarze@openbsd.org> |
Line 206 roff_escape(const char *buf, const int ln, const int a |
|
Line 206 roff_escape(const char *buf, const int ln, const int a |
|
term = '\b'; |
term = '\b'; |
break; |
break; |
case 'C': |
case 'C': |
if (buf[iarg] != '\'') { |
|
rval = ESCAPE_ERROR; |
|
goto out; |
|
} |
|
rval = ESCAPE_SPECIAL; |
rval = ESCAPE_SPECIAL; |
term = '\b'; |
term = '\b'; |
break; |
break; |
Line 274 roff_escape(const char *buf, const int ln, const int a |
|
Line 270 roff_escape(const char *buf, const int ln, const int a |
|
goto out_sub; |
goto out_sub; |
|
|
if (term == '\b') { |
if (term == '\b') { |
if ((buf[inam] == 'N' && isdigit((unsigned char)buf[iarg])) || |
if (strchr("BDHLRSvxNhl", buf[inam]) != NULL && |
(buf[inam] == 'h' && strchr(" %&()*+-./0123456789:<=>", |
strchr(" %&()*+-./0123456789:<=>", buf[iarg]) != NULL) { |
buf[iarg]) != NULL)) { |
err = MANDOCERR_ESC_DELIM; |
iendarg = iend = iarg + 1; |
if (rval != ESCAPE_EXPAND) |
rval = ESCAPE_ERROR; |
rval = ESCAPE_ERROR; |
goto out; |
if (buf[inam] != 'D') { |
|
iendarg = iend = iarg + 1; |
|
goto out; |
|
} |
} |
} |
term = buf[iarg++]; |
term = buf[iarg++]; |
} else if (term == '\0' && maxl == INT_MAX) { |
} else if (term == '\0' && maxl == INT_MAX) { |
Line 293 roff_escape(const char *buf, const int ln, const int a |
|
Line 292 roff_escape(const char *buf, const int ln, const int a |
|
case '[': |
case '[': |
if (buf[++iarg] == ' ') { |
if (buf[++iarg] == ' ') { |
iendarg = iend = iarg + 1; |
iendarg = iend = iarg + 1; |
|
err = MANDOCERR_ESC_ARG; |
rval = ESCAPE_ERROR; |
rval = ESCAPE_ERROR; |
goto out; |
goto out; |
} |
} |
Line 310 roff_escape(const char *buf, const int ln, const int a |
|
Line 310 roff_escape(const char *buf, const int ln, const int a |
|
iendarg = iarg; |
iendarg = iarg; |
while (maxl > 0) { |
while (maxl > 0) { |
if (buf[iendarg] == '\0') { |
if (buf[iendarg] == '\0') { |
|
err = MANDOCERR_ESC_INCOMPLETE; |
|
if (rval != ESCAPE_EXPAND) |
|
rval = ESCAPE_ERROR; |
/* Ignore an incomplete argument except for \w. */ |
/* Ignore an incomplete argument except for \w. */ |
if (buf[inam] != 'w') |
if (buf[inam] != 'w') |
iendarg = iarg; |
iendarg = iarg; |
if (rval == ESCAPE_EXPAND) |
|
err = MANDOCERR_ESC_BAD; |
|
else |
|
rval = ESCAPE_ERROR; |
|
break; |
break; |
} |
} |
if (buf[iendarg] == term) { |
if (buf[iendarg] == term) { |
Line 371 roff_escape(const char *buf, const int ln, const int a |
|
Line 370 roff_escape(const char *buf, const int ln, const int a |
|
case '2': |
case '2': |
case '3': |
case '3': |
case '4': |
case '4': |
rval = argl == 1 ? ESCAPE_IGNORE : ESCAPE_ERROR; |
if (argl == 1) |
|
rval = ESCAPE_IGNORE; |
|
else { |
|
err = MANDOCERR_ESC_ARG; |
|
rval = ESCAPE_ERROR; |
|
} |
break; |
break; |
case '5': |
case '5': |
rval = buf[iarg - 1] == '[' ? ESCAPE_UNSUPP : |
if (buf[iarg - 1] == '[') |
ESCAPE_ERROR; |
rval = ESCAPE_UNSUPP; |
|
else { |
|
err = MANDOCERR_ESC_ARG; |
|
rval = ESCAPE_ERROR; |
|
} |
break; |
break; |
default: |
default: |
|
err = MANDOCERR_ESC_ARG; |
rval = ESCAPE_ERROR; |
rval = ESCAPE_ERROR; |
break; |
break; |
} |
} |
Line 389 roff_escape(const char *buf, const int ln, const int a |
|
Line 398 roff_escape(const char *buf, const int ln, const int a |
|
switch (rval) { |
switch (rval) { |
case ESCAPE_FONT: |
case ESCAPE_FONT: |
rval = mandoc_font(buf + iarg, argl); |
rval = mandoc_font(buf + iarg, argl); |
|
if (rval == ESCAPE_ERROR) |
|
err = MANDOCERR_ESC_ARG; |
break; |
break; |
|
|
case ESCAPE_SPECIAL: |
case ESCAPE_SPECIAL: |
|
if (argl == 0) { |
|
err = MANDOCERR_ESC_BADCHAR; |
|
rval = ESCAPE_ERROR; |
|
break; |
|
} |
|
|
/* |
/* |
* The file chars.c only provides one common list of |
* The file chars.c only provides one common list of |
Line 401 roff_escape(const char *buf, const int ln, const int a |
|
Line 417 roff_escape(const char *buf, const int ln, const int a |
|
*/ |
*/ |
|
|
if (term != '\0' && argl == 1 && buf[iarg] != '-') { |
if (term != '\0' && argl == 1 && buf[iarg] != '-') { |
|
err = MANDOCERR_ESC_BADCHAR; |
rval = ESCAPE_ERROR; |
rval = ESCAPE_ERROR; |
break; |
break; |
} |
} |
Line 416 roff_escape(const char *buf, const int ln, const int a |
|
Line 433 roff_escape(const char *buf, const int ln, const int a |
|
c = 0; |
c = 0; |
for (i = iarg; i < iendarg; i++) |
for (i = iarg; i < iendarg; i++) |
c = 10 * c + (buf[i] - '0'); |
c = 10 * c + (buf[i] - '0'); |
if (c < 0x21 || (c > 0x7e && c < 0xa0) || c > 0xff) |
if (c < 0x21 || (c > 0x7e && c < 0xa0) || c > 0xff) { |
|
err = MANDOCERR_ESC_BADCHAR; |
break; |
break; |
|
} |
iarg += 4; |
iarg += 4; |
rval = ESCAPE_NUMBERED; |
rval = ESCAPE_NUMBERED; |
break; |
break; |
Line 433 roff_escape(const char *buf, const int ln, const int a |
|
Line 452 roff_escape(const char *buf, const int ln, const int a |
|
if (buf[iarg] != 'u' || argl < 5 || argl > 7) |
if (buf[iarg] != 'u' || argl < 5 || argl > 7) |
break; |
break; |
if (argl == 7 && |
if (argl == 7 && |
(buf[iarg + 1] != '1' || buf[iarg + 2] != '0')) |
(buf[iarg + 1] != '1' || buf[iarg + 2] != '0')) { |
|
err = MANDOCERR_ESC_BADCHAR; |
break; |
break; |
if (argl == 6 && buf[iarg + 1] == '0') |
} |
|
if (argl == 6 && buf[iarg + 1] == '0') { |
|
err = MANDOCERR_ESC_BADCHAR; |
break; |
break; |
|
} |
if (argl == 5 && buf[iarg + 1] == 'D' && |
if (argl == 5 && buf[iarg + 1] == 'D' && |
strchr("89ABCDEF", buf[iarg + 2]) != NULL) |
strchr("89ABCDEF", buf[iarg + 2]) != NULL) { |
|
err = MANDOCERR_ESC_BADCHAR; |
break; |
break; |
|
} |
if ((int)strspn(buf + iarg + 1, "0123456789ABCDEFabcdef") |
if ((int)strspn(buf + iarg + 1, "0123456789ABCDEFabcdef") |
+ 1 == argl) |
+ 1 == argl) |
rval = ESCAPE_UNICODE; |
rval = ESCAPE_UNICODE; |
|
|
|
|
*resc = iesc; |
*resc = iesc; |
switch (rval) { |
switch (rval) { |
case ESCAPE_ERROR: |
|
err = MANDOCERR_ESC_BAD; |
|
break; |
|
case ESCAPE_UNSUPP: |
case ESCAPE_UNSUPP: |
err = MANDOCERR_ESC_UNSUPP; |
err = MANDOCERR_ESC_UNSUPP; |
break; |
break; |
|
|
err = MANDOCERR_ESC_UNDEF; |
err = MANDOCERR_ESC_UNDEF; |
break; |
break; |
case ESCAPE_SPECIAL: |
case ESCAPE_SPECIAL: |
if (mchars_spec2cp(buf + iarg, argl) < 0) |
if (mchars_spec2cp(buf + iarg, argl) >= 0) |
err = MANDOCERR_ESC_BAD; |
err = MANDOCERR_OK; |
|
else if (err == MANDOCERR_OK) |
|
err = MANDOCERR_ESC_UNKCHAR; |
break; |
break; |
default: |
default: |
break; |
break; |