X-Git-Url: https://git.cameronkatri.com/mandoc.git/blobdiff_plain/9faad2ae0e7caf95d294df3c2ba845e98e0fff85..a7c25043d00f4e0cf67030e75e84d041257befe1:/term_ascii.c diff --git a/term_ascii.c b/term_ascii.c index 4ff93da1..bf7e9b63 100644 --- a/term_ascii.c +++ b/term_ascii.c @@ -1,7 +1,7 @@ -/* $Id: term_ascii.c,v 1.63 2018/08/21 16:06:48 schwarze Exp $ */ +/* $Id: term_ascii.c,v 1.66 2020/09/09 13:45:05 schwarze Exp $ */ /* * Copyright (c) 2010, 2011 Kristaps Dzonsons - * Copyright (c) 2014, 2015, 2017, 2018 Ingo Schwarze + * Copyright (c) 2014,2015,2017,2018,2020 Ingo Schwarze * * 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; @@ -232,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'); } @@ -242,7 +245,14 @@ ascii_advance(struct termp *p, size_t len) { size_t i; - assert(len < UINT16_MAX); + /* + * 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(' '); } @@ -380,7 +390,14 @@ locale_advance(struct termp *p, size_t len) { size_t i; - assert(len < UINT16_MAX); + /* + * 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' '); } @@ -390,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'); }