-/* $Id: term_ascii.c,v 1.3 2010/06/09 08:07:13 kristaps Exp $ */
+/* $Id: term_ascii.c,v 1.12 2011/01/25 17:32:04 kristaps Exp $ */
/*
- * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
+ * Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
#include <stdlib.h>
#include <unistd.h>
+#include "mandoc.h"
#include "out.h"
#include "term.h"
#include "main.h"
-static void ascii_endline(struct termp *);
-static void ascii_letter(struct termp *, char);
-static void ascii_begin(struct termp *);
+static double ascii_hspan(const struct termp *,
+ const struct roffsu *);
+static size_t ascii_width(const struct termp *, char);
static void ascii_advance(struct termp *, size_t);
+static void ascii_begin(struct termp *);
static void ascii_end(struct termp *);
+static void ascii_endline(struct termp *);
+static void ascii_letter(struct termp *, char);
void *
const char *toks[2];
char *v;
- if (NULL == (p = term_alloc(TERMENC_ASCII)))
- return(NULL);
+ p = term_alloc(TERMENC_ASCII);
- p->type = TERMTYPE_CHAR;
- p->letter = ascii_letter;
+ p->tabwidth = 5;
+ p->defrmargin = 78;
+
+ p->advance = ascii_advance;
p->begin = ascii_begin;
p->end = ascii_end;
p->endline = ascii_endline;
- p->advance = ascii_advance;
+ p->hspan = ascii_hspan;
+ p->letter = ascii_letter;
+ p->type = TERMTYPE_CHAR;
+ p->width = ascii_width;
toks[0] = "width";
toks[1] = NULL;
}
+/* ARGSUSED */
+static size_t
+ascii_width(const struct termp *p, char c)
+{
+
+ return(1);
+}
+
+
void
ascii_free(void *arg)
{
ascii_letter(struct termp *p, char c)
{
+ /* LINTED */
putchar(c);
}
for (i = 0; i < len; i++)
putchar(' ');
}
+
+
+/* ARGSUSED */
+static double
+ascii_hspan(const struct termp *p, const struct roffsu *su)
+{
+ double r;
+
+ /*
+ * Approximate based on character width. These are generated
+ * entirely by eyeballing the screen, but appear to be correct.
+ */
+
+ switch (su->unit) {
+ case (SCALE_CM):
+ r = 4 * su->scale;
+ break;
+ case (SCALE_IN):
+ r = 10 * su->scale;
+ break;
+ case (SCALE_PC):
+ r = (10 * su->scale) / 6;
+ break;
+ case (SCALE_PT):
+ r = (10 * su->scale) / 72;
+ break;
+ case (SCALE_MM):
+ r = su->scale / 1000;
+ break;
+ case (SCALE_VS):
+ r = su->scale * 2 - 1;
+ break;
+ default:
+ r = su->scale;
+ break;
+ }
+
+ return(r);
+}
+