]> git.cameronkatri.com Git - mandoc.git/blobdiff - term_ascii.c
isspace(3) requires an unsigned argument;
[mandoc.git] / term_ascii.c
index 439056346c1a4d63937150078fc9b8dee1436d84..bf7e9b639e04e39385196b28a40145b87fabf041 100644 (file)
@@ -1,7 +1,7 @@
-/*     $Id: term_ascii.c,v 1.60 2018/04/13 18:31:00 schwarze Exp $ */
+/* $Id: term_ascii.c,v 1.66 2020/09/09 13:45:05 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2014, 2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2014,2015,2017,2018,2020 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -90,7 +90,7 @@ ascii_init(enum termenc enc, const struct manoutput *outopts)
        p->width = ascii_width;
 
 #if HAVE_WCHAR
-       if (TERMENC_ASCII != enc) {
+       if (enc != TERMENC_ASCII) {
 
                /*
                 * Do not change any of this to LC_ALL.  It might break
@@ -99,7 +99,7 @@ ascii_init(enum termenc enc, const struct manoutput *outopts)
                 * worst case, it might even cause buffer overflows.
                 */
 
-               v = TERMENC_LOCALE == enc ?
+               v = enc == TERMENC_LOCALE ?
                    setlocale(LC_CTYPE, "") :
                    setlocale(LC_CTYPE, UTF8_LOCALE);
 
@@ -113,7 +113,7 @@ ascii_init(enum termenc enc, const struct manoutput *outopts)
                        v = setlocale(LC_CTYPE, "C");
 
                if (v != NULL && MB_CUR_MAX > 1) {
-                       p->enc = enc;
+                       p->enc = TERMENC_UTF8;
                        p->advance = locale_advance;
                        p->endline = locale_endline;
                        p->letter = locale_letter;
@@ -133,6 +133,8 @@ ascii_init(enum termenc enc, const struct manoutput *outopts)
        if (outopts->synopsisonly)
                p->synopsisonly = 1;
 
+       assert(p->defindent < UINT16_MAX);
+       assert(p->defrmargin < UINT16_MAX);
        return p;
 }
 
@@ -171,6 +173,8 @@ ascii_setwidth(struct termp *p, int iop, int width)
                p->defrmargin -= width;
        else
                p->defrmargin = 0;
+       if (p->defrmargin > 1000)
+               p->defrmargin = 1000;
        p->lastrmargin = p->tcol->rmargin;
        p->tcol->rmargin = p->maxrmargin = p->defrmargin;
 }
@@ -192,8 +196,7 @@ terminal_sepline(void *arg)
 static size_t
 ascii_width(const struct termp *p, int c)
 {
-
-       return 1;
+       return c != ASCII_BREAK;
 }
 
 void
@@ -229,7 +232,10 @@ ascii_endline(struct termp *p)
 {
 
        p->line++;
-       p->tcol->offset -= p->ti;
+       if ((int)p->tcol->offset > p->ti)
+               p->tcol->offset -= p->ti;
+       else
+               p->tcol->offset = 0;
        p->ti = 0;
        putchar('\n');
 }
@@ -239,6 +245,14 @@ ascii_advance(struct termp *p, size_t len)
 {
        size_t          i;
 
+       /*
+        * XXX We used to have "assert(len < UINT16_MAX)" here.
+        * that is not quite right because the input document
+        * can trigger that by merely providing large input.
+        * For now, simply truncate.
+        */
+       if (len > 256)
+               len = 256;
        for (i = 0; i < len; i++)
                putchar(' ');
 }
@@ -306,7 +320,7 @@ ascii_uc2str(int uc)
        "<88>", "<89>", "<8A>", "<8B>", "<8C>", "<8D>", "<8E>", "<8F>",
        "<90>", "<91>", "<92>", "<93>", "<94>", "<95>", "<96>", "<97>",
        "<98>", "<99>", "<9A>", "<9B>", "<9C>", "<9D>", "<9E>", "<9F>",
-       nbrsp,  "!",    "/\bc", "GBP",  "o\bx", "=\bY", "|",    "<section>",
+       nbrsp,  "!",    "/\bc", "-\bL", "o\bx", "=\bY", "|",    "<section>",
        "\"",   "(C)",  "_\ba", "<<",   "~",    "",     "(R)",  "-",
        "<degree>","+-","^2",   "^3",   "'","<micro>","<paragraph>",".",
        ",",    "^1",   "_\bo", ">>",   "1/4",  "1/2",  "3/4",  "?",
@@ -376,6 +390,14 @@ locale_advance(struct termp *p, size_t len)
 {
        size_t          i;
 
+       /*
+        * XXX We used to have "assert(len < UINT16_MAX)" here.
+        * that is not quite right because the input document
+        * can trigger that by merely providing large input.
+        * For now, simply truncate.
+        */
+       if (len > 256)
+               len = 256;
        for (i = 0; i < len; i++)
                putwchar(L' ');
 }
@@ -385,7 +407,10 @@ locale_endline(struct termp *p)
 {
 
        p->line++;
-       p->tcol->offset -= p->ti;
+       if ((int)p->tcol->offset > p->ti)
+               p->tcol->offset -= p->ti;
+       else 
+               p->tcol->offset = 0;
        p->ti = 0;
        putwchar(L'\n');
 }