Return to term_ascii.c CVS log | Up to [cvsweb.bsd.lv] / mandoc |
version 1.3, 2010/06/09 08:07:13 | version 1.14, 2011/05/17 14:38:34 | ||
---|---|---|---|
|
|
||
/* $Id$ */ | /* $Id$ */ | ||
/* | /* | ||
* 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 | * Permission to use, copy, modify, and distribute this software for any | ||
* purpose with or without fee is hereby granted, provided that the above | * purpose with or without fee is hereby granted, provided that the above | ||
|
|
||
#include <stdlib.h> | #include <stdlib.h> | ||
#include <unistd.h> | #include <unistd.h> | ||
#include "mandoc.h" | |||
#include "out.h" | #include "out.h" | ||
#include "term.h" | #include "term.h" | ||
#include "main.h" | #include "main.h" | ||
static void ascii_endline(struct termp *); | static struct termp *ascii_init(enum termenc, char *); | ||
static void ascii_letter(struct termp *, char); | static double ascii_hspan(const struct termp *, | ||
static void ascii_begin(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_advance(struct termp *, size_t); | ||
static void ascii_begin(struct termp *); | |||
static void ascii_end(struct termp *); | static void ascii_end(struct termp *); | ||
static void ascii_endline(struct termp *); | |||
static void ascii_letter(struct termp *, int); | |||
static struct termp * | |||
void * | ascii_init(enum termenc enc, char *outopts) | ||
ascii_alloc(char *outopts) | |||
{ | { | ||
struct termp *p; | |||
const char *toks[2]; | const char *toks[2]; | ||
char *v; | char *v; | ||
struct termp *p; | |||
if (NULL == (p = term_alloc(TERMENC_ASCII))) | p = mandoc_calloc(1, sizeof(struct termp)); | ||
return(NULL); | p->enc = enc; | ||
p->type = TERMTYPE_CHAR; | p->tabwidth = 5; | ||
p->letter = ascii_letter; | p->defrmargin = 78; | ||
p->advance = ascii_advance; | |||
p->begin = ascii_begin; | p->begin = ascii_begin; | ||
p->end = ascii_end; | p->end = ascii_end; | ||
p->endline = ascii_endline; | 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[0] = "width"; | ||
toks[1] = NULL; | toks[1] = NULL; | ||
|
|
||
return(p); | return(p); | ||
} | } | ||
void * | |||
ascii_alloc(char *outopts) | |||
{ | |||
return(ascii_init(TERMENC_ASCII, outopts)); | |||
} | |||
void * | |||
locale_alloc(char *outopts) | |||
{ | |||
return(ascii_init(TERMENC_LOCALE, outopts)); | |||
} | |||
/* ARGSUSED */ | |||
static size_t | |||
ascii_width(const struct termp *p, int c) | |||
{ | |||
return(1); | |||
} | |||
void | void | ||
ascii_free(void *arg) | ascii_free(void *arg) | ||
{ | { | ||
|
|
||
/* ARGSUSED */ | /* ARGSUSED */ | ||
static void | static void | ||
ascii_letter(struct termp *p, char c) | ascii_letter(struct termp *p, int c) | ||
{ | { | ||
/* LINTED */ | |||
putchar(c); | putchar(c); | ||
} | } | ||
|
|
||
for (i = 0; i < len; i++) | for (i = 0; i < len; i++) | ||
putchar(' '); | 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); | |||
} | |||