aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2011-07-22 14:55:07 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2011-07-22 14:55:07 +0000
commit385fc5b8d80ee1a2c94f9d69fe894c36c4eeafb9 (patch)
treea8da64327be22acad2b5982652aac831ede2c3fd
parentb8569a73f84b759cd29444e746f2e7f8d07d1d1f (diff)
downloadmandoc-385fc5b8d80ee1a2c94f9d69fe894c36c4eeafb9.tar.gz
mandoc-385fc5b8d80ee1a2c94f9d69fe894c36c4eeafb9.tar.zst
mandoc-385fc5b8d80ee1a2c94f9d69fe894c36c4eeafb9.zip
Add support for `gsize' eqn token (introduced in second-edition troff).
-rw-r--r--eqn.712
-rw-r--r--eqn.c44
-rw-r--r--libroff.h3
-rw-r--r--mandoc.h3
-rw-r--r--read.c3
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 <kristaps@bsd.lv>
.\"
@@ -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 <kristaps@bsd.lv>
*
@@ -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);
}
@@ -760,6 +765,21 @@ eqn_do_define(struct eqn_node *ep)
}
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)
{
const char *start;
@@ -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 <kristaps@bsd.lv>
*
@@ -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 <kristaps@bsd.lv>
*
@@ -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 <kristaps@bsd.lv>
* Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -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",