]> git.cameronkatri.com Git - mandoc.git/commitdiff
Split the excessively generic diagnostic message "invalid escape sequence"
authorIngo Schwarze <schwarze@openbsd.org>
Tue, 7 Jun 2022 09:54:40 +0000 (09:54 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Tue, 7 Jun 2022 09:54:40 +0000 (09:54 +0000)
into the more specific messages "invalid escape argument delimiter"
and "invalid escape sequence argument".

mandoc.1
mandoc.h
mandoc_msg.c
regress/char/space/invalid.out_lint
regress/roff/esc/O1.out_lint
regress/roff/esc/h.out_lint
regress/roff/esc/l.in
regress/roff/esc/l.out_ascii
regress/roff/esc/l.out_lint
roff_escape.c

index e2cd0b5c01334bb9a1fbd98786df4797888faf1b..aa6274ae2de708ff6b383c82ce52db4a7d9bbc27 100644 (file)
--- a/mandoc.1
+++ b/mandoc.1
@@ -1,4 +1,4 @@
-.\" $Id: mandoc.1,v 1.259 2022/06/05 13:54:09 schwarze Exp $
+.\" $Id: mandoc.1,v 1.260 2022/06/07 09:54:40 schwarze Exp $
 .\"
 .\" Copyright (c) 2012, 2014-2022 Ingo Schwarze <schwarze@openbsd.org>
 .\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
 .\"
 .\" Copyright (c) 2012, 2014-2022 Ingo Schwarze <schwarze@openbsd.org>
 .\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
@@ -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.
 .\"
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: June 5 2022 $
+.Dd $Mdocdate: June 7 2022 $
 .Dt MANDOC 1
 .Os
 .Sh NAME
 .Dt MANDOC 1
 .Os
 .Sh NAME
@@ -1797,10 +1797,9 @@ it is hard to predict which tab stop position the tab will advance to.
 .Pq mdoc
 A new sentence starts in the middle of a text line.
 Start it on a new input line to help formatters produce correct spacing.
 .Pq mdoc
 A new sentence starts in the middle of a text line.
 Start it on a new input line to help formatters produce correct spacing.
-.It Sy "invalid escape sequence"
+.It Sy "invalid escape sequence argument"
 .Pq roff
 .Pq roff
-An escape sequence has an invalid opening argument delimiter
-or the argument is of an invalid form.
+The argument of an escape sequence is of an invalid form.
 Invalid escape sequences are ignored.
 .It Sy "undefined escape, printing literally"
 .Pq roff
 Invalid escape sequences are ignored.
 .It Sy "undefined escape, printing literally"
 .Pq roff
@@ -2314,6 +2313,18 @@ The escape sequence is ignored.
 The name given in a special character escape sequence is not known to
 .Nm .
 The escape sequence is ignored.
 The name given in a special character escape sequence is not known to
 .Nm .
 The escape sequence is ignored.
+.It Sy "invalid escape argument delimiter"
+.Pq roff
+An escape sequence that expects a numerical argument
+attempts to employ one of the characters
+.Qq " %&()*+-./0123456789:<=>"
+as an argument delimiter.
+The escape sequence is ignored including the invalid opening delimiter
+and the rest of the argument may appear as output text.
+While various charcters can be used as argument delimiters,
+using the apostrophe-quote character
+.Pq Sq \(aq
+is recommended for readability and robustness.
 .El
 .Ss Unsupported features
 .Bl -ohang
 .El
 .Ss Unsupported features
 .Bl -ohang
index f50405e9ad0b58b137e612cbcaa59ebab9fa0e81..7fd34ed4cd0dff34f8ec9824cabefe6d1ed64440 100644 (file)
--- a/mandoc.h
+++ b/mandoc.h
@@ -1,4 +1,4 @@
-/* $Id: mandoc.h,v 1.278 2022/06/05 13:54:09 schwarze Exp $ */
+/* $Id: mandoc.h,v 1.279 2022/06/07 09:54:40 schwarze Exp $ */
 /*
  * Copyright (c) 2012-2022 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2010, 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
 /*
  * Copyright (c) 2012-2022 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2010, 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
@@ -172,7 +172,7 @@ enum        mandocerr {
        MANDOCERR_FI_BLANK, /* blank line in fill mode, using .sp */
        MANDOCERR_FI_TAB, /* tab in filled text */
        MANDOCERR_EOS, /* new sentence, new line */
        MANDOCERR_FI_BLANK, /* blank line in fill mode, using .sp */
        MANDOCERR_FI_TAB, /* tab in filled text */
        MANDOCERR_EOS, /* new sentence, new line */
-       MANDOCERR_ESC_BAD, /* invalid escape sequence: esc */
+       MANDOCERR_ESC_ARG, /* invalid escape sequence argument: esc */
        MANDOCERR_ESC_UNDEF, /* undefined escape, printing literally: char */
        MANDOCERR_STR_UNDEF, /* undefined string, using "": name */
 
        MANDOCERR_ESC_UNDEF, /* undefined escape, printing literally: char */
        MANDOCERR_STR_UNDEF, /* undefined string, using "": name */
 
@@ -239,6 +239,7 @@ enum        mandocerr {
        MANDOCERR_ESC_INCOMPLETE, /* incomplete escape sequence: esc */
        MANDOCERR_ESC_BADCHAR, /* invalid special character: esc */
        MANDOCERR_ESC_UNKCHAR, /* unknown special character: esc */
        MANDOCERR_ESC_INCOMPLETE, /* incomplete escape sequence: esc */
        MANDOCERR_ESC_BADCHAR, /* invalid special character: esc */
        MANDOCERR_ESC_UNKCHAR, /* unknown special character: esc */
+       MANDOCERR_ESC_DELIM, /* invalid escape argument delimiter: esc */
 
        MANDOCERR_UNSUPP, /* ===== start of unsupported features ===== */
 
 
        MANDOCERR_UNSUPP, /* ===== start of unsupported features ===== */
 
index 566a140e6e68bb4a772b9465a52587421ed3daf6..baa709c70c83e20723797ed213a81ecbebf02627 100644 (file)
@@ -173,7 +173,7 @@ static      const char *const type_message[MANDOCERR_MAX] = {
        "blank line in fill mode, using .sp",
        "tab in filled text",
        "new sentence, new line",
        "blank line in fill mode, using .sp",
        "tab in filled text",
        "new sentence, new line",
-       "invalid escape sequence",
+       "invalid escape sequence argument",
        "undefined escape, printing literally",
        "undefined string, using \"\"",
 
        "undefined escape, printing literally",
        "undefined string, using \"\"",
 
@@ -240,6 +240,7 @@ static      const char *const type_message[MANDOCERR_MAX] = {
        "incomplete escape sequence",
        "invalid special character",
        "unknown special character",
        "incomplete escape sequence",
        "invalid special character",
        "unknown special character",
+       "invalid escape argument delimiter",
 
        "unsupported feature",
        "input too large",
 
        "unsupported feature",
        "input too large",
index 4c146853c3d4b69cb7c74039436efa92b0d0e923..3838375973f7679a0b534c5564881fa165486664 100644 (file)
@@ -1,4 +1,4 @@
-mandoc: invalid.in:7:15: WARNING: invalid escape sequence: \[ 
+mandoc: invalid.in:7:15: WARNING: invalid escape sequence argument: \[ 
 mandoc: invalid.in:8:14: ERROR: invalid special character: \[%]
 mandoc: invalid.in:9:16: ERROR: invalid special character: \[&]
 mandoc: invalid.in:10:12: ERROR: invalid special character: \[:]
 mandoc: invalid.in:8:14: ERROR: invalid special character: \[%]
 mandoc: invalid.in:9:16: ERROR: invalid special character: \[&]
 mandoc: invalid.in:10:12: ERROR: invalid special character: \[:]
index a5b29379bf69ac6b7e248da8f9915e1eead93077..032d1f137f3f9eafdbaa8cb55b4ec9a2fff17887 100644 (file)
@@ -1,5 +1,5 @@
-mandoc: O1.in:11:6: WARNING: invalid escape sequence: \O5
-mandoc: O1.in:12:7: WARNING: invalid escape sequence: \O(52
+mandoc: O1.in:11:6: WARNING: invalid escape sequence argument: \O5
+mandoc: O1.in:12:7: WARNING: invalid escape sequence argument: \O(52
 mandoc: O1.in:13:7: UNSUPP: unsupported escape sequence: \O[5dummy]
 mandoc: O1.in:13:7: UNSUPP: unsupported escape sequence: \O[5dummy]
-mandoc: O1.in:14:6: WARNING: invalid escape sequence: \O6
+mandoc: O1.in:14:6: WARNING: invalid escape sequence argument: \O6
 mandoc: O1.in:15:6: UNSUPP: unsupported escape sequence: \O0
 mandoc: O1.in:15:6: UNSUPP: unsupported escape sequence: \O0
index b32ea2d2d3e91d5492c74059f0a3a597f2fa00ed..99d6a1d4651324cc54a065b4e7f3692ae52ca38d 100644 (file)
@@ -1 +1 @@
-mandoc: h.in:23:21: WARNING: invalid escape sequence: \h-
+mandoc: h.in:23:21: ERROR: invalid escape argument delimiter: \h-
index d7a42e742cc7571df4da05612b2184e24a31ac73..47b02d8c7d0947068e943b2a8c2676513bc0c771 100644 (file)
@@ -1,5 +1,5 @@
-.\" $OpenBSD: l.in,v 1.2 2017/07/04 14:53:27 schwarze Exp $
-.Dd $Mdocdate: July 4 2017 $
+.\" $OpenBSD: l.in,v 1.3 2022/06/07 09:51:03 schwarze Exp $
+.Dd $Mdocdate: June 7 2022 $
 .Dt ESC-L 1
 .Os
 .Sh NAME
 .Dt ESC-L 1
 .Os
 .Sh NAME
@@ -20,4 +20,4 @@ default unit and escape char: >\l'7n\(at'<
 .br
 rounding: >\l'0.26ix'<
 .br
 .br
 rounding: >\l'0.26ix'<
 .br
-invalid delimiter: >\h-<
+invalid delimiter: >\l-<
index fa052d229462281bbfc84a9580aeafe878a77eb8..9e34d79bb208a143c0d6eaf9b7cf62cde3ad38db 100644 (file)
@@ -13,4 +13,4 @@ D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
      rounding: >xxx<
      invalid delimiter: ><
 
      rounding: >xxx<
      invalid delimiter: ><
 
-OpenBSD                          July 4, 2017                          OpenBSD
+OpenBSD                          June 7, 2022                          OpenBSD
index 00a8eaf2be56b8b6203f53e468baec52cc42ba20..87df1bddb3f93e3ea3240c3ff5f48afe176d9874 100644 (file)
@@ -1 +1 @@
-mandoc: l.in:23:21: WARNING: invalid escape sequence: \h-
+mandoc: l.in:23:21: ERROR: invalid escape argument delimiter: \l-
index 3fdcf8d251305701bb89178253a84d9283e687b4..333e0e3fe47094da9b49b49ac3a4e231d0ad298f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: roff_escape.c,v 1.12 2022/06/06 19:23:13 schwarze Exp $ */
+/* $Id: roff_escape.c,v 1.13 2022/06/07 09:54:40 schwarze Exp $ */
 /*
  * Copyright (c) 2011, 2012, 2013, 2014, 2015, 2017, 2018, 2020, 2022
  *               Ingo Schwarze <schwarze@openbsd.org>
 /*
  * Copyright (c) 2011, 2012, 2013, 2014, 2015, 2017, 2018, 2020, 2022
  *               Ingo Schwarze <schwarze@openbsd.org>
@@ -272,6 +272,7 @@ roff_escape(const char *buf, const int ln, const int aesc,
        if (term == '\b') {
                if (strchr("BDHLRSvxNhl", buf[inam]) != NULL &&
                    strchr(" %&()*+-./0123456789:<=>", buf[iarg]) != NULL) {
        if (term == '\b') {
                if (strchr("BDHLRSvxNhl", buf[inam]) != NULL &&
                    strchr(" %&()*+-./0123456789:<=>", buf[iarg]) != NULL) {
+                       err = MANDOCERR_ESC_DELIM;
                        if (rval != ESCAPE_EXPAND)
                                rval = ESCAPE_ERROR;
                        if (buf[inam] != 'D') {
                        if (rval != ESCAPE_EXPAND)
                                rval = ESCAPE_ERROR;
                        if (buf[inam] != 'D') {
@@ -291,6 +292,7 @@ roff_escape(const char *buf, const int ln, const int aesc,
                case '[':
                        if (buf[++iarg] == ' ') {
                                iendarg = iend = iarg + 1;
                case '[':
                        if (buf[++iarg] == ' ') {
                                iendarg = iend = iarg + 1;
+                               err = MANDOCERR_ESC_ARG;
                                rval = ESCAPE_ERROR;
                                goto out;
                        }
                                rval = ESCAPE_ERROR;
                                goto out;
                        }
@@ -368,13 +370,23 @@ roff_escape(const char *buf, const int ln, const int aesc,
                case '2':
                case '3':
                case '4':
                case '2':
                case '3':
                case '4':
-                       rval = argl == 1 ? ESCAPE_IGNORE : ESCAPE_ERROR;
+                       if (argl == 1)
+                               rval = ESCAPE_IGNORE;
+                       else {
+                               err = MANDOCERR_ESC_ARG;
+                               rval = ESCAPE_ERROR;
+                       }
                        break;
                case '5':
                        break;
                case '5':
-                       rval = buf[iarg - 1] == '[' ? ESCAPE_UNSUPP :
-                           ESCAPE_ERROR;
+                       if (buf[iarg - 1] == '[')
+                               rval = ESCAPE_UNSUPP;
+                       else {
+                               err = MANDOCERR_ESC_ARG;
+                               rval = ESCAPE_ERROR;
+                       }
                        break;
                default:
                        break;
                default:
+                       err = MANDOCERR_ESC_ARG;
                        rval = ESCAPE_ERROR;
                        break;
                }
                        rval = ESCAPE_ERROR;
                        break;
                }
@@ -386,6 +398,8 @@ roff_escape(const char *buf, const int ln, const int aesc,
        switch (rval) {
        case ESCAPE_FONT:
                rval = mandoc_font(buf + iarg, argl);
        switch (rval) {
        case ESCAPE_FONT:
                rval = mandoc_font(buf + iarg, argl);
+               if (rval == ESCAPE_ERROR)
+                       err = MANDOCERR_ESC_ARG;
                break;
 
        case ESCAPE_SPECIAL:
                break;
 
        case ESCAPE_SPECIAL:
@@ -487,10 +501,6 @@ out:
 
        *resc = iesc;
        switch (rval) {
 
        *resc = iesc;
        switch (rval) {
-       case ESCAPE_ERROR:
-               if (err == MANDOCERR_OK)
-                       err = MANDOCERR_ESC_BAD;
-               break;
        case ESCAPE_UNSUPP:
                err = MANDOCERR_ESC_UNSUPP;
                break;
        case ESCAPE_UNSUPP:
                err = MANDOCERR_ESC_UNSUPP;
                break;