From 3c3f7e0626d591d610886eca631e57b473866ea4 Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Thu, 24 Sep 2009 13:03:32 +0000 Subject: -offset string can now be blank (supplied with 6n as stipulated by mdoc.samples). --- mdoc_action.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++------------ mdoc_argv.c | 10 +++++++--- 2 files changed, 56 insertions(+), 15 deletions(-) diff --git a/mdoc_action.c b/mdoc_action.c index d162373c..e7697dc1 100644 --- a/mdoc_action.c +++ b/mdoc_action.c @@ -1,4 +1,4 @@ -/* $Id: mdoc_action.c,v 1.37 2009/09/16 20:49:06 kristaps Exp $ */ +/* $Id: mdoc_action.c,v 1.38 2009/09/24 13:03:32 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -51,7 +51,9 @@ static int post_std(POST_ARGS); static int post_tilde(POST_ARGS); static int pre_bd(PRE_ARGS); +static int pre_bl(PRE_ARGS); static int pre_dl(PRE_ARGS); +static int pre_offset(PRE_ARGS); static const struct actions mdoc_actions[MDOC_MAX] = { { NULL, NULL }, /* Ap */ @@ -65,7 +67,7 @@ static const struct actions mdoc_actions[MDOC_MAX] = { { pre_dl, post_display }, /* Dl */ { pre_bd, post_display }, /* Bd */ { NULL, NULL }, /* Ed */ - { NULL, post_bl }, /* Bl */ + { pre_bl, post_bl }, /* Bl */ { NULL, NULL }, /* El */ { NULL, NULL }, /* It */ { NULL, NULL }, /* Ad */ @@ -824,29 +826,64 @@ pre_dl(PRE_ARGS) } +static int +pre_offset(PRE_ARGS) +{ + int i; + + /* + * Make sure that an empty offset produces an 8n length space as + * stipulated by mdoc.samples. + */ + + assert(n->args); + for (i = 0; i < (int)n->args->argc; i++) { + if (MDOC_Offset != n->args->argv[i].arg) + continue; + if (n->args->argv[i].sz) + break; + assert(1 == n->args->refcnt); + /* If no value set, length of . */ + n->args->argv[i].value = + calloc(1, sizeof(char *)); + if (NULL == n->args->argv[i].value) + return(mdoc_nerr(m, n, EMALLOC)); + n->args->argv[i].sz++; + n->args->argv[i].value[0] = strdup("8n"); + if (NULL == n->args->argv[i].value[0]) + return(mdoc_nerr(m, n, EMALLOC)); + break; + } + + return(1); +} + + +static int +pre_bl(PRE_ARGS) +{ + + return(MDOC_BLOCK == n->type ? pre_offset(m, n) : 1); +} + + static int pre_bd(PRE_ARGS) { int i; + if (MDOC_BLOCK == n->type) + return(pre_offset(m, n)); if (MDOC_BODY != n->type) return(1); /* Enter literal context if `Bd -literal' or `-unfilled'. */ - /* - * TODO: `-offset' without an argument should be the width of - * the literal "". - */ - for (n = n->parent, i = 0; i < (int)n->args->argc; i++) if (MDOC_Literal == n->args->argv[i].arg) - break; + m->flags |= MDOC_LITERAL; else if (MDOC_Unfilled == n->args->argv[i].arg) - break; - - if (i < (int)n->args->argc) - m->flags |= MDOC_LITERAL; + m->flags |= MDOC_LITERAL; return(1); } diff --git a/mdoc_argv.c b/mdoc_argv.c index 7d36784d..3069bee9 100644 --- a/mdoc_argv.c +++ b/mdoc_argv.c @@ -1,4 +1,4 @@ -/* $Id: mdoc_argv.c,v 1.25 2009/08/20 13:22:48 kristaps Exp $ */ +/* $Id: mdoc_argv.c,v 1.26 2009/09/24 13:03:32 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -60,7 +60,7 @@ static int mdoc_argvflags[MDOC_ARG_MAX] = { ARGV_NONE, /* MDOC_Unfilled */ ARGV_NONE, /* MDOC_Literal */ ARGV_NONE, /* MDOC_File */ - ARGV_SINGLE, /* MDOC_Offset */ + ARGV_OPT_SINGLE, /* MDOC_Offset */ ARGV_NONE, /* MDOC_Bullet */ ARGV_NONE, /* MDOC_Dash */ ARGV_NONE, /* MDOC_Hyphen */ @@ -309,9 +309,13 @@ mdoc_argv_free(struct mdoc_arg *p) for (i = 0; i < (int)p->argc; i++) { if (0 == p->argv[i].sz) continue; + if (NULL == p->argv[i].value) + continue; + /* LINTED */ for (j = 0; j < (int)p->argv[i].sz; j++) - free(p->argv[i].value[j]); + if (p->argv[i].value[j]) + free(p->argv[i].value[j]); free(p->argv[i].value); } -- cgit v1.2.3-56-ge451