version 1.23, 2009/02/25 23:18:50 |
version 1.25, 2009/02/26 16:08:11 |
|
|
* PERFORMANCE OF THIS SOFTWARE. |
* PERFORMANCE OF THIS SOFTWARE. |
*/ |
*/ |
#include <assert.h> |
#include <assert.h> |
|
#include <ctype.h> |
#include <err.h> |
#include <err.h> |
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
Line 276 const struct termact *termacts = __termacts; |
|
Line 277 const struct termact *termacts = __termacts; |
|
static size_t |
static size_t |
arg_width(const struct mdoc_arg *arg) |
arg_width(const struct mdoc_arg *arg) |
{ |
{ |
|
size_t len, i, v; |
|
|
/* TODO */ |
/* TODO */ |
assert(*arg->value); |
assert(*arg->value); |
|
if (0 == strcmp(*arg->value, "indent")) |
|
return(INDENT); |
|
if (0 == strcmp(*arg->value, "indent-two")) |
|
return(INDENT * 2); |
|
|
|
len = strlen(*arg->value); |
|
assert(len > 0); |
|
|
|
for (i = 0; i < len - 1; i++) |
|
if ( ! isdigit((int)(*arg->value)[i])) |
|
break; |
|
|
|
if (i == len - 1) { |
|
if ('n' == (*arg->value)[len - 1]) { |
|
v = (size_t)atoi(*arg->value); |
|
return(v); |
|
} |
|
|
|
} |
return(strlen(*arg->value)); |
return(strlen(*arg->value)); |
} |
} |
|
|
Line 293 arg_offset(const struct mdoc_arg *arg) |
|
Line 314 arg_offset(const struct mdoc_arg *arg) |
|
return(INDENT); |
return(INDENT); |
if (0 == strcmp(*arg->value, "indent-two")) |
if (0 == strcmp(*arg->value, "indent-two")) |
return(INDENT * 2); |
return(INDENT * 2); |
|
|
return(strlen(*arg->value)); |
return(strlen(*arg->value)); |
} |
} |
|
|
Line 381 termp_it_pre(DECL_ARGS) |
|
Line 401 termp_it_pre(DECL_ARGS) |
|
|
|
/* Get our list type. */ |
/* Get our list type. */ |
|
|
for (i = 0; i < (int)bl->argc; i++) |
for (type = -1, i = 0; i < (int)bl->argc; i++) |
switch (bl->argv[i].arg) { |
switch (bl->argv[i].arg) { |
case (MDOC_Bullet): |
case (MDOC_Bullet): |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
Line 391 termp_it_pre(DECL_ARGS) |
|
Line 411 termp_it_pre(DECL_ARGS) |
|
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Hyphen): |
case (MDOC_Hyphen): |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Item): |
|
/* FALLTHROUGH */ |
|
case (MDOC_Tag): |
case (MDOC_Tag): |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Ohang): |
case (MDOC_Ohang): |
type = bl->argv[i].arg; |
type = bl->argv[i].arg; |
i = (int)bl->argc; |
i = (int)bl->argc; |
break; |
break; |
case (MDOC_Inset): |
default: |
/* FALLTHROUGH */ |
|
case (MDOC_Hang): |
|
/* FALLTHROUGH */ |
|
case (MDOC_Diag): |
|
/* FALLTHROUGH */ |
|
case (MDOC_Column): |
|
errx(1, "list type not supported"); |
errx(1, "list type not supported"); |
/* NOTREACHED */ |
/* NOTREACHED */ |
default: |
|
break; |
|
} |
} |
|
|
|
assert(-1 != type); |
|
|
/* Save our existing (inherited) margin and offset. */ |
/* Save our existing (inherited) margin and offset. */ |
|
|
pair->offset = p->offset; |
pair->offset = p->offset; |
Line 419 termp_it_pre(DECL_ARGS) |
|
Line 431 termp_it_pre(DECL_ARGS) |
|
|
|
/* Get list width and offset. */ |
/* Get list width and offset. */ |
|
|
/* FIXME: auto-size. */ |
|
i = arg_getattr(MDOC_Width, bl->argc, bl->argv); |
i = arg_getattr(MDOC_Width, bl->argc, bl->argv); |
width = i >= 0 ? arg_width(&bl->argv[i]) : 0; |
width = i >= 0 ? arg_width(&bl->argv[i]) : 0; |
|
|
Line 439 termp_it_pre(DECL_ARGS) |
|
Line 450 termp_it_pre(DECL_ARGS) |
|
width = width > 6 ? width : 6; |
width = width > 6 ? width : 6; |
break; |
break; |
case (MDOC_Tag): |
case (MDOC_Tag): |
|
/* FIXME: auto-size. */ |
if (0 == width) |
if (0 == width) |
errx(1, "need non-zero -width"); |
errx(1, "need non-zero -width"); |
break; |
break; |
Line 465 termp_it_pre(DECL_ARGS) |
|
Line 477 termp_it_pre(DECL_ARGS) |
|
else if (MDOC_BODY == node->type) |
else if (MDOC_BODY == node->type) |
p->flags |= TERMP_NOLPAD; |
p->flags |= TERMP_NOLPAD; |
break; |
break; |
case (MDOC_Ohang): |
default: |
break; |
break; |
} |
} |
|
|
Line 475 termp_it_pre(DECL_ARGS) |
|
Line 487 termp_it_pre(DECL_ARGS) |
|
*/ |
*/ |
|
|
tp = NULL; |
tp = NULL; |
|
|
if (MDOC_HEAD == node->type) { |
if (MDOC_HEAD == node->type) { |
if (arg_hasattr(MDOC_Bullet, bl->argc, bl->argv)) |
if (arg_hasattr(MDOC_Bullet, bl->argc, bl->argv)) |
tp = "\\[bu]"; |
tp = "\\[bu]"; |
Line 488 termp_it_pre(DECL_ARGS) |
|
Line 501 termp_it_pre(DECL_ARGS) |
|
} |
} |
if (arg_hasattr(MDOC_Hyphen, bl->argc, bl->argv)) |
if (arg_hasattr(MDOC_Hyphen, bl->argc, bl->argv)) |
tp = "\\-"; |
tp = "\\-"; |
if (arg_hasattr(MDOC_Item, bl->argc, bl->argv)) |
|
tp = ""; |
|
} |
} |
|
|
/* Margin control. */ |
/* Margin control. */ |
Line 505 termp_it_pre(DECL_ARGS) |
|
Line 516 termp_it_pre(DECL_ARGS) |
|
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Hyphen): |
case (MDOC_Hyphen): |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Item): |
|
/* FALLTHROUGH */ |
|
case (MDOC_Tag): |
case (MDOC_Tag): |
if (MDOC_HEAD == node->type) |
if (MDOC_HEAD == node->type) |
p->rmargin = p->offset + width; |
p->rmargin = p->offset + width; |
else if (MDOC_BODY == node->type) |
else if (MDOC_BODY == node->type) |
p->offset += width; |
p->offset += width; |
break; |
break; |
case (MDOC_Ohang): |
default: |
break; |
break; |
} |
} |
|
|
if (NULL == tp) |
if (NULL == tp) |
return(1); |
return(1); |
|
|
/* XXX - ignoring children. */ |
|
|
|
word(p, tp); |
word(p, tp); |
return(0); |
return(0); |