=================================================================== RCS file: /cvs/mandoc/term_ascii.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -p -r1.14 -r1.15 --- mandoc/term_ascii.c 2011/05/17 14:38:34 1.14 +++ mandoc/term_ascii.c 2011/05/17 22:32:45 1.15 @@ -1,4 +1,4 @@ -/* $Id: term_ascii.c,v 1.14 2011/05/17 14:38:34 kristaps Exp $ */ +/* $Id: term_ascii.c,v 1.15 2011/05/17 22:32:45 kristaps Exp $ */ /* * Copyright (c) 2010 Kristaps Dzonsons * @@ -21,16 +21,26 @@ #include #include +#ifdef USE_WCHAR +# include +#endif #include #include #include #include +#ifdef USE_WCHAR +# include +#endif #include "mandoc.h" #include "out.h" #include "term.h" #include "main.h" +#if ! defined(__STDC_ISO_10646__) +# undef USE_WCHAR +#endif + static struct termp *ascii_init(enum termenc, char *); static double ascii_hspan(const struct termp *, const struct roffsu *); @@ -41,6 +51,13 @@ static void ascii_end(struct termp *); static void ascii_endline(struct termp *); static void ascii_letter(struct termp *, int); +#ifdef USE_WCHAR +static void locale_advance(struct termp *, size_t); +static void locale_endline(struct termp *); +static void locale_letter(struct termp *, int); +static size_t locale_width(const struct termp *, int); +#endif + static struct termp * ascii_init(enum termenc enc, char *outopts) { @@ -54,15 +71,28 @@ ascii_init(enum termenc enc, char *outopts) p->tabwidth = 5; p->defrmargin = 78; - p->advance = ascii_advance; p->begin = ascii_begin; p->end = ascii_end; - p->endline = ascii_endline; p->hspan = ascii_hspan; - p->letter = ascii_letter; p->type = TERMTYPE_CHAR; + + p->enc = TERMENC_ASCII; + p->advance = ascii_advance; + p->endline = ascii_endline; + p->letter = ascii_letter; p->width = ascii_width; +#if defined (USE_WCHAR) + if (TERMENC_LOCALE == enc) + if (setlocale(LC_ALL, "") && MB_CUR_MAX > 1) { + p->enc = enc; + p->advance = locale_advance; + p->endline = locale_endline; + p->letter = locale_letter; + p->width = locale_width; + } +#endif + toks[0] = "width"; toks[1] = NULL; @@ -104,7 +134,6 @@ ascii_width(const struct termp *p, int c) return(1); } - void ascii_free(void *arg) { @@ -112,17 +141,14 @@ ascii_free(void *arg) term_free((struct termp *)arg); } - /* ARGSUSED */ static void ascii_letter(struct termp *p, int c) { - /* LINTED */ putchar(c); } - static void ascii_begin(struct termp *p) { @@ -130,7 +156,6 @@ ascii_begin(struct termp *p) (*p->headf)(p, p->argf); } - static void ascii_end(struct termp *p) { @@ -138,7 +163,6 @@ ascii_end(struct termp *p) (*p->footf)(p, p->argf); } - /* ARGSUSED */ static void ascii_endline(struct termp *p) @@ -147,19 +171,16 @@ ascii_endline(struct termp *p) putchar('\n'); } - /* ARGSUSED */ static void ascii_advance(struct termp *p, size_t len) { size_t i; - /* Just print whitespace on the terminal. */ for (i = 0; i < len; i++) putchar(' '); } - /* ARGSUSED */ static double ascii_hspan(const struct termp *p, const struct roffsu *su) @@ -198,3 +219,39 @@ ascii_hspan(const struct termp *p, const struct roffsu return(r); } +#ifdef USE_WCHAR +/* ARGSUSED */ +static size_t +locale_width(const struct termp *p, int c) +{ + int rc; + + return((rc = wcwidth(c)) < 0 ? 0 : rc); +} + +/* ARGSUSED */ +static void +locale_advance(struct termp *p, size_t len) +{ + size_t i; + + for (i = 0; i < len; i++) + putwchar(L' '); +} + +/* ARGSUSED */ +static void +locale_endline(struct termp *p) +{ + + putwchar(L'\n'); +} + +/* ARGSUSED */ +static void +locale_letter(struct termp *p, int c) +{ + + putwchar(c); +} +#endif