=================================================================== RCS file: /cvs/mandoc/term_ascii.c,v retrieving revision 1.59 retrieving revision 1.62 diff -u -p -r1.59 -r1.62 --- mandoc/term_ascii.c 2017/08/23 10:50:15 1.59 +++ mandoc/term_ascii.c 2018/08/18 15:17:03 1.62 @@ -1,7 +1,7 @@ -/* $Id: term_ascii.c,v 1.59 2017/08/23 10:50:15 schwarze Exp $ */ +/* $Id: term_ascii.c,v 1.62 2018/08/18 15:17:03 schwarze Exp $ */ /* * Copyright (c) 2010, 2011 Kristaps Dzonsons - * Copyright (c) 2014, 2015, 2017 Ingo Schwarze + * Copyright (c) 2014, 2015, 2017, 2018 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 @@ -21,11 +21,13 @@ #include #if HAVE_WCHAR +#include #include #endif #include #include #include +#include #include #if HAVE_WCHAR #include @@ -100,7 +102,17 @@ ascii_init(enum termenc enc, const struct manoutput *o v = TERMENC_LOCALE == enc ? setlocale(LC_CTYPE, "") : setlocale(LC_CTYPE, UTF8_LOCALE); - if (NULL != v && MB_CUR_MAX > 1) { + + /* + * We only support UTF-8, + * so revert to ASCII for anything else. + */ + + if (v != NULL && + strcmp(nl_langinfo(CODESET), "UTF-8") != 0) + v = setlocale(LC_CTYPE, "C"); + + if (v != NULL && MB_CUR_MAX > 1) { p->enc = enc; p->advance = locale_advance; p->endline = locale_endline; @@ -121,6 +133,8 @@ ascii_init(enum termenc enc, const struct manoutput *o if (outopts->synopsisonly) p->synopsisonly = 1; + assert(p->defindent < UINT16_MAX); + assert(p->defrmargin < UINT16_MAX); return p; } @@ -159,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; } @@ -180,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 @@ -227,6 +242,7 @@ ascii_advance(struct termp *p, size_t len) { size_t i; + assert(len < UINT16_MAX); for (i = 0; i < len; i++) putchar(' '); } @@ -364,6 +380,7 @@ locale_advance(struct termp *p, size_t len) { size_t i; + assert(len < UINT16_MAX); for (i = 0; i < len; i++) putwchar(L' '); }