-/* $Id: term_ascii.c,v 1.45 2015/04/04 17:47:18 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>
#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);
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;
+#endif
struct termp *p;
p = mandoc_calloc(1, sizeof(struct termp));
- p->symtab = mchars;
+ p->line = 1;
p->tabwidth = 5;
p->defrmargin = p->lastrmargin = 78;
p->fontq = mandoc_reallocarray(NULL,
#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;
if (outopts->synopsisonly)
p->synopsisonly = 1;
- return(p);
+ return p;
}
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
}
void
-ascii_sepline(void *arg)
+terminal_sepline(void *arg)
{
struct termp *p;
size_t i;
p = (struct termp *)arg;
- 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
ascii_width(const struct termp *p, int c)
{
- return(1);
+ return 1;
}
void
ascii_endline(struct termp *p)
{
+ p->line++;
putchar('\n');
}
r = su->scale * 0.24;
break;
case SCALE_VS:
- /* FALLTHROUGH */
case SCALE_PC:
r = su->scale * 40.0;
break;
r = su->scale * 10.0 / 3.0;
break;
case SCALE_EN:
- /* FALLTHROUGH */
case SCALE_EM:
r = su->scale * 24.0;
break;
default:
abort();
- /* NOTREACHED */
}
- return(r > 0.0 ? r + 0.01 : r - 0.01);
+ return r > 0.0 ? r + 0.01 : r - 0.01;
}
const char *
assert(uc >= 0);
if ((size_t)uc < sizeof(tab)/sizeof(tab[0]))
- return(tab[uc]);
- return(mchars_uc2str(uc));
+ return tab[uc];
+ return mchars_uc2str(uc);
}
#if HAVE_WCHAR
rc = wcwidth(c);
if (rc < 0)
rc = 0;
- return(rc);
+ return rc;
}
static void
locale_endline(struct termp *p)
{
+ p->line++;
putwchar(L'\n');
}