]> git.cameronkatri.com Git - mandoc.git/commitdiff
handle the non-portable GNU-style \[charNN], \[charNNN] character
authorIngo Schwarze <schwarze@openbsd.org>
Fri, 10 Aug 2018 22:12:44 +0000 (22:12 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Fri, 10 Aug 2018 22:12:44 +0000 (22:12 +0000)
escape sequences, used for example in the groff_char(7) manual page

TODO
mandoc.c
mandoc_char.7

diff --git a/TODO b/TODO
index fc1d3ad7e1b6215a81ac16ccc4546200fabe6e1e..f318351bf943f4283a66d515518f315fe23fe7dc 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,6 +1,6 @@
 ************************************************************************
 * Official mandoc TODO.
-* $Id: TODO,v 1.260 2018/08/10 20:40:45 schwarze Exp $
+* $Id: TODO,v 1.261 2018/08/10 22:12:44 schwarze Exp $
 ************************************************************************
 
 Many issues are annotated for difficulty as follows:
@@ -40,9 +40,10 @@ are mere guesses, and some may be wrong.
 
 - \*(.T prints the device being used,
   see groff_char(7) for an example
-
-- \[charNN], \[charNNN] prints a single-byte codepoint
-  see groff_char(7) for examples
+  This is slightly hard because -Tlocale only decides to use ascii or
+  utf8 when initializing the formatter, so the information is not
+  yet available to the preprocessor at the parsing stage.
+  loc **  exist **  algo *  size *  imp *
 
 - .ad (adjust margins)
   .ad l -- adjust left margin only (flush left)
index 1279b52ed50f90c3b21b0136afc064b384b48ef5..aaccd339826ae7d5d08e1da5afcce875026d6984 100644 (file)
--- a/mandoc.c
+++ b/mandoc.c
@@ -1,4 +1,4 @@
-/*     $Id: mandoc.c,v 1.104 2018/07/28 18:34:15 schwarze Exp $ */
+/*     $Id: mandoc.c,v 1.105 2018/08/10 22:12:44 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011-2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -41,7 +41,7 @@ enum mandoc_esc
 mandoc_escape(const char **end, const char **start, int *sz)
 {
        const char      *local_start;
-       int              local_sz;
+       int              local_sz, c, i;
        char             term;
        enum mandoc_esc  gly;
 
@@ -330,8 +330,26 @@ mandoc_escape(const char **end, const char **start, int *sz)
                }
                break;
        case ESCAPE_SPECIAL:
-               if (1 == *sz && 'c' == **start)
-                       gly = ESCAPE_NOSPACE;
+               if (**start == 'c') {
+                       if (*sz == 1) {
+                               gly = ESCAPE_NOSPACE;
+                               break;
+                       }
+                       if (*sz < 6 || *sz > 7 ||
+                           strncmp(*start, "char", 4) != 0 ||
+                           (int)strspn(*start + 4, "0123456789") + 4 < *sz)
+                               break;
+                       c = 0;
+                       for (i = 4; i < *sz; i++)
+                               c = 10 * c + ((*start)[i] - '0');
+                       if (c < 0x21 || (c > 0x7e && c < 0xa0) || c > 0xff)
+                               break;
+                       *start += 4;
+                       *sz -= 4;
+                       gly = ESCAPE_NUMBERED;
+                       break;
+               }
+
                /*
                 * Unicode escapes are defined in groff as \[u0000]
                 * to \[u10FFFF], where the contained value must be
index f63cdaea8fcc88a6a85e51e7fc6036a6c7a043ba..ad0cce838783848377d8bb6424c0976de8327414 100644 (file)
@@ -1,4 +1,4 @@
-.\"    $Id: mandoc_char.7,v 1.72 2018/08/08 14:30:48 schwarze Exp $
+.\"    $Id: mandoc_char.7,v 1.73 2018/08/10 22:12:44 schwarze Exp $
 .\"
 .\" Copyright (c) 2003 Jason McIntyre <jmc@openbsd.org>
 .\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
@@ -16,7 +16,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: August 8 2018 $
+.Dd $Mdocdate: August 10 2018 $
 .Dt MANDOC_CHAR 7
 .Os
 .Sh NAME
@@ -761,14 +761,16 @@ For backward compatibility with existing manuals,
 .Xr mandoc 1
 also supports the
 .Pp
-.Dl \eN\(aq Ns Ar number Ns \(aq
+.Dl \eN\(aq Ns Ar number Ns \(aq and \e[ Ns Cm char Ns Ar number ]
 .Pp
-escape sequence, inserting the character
+escape sequences, inserting the character
 .Ar number
 from the current character set into the output.
 Of course, this is inherently non-portable and is already marked
-as deprecated in the Heirloom roff manual.
-For example, do not use \eN\(aq34\(aq, use \e(dq, or even the plain
+as deprecated in the Heirloom roff manual;
+on top of that, the second form is a GNU extension.
+For example, do not use \eN\(aq34\(aq or \e[char34], use \e(dq,
+or even the plain
 .Sq \(dq
 character where possible.
 .Sh COMPATIBILITY