]> git.cameronkatri.com Git - mandoc.git/blobdiff - term_ascii.c
The concept of endianness seems to be somewhat newfangled, so the
[mandoc.git] / term_ascii.c
index 1c06487847dc340d71be36d6c40212612eba4acd..df5ff13901c26b3c8bc738deb3475fccd63b617f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: term_ascii.c,v 1.50 2015/10/12 00:08:16 schwarze Exp $ */
+/*     $Id: term_ascii.c,v 1.54 2016/07/31 09:29:13 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -38,8 +38,7 @@
 #include "manconf.h"
 #include "main.h"
 
-static struct termp     *ascii_init(enum termenc, const struct mchars *,
-                               const struct manoutput *);
+static struct termp     *ascii_init(enum termenc, const struct manoutput *);
 static int               ascii_hspan(const struct termp *,
                                const struct roffsu *);
 static size_t            ascii_width(const struct termp *, int);
@@ -59,8 +58,7 @@ static        size_t            locale_width(const struct termp *, int);
 
 
 static struct termp *
-ascii_init(enum termenc enc, const struct mchars *mchars,
-       const struct manoutput *outopts)
+ascii_init(enum termenc enc, const struct manoutput *outopts)
 {
 #if HAVE_WCHAR
        char            *v;
@@ -69,7 +67,6 @@ ascii_init(enum termenc enc, const struct mchars *mchars,
 
        p = mandoc_calloc(1, sizeof(struct termp));
 
-       p->symtab = mchars;
        p->line = 1;
        p->tabwidth = 5;
        p->defrmargin = p->lastrmargin = 78;
@@ -91,9 +88,17 @@ ascii_init(enum termenc enc, const struct mchars *mchars,
 
 #if HAVE_WCHAR
        if (TERMENC_ASCII != enc) {
+
+               /*
+                * Do not change any of this to LC_ALL.  It might break
+                * the formatting by subtly changing the behaviour of
+                * various functions, for example strftime(3).  As a
+                * worst case, it might even cause buffer overflows.
+                */
+
                v = TERMENC_LOCALE == enc ?
-                   setlocale(LC_ALL, "") :
-                   setlocale(LC_CTYPE, "en_US.UTF-8");
+                   setlocale(LC_CTYPE, "") :
+                   setlocale(LC_CTYPE, UTF8_LOCALE);
                if (NULL != v && MB_CUR_MAX > 1) {
                        p->enc = enc;
                        p->advance = locale_advance;
@@ -119,24 +124,24 @@ ascii_init(enum termenc enc, const struct mchars *mchars,
 }
 
 void *
-ascii_alloc(const struct mchars *mchars, const struct manoutput *outopts)
+ascii_alloc(const struct manoutput *outopts)
 {
 
-       return ascii_init(TERMENC_ASCII, mchars, outopts);
+       return ascii_init(TERMENC_ASCII, outopts);
 }
 
 void *
-utf8_alloc(const struct mchars *mchars, const struct manoutput *outopts)
+utf8_alloc(const struct manoutput *outopts)
 {
 
-       return ascii_init(TERMENC_UTF8, mchars, outopts);
+       return ascii_init(TERMENC_UTF8, outopts);
 }
 
 void *
-locale_alloc(const struct mchars *mchars, const struct manoutput *outopts)
+locale_alloc(const struct manoutput *outopts)
 {
 
-       return ascii_init(TERMENC_LOCALE, mchars, outopts);
+       return ascii_init(TERMENC_LOCALE, outopts);
 }
 
 static void
@@ -158,18 +163,17 @@ ascii_setwidth(struct termp *p, int iop, int width)
 }
 
 void
-ascii_sepline(void *arg)
+terminal_sepline(void *arg)
 {
        struct termp    *p;
        size_t           i;
 
        p = (struct termp *)arg;
-       p->line += 3;
-       putchar('\n');
+       (*p->endline)(p);
        for (i = 0; i < p->defrmargin; i++)
-               putchar('-');
-       putchar('\n');
-       putchar('\n');
+               (*p->letter)(p, '-');
+       (*p->endline)(p);
+       (*p->endline)(p);
 }
 
 static size_t