]> git.cameronkatri.com Git - mandoc.git/commitdiff
Flip on unicode output (via \[uNNNN]) in -T[x]html. Here we go!
authorKristaps Dzonsons <kristaps@bsd.lv>
Tue, 17 May 2011 11:50:20 +0000 (11:50 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Tue, 17 May 2011 11:50:20 +0000 (11:50 +0000)
chars.c
html.c
mandoc.3
mandoc.h

diff --git a/chars.c b/chars.c
index 06a2a923f691958889c9142fdfbea4028c03c735..808d70d7bb0fb469c1143de7426580d1cb76810c 100644 (file)
--- a/chars.c
+++ b/chars.c
@@ -1,4 +1,4 @@
-/*     $Id: chars.c,v 1.43 2011/05/15 22:29:50 kristaps Exp $ */
+/*     $Id: chars.c,v 1.44 2011/05/17 11:50:20 kristaps Exp $ */
 /*
  * Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
 /*
  * Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -138,7 +138,7 @@ mchars_res2cp(struct mchars *arg, const char *p, size_t sz)
 }
 
 /*
 }
 
 /*
- * Numbered character to literal character.
+ * Numbered character string to ASCII codepoint.
  * This can only be a printable character (i.e., alnum, punct, space) so
  * prevent the character from ruining our state (backspace, newline, and
  * so on).
  * This can only be a printable character (i.e., alnum, punct, space) so
  * prevent the character from ruining our state (backspace, newline, and
  * so on).
@@ -151,10 +151,24 @@ mchars_num2char(const char *p, size_t sz)
 
        if ((i = mandoc_strntou(p, sz, 10)) < 0)
                return('\0');
 
        if ((i = mandoc_strntou(p, sz, 10)) < 0)
                return('\0');
-
        return(isprint(i) ? i : '\0');
 }
 
        return(isprint(i) ? i : '\0');
 }
 
+/*
+ * Hex character string to Unicode codepoint.
+ * If the character is illegal, returns '\0'.
+ */
+int
+mchars_num2uc(const char *p, size_t sz)
+{
+       int               i;
+
+       if ((i = mandoc_strntou(p, sz, 16)) < 0)
+               return('\0');
+       /* FIXME: make sure we're not in a bogus range. */
+       return(i > 0x80 && i <= 0x10FFFF ? i : '\0');
+}
+
 /* 
  * Special character to string array.
  */
 /* 
  * Special character to string array.
  */
diff --git a/html.c b/html.c
index a50d2eb03adab1d2b14a203b52204e2fccf67d91..fd696284da16c411505bcc8ae920e964da4af817 100644 (file)
--- a/html.c
+++ b/html.c
@@ -1,4 +1,4 @@
-/*     $Id: html.c,v 1.143 2011/05/17 11:38:18 kristaps Exp $ */
+/*     $Id: html.c,v 1.144 2011/05/17 11:50:20 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -315,6 +315,8 @@ html_strlen(const char *cp)
                switch (mandoc_escape(&cp, &seq, &ssz)) {
                case (ESCAPE_ERROR):
                        return(sz);
                switch (mandoc_escape(&cp, &seq, &ssz)) {
                case (ESCAPE_ERROR):
                        return(sz);
+               case (ESCAPE_UNICODE):
+                       /* FALLTHROUGH */
                case (ESCAPE_NUMBERED):
                        /* FALLTHROUGH */
                case (ESCAPE_PREDEF):
                case (ESCAPE_NUMBERED):
                        /* FALLTHROUGH */
                case (ESCAPE_PREDEF):
@@ -373,6 +375,12 @@ print_encode(struct html *h, const char *p, int norecurse)
                        break;
 
                switch (esc) {
                        break;
 
                switch (esc) {
+               case (ESCAPE_UNICODE):
+                       /* Skip passed "u" header. */
+                       c = mchars_num2uc(seq + 1, len - 1);
+                       if ('\0' != c)
+                               printf("&#x%x;", c);
+                       break;
                case (ESCAPE_NUMBERED):
                        c = mchars_num2char(seq, len);
                        if ('\0' != c)
                case (ESCAPE_NUMBERED):
                        c = mchars_num2char(seq, len);
                        if ('\0' != c)
index 66148c4d12a6042db12a1243264b03ff5936e12b..0521e3916ab7655e1906c66850dd0dadfbb62db6 100644 (file)
--- a/mandoc.3
+++ b/mandoc.3
@@ -1,4 +1,4 @@
-.\"    $Id: mandoc.3,v 1.6 2011/05/01 10:40:52 kristaps Exp $
+.\"    $Id: mandoc.3,v 1.7 2011/05/17 11:50:20 kristaps Exp $
 .\"
 .\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
 .\" Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
 .\"
 .\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
 .\" Copyright (c) 2010 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.
 .\"
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: May 1 2011 $
+.Dd $Mdocdate: May 17 2011 $
 .Dt MANDOC 3
 .Os
 .Sh NAME
 .Dt MANDOC 3
 .Os
 .Sh NAME
@@ -26,6 +26,7 @@
 .Nm mchars_alloc ,
 .Nm mchars_free ,
 .Nm mchars_num2char ,
 .Nm mchars_alloc ,
 .Nm mchars_free ,
 .Nm mchars_num2char ,
+.Nm mchars_num2uc ,
 .Nm mchars_res2cp ,
 .Nm mchars_res2str ,
 .Nm mchars_spec2cp ,
 .Nm mchars_res2cp ,
 .Nm mchars_res2str ,
 .Nm mchars_spec2cp ,
@@ -64,6 +65,8 @@
 .Fn mchars_free "struct mchars *p"
 .Ft char
 .Fn mchars_num2char "const char *cp" "size_t sz"
 .Fn mchars_free "struct mchars *p"
 .Ft char
 .Fn mchars_num2char "const char *cp" "size_t sz"
+.Ft int
+.Fn mchars_num2uc "const char *cp" "size_t sz"
 .Ft "const char *"
 .Fo mchars_res2str
 .Fa "struct mchars *p"
 .Ft "const char *"
 .Fo mchars_res2str
 .Fa "struct mchars *p"
@@ -188,6 +191,9 @@ library also contains routines for translating character strings into glyphs
 .Pq see Fn mchars_alloc
 and parsing escape sequences from strings
 .Pq see Fn mandoc_escape .
 .Pq see Fn mchars_alloc
 and parsing escape sequences from strings
 .Pq see Fn mandoc_escape .
+.Pp
+This library is
+.Ud
 .Sh REFERENCE
 This section documents the functions, types, and variables available
 via
 .Sh REFERENCE
 This section documents the functions, types, and variables available
 via
@@ -247,8 +253,12 @@ The object must be freed with
 Free an object created with
 .Fn mchars_alloc .
 .It Fn mchars_num2char
 Free an object created with
 .Fn mchars_alloc .
 .It Fn mchars_num2char
-Convert a character index as found in \eN\(aq\(aq into a printable
-character.
+Convert a character index (e.g., the \eN\(aq\(aq escape) into a
+printable ASCII character.
+Returns \e0 (the nil character) if the input sequence is malformed.
+.It Fn mchars_num2uc
+Convert a hexadecimal character index (e.g., the \e[uNNNN] escape) into
+a Unicode codepoint.
 Returns \e0 (the nil character) if the input sequence is malformed.
 .It Fn mchars_res2cp
 Convert a predefined character into a valid Unicode codepoint.
 Returns \e0 (the nil character) if the input sequence is malformed.
 .It Fn mchars_res2cp
 Convert a predefined character into a valid Unicode codepoint.
index db7b30bfb53449c3d953ab2376c23e02e8cd6d5d..5f01644c8e829e88d104ac976125b7101a900b02 100644 (file)
--- a/mandoc.h
+++ b/mandoc.h
@@ -1,4 +1,4 @@
-/*     $Id: mandoc.h,v 1.75 2011/05/15 15:30:33 kristaps Exp $ */
+/*     $Id: mandoc.h,v 1.76 2011/05/17 11:50:20 kristaps Exp $ */
 /*
  * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
 /*
  * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -330,6 +330,7 @@ enum mandoc_esc       mandoc_escape(const char **, const char **, int *);
 
 struct mchars   *mchars_alloc(void);
 char             mchars_num2char(const char *, size_t);
 
 struct mchars   *mchars_alloc(void);
 char             mchars_num2char(const char *, size_t);
+int              mchars_num2uc(const char *, size_t);
 const char      *mchars_spec2str(struct mchars *, const char *, size_t, size_t *);
 int              mchars_spec2cp(struct mchars *, const char *, size_t);
 const char      *mchars_res2str(struct mchars *, const char *, size_t, size_t *);
 const char      *mchars_spec2str(struct mchars *, const char *, size_t, size_t *);
 int              mchars_spec2cp(struct mchars *, const char *, size_t);
 const char      *mchars_res2str(struct mchars *, const char *, size_t, size_t *);