-/* $Id: term_ascii.c,v 1.41 2014/12/19 17:12:04 schwarze Exp $ */
+/* $Id: term_ascii.c,v 1.45 2015/04/04 17:47:18 schwarze Exp $ */
/*
* Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2014, 2015 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
* copyright notice and this permission notice appear in all copies.
*
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
#include "mandoc_aux.h"
#include "out.h"
#include "term.h"
+#include "manconf.h"
#include "main.h"
-static struct termp *ascii_init(enum termenc,
- const struct mchars *, char *);
-static double ascii_hspan(const struct termp *,
+static struct termp *ascii_init(enum termenc, const struct mchars *,
+ const struct manoutput *);
+static int ascii_hspan(const struct termp *,
const struct roffsu *);
static size_t ascii_width(const struct termp *, int);
static void ascii_advance(struct termp *, size_t);
static void ascii_end(struct termp *);
static void ascii_endline(struct termp *);
static void ascii_letter(struct termp *, int);
-static void ascii_setwidth(struct termp *, int, size_t);
+static void ascii_setwidth(struct termp *, int, int);
#if HAVE_WCHAR
static void locale_advance(struct termp *, size_t);
static struct termp *
-ascii_init(enum termenc enc, const struct mchars *mchars, char *outopts)
+ascii_init(enum termenc enc, const struct mchars *mchars,
+ const struct manoutput *outopts)
{
- const char *toks[5];
char *v;
struct termp *p;
}
#endif
- toks[0] = "indent";
- toks[1] = "width";
- toks[2] = "mdoc";
- toks[3] = "synopsis";
- toks[4] = NULL;
-
- while (outopts && *outopts)
- switch (getsubopt(&outopts, UNCONST(toks), &v)) {
- case 0:
- p->defindent = (size_t)atoi(v);
- break;
- case 1:
- p->defrmargin = (size_t)atoi(v);
- break;
- case 2:
- /*
- * Temporary, undocumented mode
- * to imitate mdoc(7) output style.
- */
- p->mdocstyle = 1;
- p->defindent = 5;
- break;
- case 3:
- p->synopsisonly = 1;
- break;
- default:
- break;
- }
-
- /* Enforce a lower boundary. */
- if (p->defrmargin < 58)
- p->defrmargin = 58;
+ if (outopts->mdoc) {
+ p->mdocstyle = 1;
+ p->defindent = 5;
+ }
+ if (outopts->indent)
+ p->defindent = outopts->indent;
+ if (outopts->width)
+ p->defrmargin = outopts->width;
+ if (outopts->synopsisonly)
+ p->synopsisonly = 1;
return(p);
}
void *
-ascii_alloc(const struct mchars *mchars, char *outopts)
+ascii_alloc(const struct mchars *mchars, const struct manoutput *outopts)
{
return(ascii_init(TERMENC_ASCII, mchars, outopts));
}
void *
-utf8_alloc(const struct mchars *mchars, char *outopts)
+utf8_alloc(const struct mchars *mchars, const struct manoutput *outopts)
{
return(ascii_init(TERMENC_UTF8, mchars, outopts));
}
void *
-locale_alloc(const struct mchars *mchars, char *outopts)
+locale_alloc(const struct mchars *mchars, const struct manoutput *outopts)
{
return(ascii_init(TERMENC_LOCALE, mchars, outopts));
}
static void
-ascii_setwidth(struct termp *p, int iop, size_t width)
+ascii_setwidth(struct termp *p, int iop, int width)
{
+ width /= 24;
p->rmargin = p->defrmargin;
if (iop > 0)
p->defrmargin += width;
else if (iop == 0)
- p->defrmargin = width ? width : p->lastrmargin;
- else if (p->defrmargin > width)
+ p->defrmargin = width ? (size_t)width : p->lastrmargin;
+ else if (p->defrmargin > (size_t)width)
p->defrmargin -= width;
else
p->defrmargin = 0;
p->rmargin = p->maxrmargin = p->defrmargin;
}
+void
+ascii_sepline(void *arg)
+{
+ struct termp *p;
+ size_t i;
+
+ p = (struct termp *)arg;
+ putchar('\n');
+ for (i = 0; i < p->defrmargin; i++)
+ putchar('-');
+ putchar('\n');
+ putchar('\n');
+}
+
static size_t
ascii_width(const struct termp *p, int c)
{
putchar(' ');
}
-static double
+static int
ascii_hspan(const struct termp *p, const struct roffsu *su)
{
double r;
- /*
- * Approximate based on character width.
- * None of these will be actually correct given that an inch on
- * the screen depends on character size, terminal, etc., etc.
- */
switch (su->unit) {
case SCALE_BU:
- r = su->scale * 10.0 / 240.0;
+ r = su->scale;
break;
case SCALE_CM:
- r = su->scale * 10.0 / 2.54;
+ r = su->scale * 240.0 / 2.54;
break;
case SCALE_FS:
- r = su->scale * 2730.666;
+ r = su->scale * 65536.0;
break;
case SCALE_IN:
- r = su->scale * 10.0;
+ r = su->scale * 240.0;
break;
case SCALE_MM:
- r = su->scale / 100.0;
+ r = su->scale * 0.24;
break;
+ case SCALE_VS:
+ /* FALLTHROUGH */
case SCALE_PC:
- r = su->scale * 10.0 / 6.0;
+ r = su->scale * 40.0;
break;
case SCALE_PT:
- r = su->scale * 10.0 / 72.0;
- break;
- case SCALE_VS:
- r = su->scale * 2.0 - 1.0;
+ r = su->scale * 10.0 / 3.0;
break;
case SCALE_EN:
/* FALLTHROUGH */
case SCALE_EM:
- r = su->scale;
+ r = su->scale * 24.0;
break;
default:
abort();
/* NOTREACHED */
}
-
- return(r);
+ return(r > 0.0 ? r + 0.01 : r - 0.01);
}
const char *