From 385fc5b8d80ee1a2c94f9d69fe894c36c4eeafb9 Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Fri, 22 Jul 2011 14:55:07 +0000 Subject: Add support for `gsize' eqn token (introduced in second-edition troff). --- eqn.7 | 12 +++++++++++- eqn.c | 44 ++++++++++++++++++++++++++++++++------------ libroff.h | 3 ++- mandoc.h | 3 +-- read.c | 3 +-- 5 files changed, 47 insertions(+), 18 deletions(-) diff --git a/eqn.7 b/eqn.7 index 52e3095f..6770594d 100644 --- a/eqn.7 +++ b/eqn.7 @@ -1,4 +1,4 @@ -.\" $Id: eqn.7,v 1.16 2011/07/22 14:26:32 kristaps Exp $ +.\" $Id: eqn.7,v 1.17 2011/07/22 14:55:07 kristaps Exp $ .\" .\" Copyright (c) 2011 Kristaps Dzonsons .\" @@ -66,6 +66,7 @@ eqn : box | eqn box box : text | "{" eqn "}" | "define" text text + | "gsize" text | "set" text text | "undef" text | box pos box @@ -141,6 +142,15 @@ foo bar 'baz' .Ed .Pp Self-referencing definitions will raise an error. +.It Cm gsize +Set the default size of subsequent output. +Its syntax is as follows: +.Pp +.D1 define Ar size +.Pp +The +.Ar size +value should be an integer. .It Cm set Set an equation mode. Both arguments are thrown away. diff --git a/eqn.c b/eqn.c index 53a90294..8c178293 100644 --- a/eqn.c +++ b/eqn.c @@ -1,4 +1,4 @@ -/* $Id: eqn.c,v 1.28 2011/07/22 14:26:32 kristaps Exp $ */ +/* $Id: eqn.c,v 1.29 2011/07/22 14:55:07 kristaps Exp $ */ /* * Copyright (c) 2011 Kristaps Dzonsons * @@ -126,14 +126,17 @@ enum eqnpartt { EQN_DEFINE = 0, EQN_SET, EQN_UNDEF, + EQN_GSIZE, EQN__MAX }; static enum eqn_rest eqn_box(struct eqn_node *, struct eqn_box *); -static struct eqn_box *eqn_box_alloc(struct eqn_box *); +static struct eqn_box *eqn_box_alloc(struct eqn_node *, + struct eqn_box *); static void eqn_box_free(struct eqn_box *); static struct eqn_def *eqn_def_find(struct eqn_node *, const char *, size_t); +static int eqn_do_gsize(struct eqn_node *); static int eqn_do_define(struct eqn_node *); static int eqn_do_set(struct eqn_node *); static int eqn_do_undef(struct eqn_node *); @@ -149,6 +152,7 @@ static const struct eqnpart eqnparts[EQN__MAX] = { { { "define", 6 }, eqn_do_define }, /* EQN_DEFINE */ { { "set", 3 }, eqn_do_set }, /* EQN_SET */ { { "undef", 5 }, eqn_do_undef }, /* EQN_UNDEF */ + { { "gsize", 5 }, eqn_do_gsize }, /* EQN_UNDEF */ }; static const struct eqnstr eqnmarks[EQNMARK__MAX] = { @@ -298,6 +302,7 @@ eqn_alloc(int pos, int line, struct mparse *parse) p->parse = parse; p->eqn.ln = line; p->eqn.pos = pos; + p->gsize = EQN_DEFSIZE; return(p); } @@ -330,7 +335,7 @@ eqn_eqn(struct eqn_node *ep, struct eqn_box *last) struct eqn_box *bp; enum eqn_rest c; - bp = eqn_box_alloc(last); + bp = eqn_box_alloc(ep, last); bp->type = EQN_SUBEXPR; while (EQN_OK == (c = eqn_box(ep, bp))) @@ -347,7 +352,7 @@ eqn_list(struct eqn_node *ep, struct eqn_box *last) size_t sz; enum eqn_rest c; - bp = eqn_box_alloc(last); + bp = eqn_box_alloc(ep, last); bp->type = EQN_LIST; if (NULL == (start = eqn_nexttok(ep, &sz))) { @@ -516,7 +521,7 @@ eqn_box(struct eqn_node *ep, struct eqn_box *last) last->last->size = size; } - bp = eqn_box_alloc(last); + bp = eqn_box_alloc(ep, last); bp->type = EQN_TEXT; for (i = 0; i < (int)EQNSYM__MAX; i++) if (EQNSTREQ(&eqnsyms[i].str, start, sz)) { @@ -548,13 +553,13 @@ eqn_free(struct eqn_node *p) } static struct eqn_box * -eqn_box_alloc(struct eqn_box *parent) +eqn_box_alloc(struct eqn_node *ep, struct eqn_box *parent) { struct eqn_box *bp; bp = mandoc_calloc(1, sizeof(struct eqn_box)); bp->parent = parent; - bp->size = EQN_DEFSIZE; + bp->size = ep->gsize; if (NULL == parent->first) parent->first = bp; @@ -695,9 +700,9 @@ eqn_do_set(struct eqn_node *ep) const char *start; if (NULL == (start = eqn_nextrawtok(ep, NULL))) - EQN_MSG(MANDOCERR_EQNARGS, ep); + EQN_MSG(MANDOCERR_EQNEOF, ep); else if (NULL == (start = eqn_nextrawtok(ep, NULL))) - EQN_MSG(MANDOCERR_EQNARGS, ep); + EQN_MSG(MANDOCERR_EQNEOF, ep); else return(1); @@ -713,7 +718,7 @@ eqn_do_define(struct eqn_node *ep) int i; if (NULL == (start = eqn_nextrawtok(ep, &sz))) { - EQN_MSG(MANDOCERR_EQNARGS, ep); + EQN_MSG(MANDOCERR_EQNEOF, ep); return(0); } @@ -748,7 +753,7 @@ eqn_do_define(struct eqn_node *ep) start = eqn_next(ep, ep->data[(int)ep->cur], &sz, 0); if (NULL == start) { - EQN_MSG(MANDOCERR_EQNARGS, ep); + EQN_MSG(MANDOCERR_EQNEOF, ep); return(0); } @@ -759,6 +764,21 @@ eqn_do_define(struct eqn_node *ep) return(1); } +static int +eqn_do_gsize(struct eqn_node *ep) +{ + const char *start; + size_t sz; + + if (NULL == (start = eqn_nextrawtok(ep, &sz))) { + EQN_MSG(MANDOCERR_EQNEOF, ep); + return(0); + } + + ep->gsize = mandoc_strntoi(start, sz, 10); + return(1); +} + static int eqn_do_undef(struct eqn_node *ep) { @@ -767,7 +787,7 @@ eqn_do_undef(struct eqn_node *ep) size_t sz; if (NULL == (start = eqn_nextrawtok(ep, &sz))) { - EQN_MSG(MANDOCERR_EQNARGS, ep); + EQN_MSG(MANDOCERR_EQNEOF, ep); return(0); } else if (NULL != (def = eqn_def_find(ep, start, sz))) def->keysz = 0; diff --git a/libroff.h b/libroff.h index de4c21cb..5fd7506b 100644 --- a/libroff.h +++ b/libroff.h @@ -1,4 +1,4 @@ -/* $Id: libroff.h,v 1.24 2011/07/21 23:30:39 kristaps Exp $ */ +/* $Id: libroff.h,v 1.25 2011/07/22 14:55:07 kristaps Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons * @@ -49,6 +49,7 @@ struct eqn_node { size_t rew; size_t cur; size_t sz; + int gsize; struct eqn eqn; struct mparse *parse; struct eqn_node *next; diff --git a/mandoc.h b/mandoc.h index 1817e54c..7a2a9668 100644 --- a/mandoc.h +++ b/mandoc.h @@ -1,4 +1,4 @@ -/* $Id: mandoc.h,v 1.90 2011/07/22 09:57:04 kristaps Exp $ */ +/* $Id: mandoc.h,v 1.91 2011/07/22 14:55:07 kristaps Exp $ */ /* * Copyright (c) 2010, 2011 Kristaps Dzonsons * @@ -110,7 +110,6 @@ enum mandocerr { MANDOCERR_ERROR, /* ===== start of errors ===== */ /* related to equations */ - MANDOCERR_EQNARGS, /* bad equation macro arguments */ MANDOCERR_EQNNEST, /* too many nested equation defines */ MANDOCERR_EQNNSCOPE, /* unexpected equation scope closure*/ MANDOCERR_EQNSCOPE, /* equation scope open on exit */ diff --git a/read.c b/read.c index ac0e9f50..2e4ac0b6 100644 --- a/read.c +++ b/read.c @@ -1,4 +1,4 @@ -/* $Id: read.c,v 1.21 2011/07/21 23:30:39 kristaps Exp $ */ +/* $Id: read.c,v 1.22 2011/07/22 14:55:07 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2011 Ingo Schwarze @@ -152,7 +152,6 @@ static const char * const mandocerrs[MANDOCERR_MAX] = { "generic error", /* related to equations */ - "bad equation macro syntax", "too many nested equation defines", "unexpected equation scope closure", "equation scope open on exit", -- cgit v1.2.3-56-ge451