summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--macro.c76
-rw-r--r--mdoc.c37
-rw-r--r--private.h13
3 files changed, 72 insertions, 54 deletions
diff --git a/macro.c b/macro.c
index 027a4b88..89574301 100644
--- a/macro.c
+++ b/macro.c
@@ -35,7 +35,8 @@ static int rewind_expblock(struct mdoc *, int, int, int);
static int rewind_head(struct mdoc *, int, int);
static int rewind_body(struct mdoc *, int, int, int);
static int rewind_last(struct mdoc *, int, struct mdoc_node *);
-static int append_delims(struct mdoc *, int, int *, char *);
+static int append_delims(struct mdoc *,
+ int, int, int *, char *);
static int lookup(struct mdoc *, int, const char *);
@@ -181,7 +182,8 @@ rewind_impblock(struct mdoc *mdoc, int ppos, int tok)
static int
-append_delims(struct mdoc *mdoc, int tok, int *pos, char *buf)
+append_delims(struct mdoc *mdoc, int tok,
+ int line, int *pos, char *buf)
{
int c, lastarg;
char *p;
@@ -197,7 +199,7 @@ append_delims(struct mdoc *mdoc, int tok, int *pos, char *buf)
else if (ARGS_EOLN == c)
break;
assert(mdoc_isdelim(p));
- mdoc_word_alloc(mdoc, lastarg, p);
+ mdoc_word_alloc(mdoc, line, lastarg, p);
mdoc->next = MDOC_NEXT_SIBLING;
}
@@ -287,7 +289,7 @@ macro_close_explicit(MACRO_PROT_ARGS)
flushed = 0;
if (maxargs > 0) {
- mdoc_tail_alloc(mdoc, ppos, tt);
+ mdoc_tail_alloc(mdoc, line, ppos, tt);
mdoc->next = MDOC_NEXT_CHILD;
}
@@ -319,7 +321,7 @@ macro_close_explicit(MACRO_PROT_ARGS)
break;
}
- mdoc_word_alloc(mdoc, lastarg, p);
+ mdoc_word_alloc(mdoc, line, lastarg, p);
mdoc->next = MDOC_NEXT_SIBLING;
}
@@ -332,7 +334,7 @@ macro_close_explicit(MACRO_PROT_ARGS)
if (ppos > 1)
return(1);
- return(append_delims(mdoc, tok, pos, buf));
+ return(append_delims(mdoc, tok, line, pos, buf));
}
@@ -376,14 +378,14 @@ macro_text(MACRO_PROT_ARGS)
if (MDOC_QUOTABLE & mdoc_macros[tok].flags)
fl |= ARGS_QUOTED;
- mdoc_elem_alloc(mdoc, lastarg, tok, argc, argv);
+ mdoc_elem_alloc(mdoc, line, lastarg, tok, argc, argv);
mdoc->next = MDOC_NEXT_CHILD;
for (lastpunct = sz = 0; sz + argc < MDOC_LINEARG_MAX; sz++) {
lastarg = *pos;
if (lastpunct) {
- mdoc_elem_alloc(mdoc, lastarg, tok, argc, argv);
+ mdoc_elem_alloc(mdoc, line, lastarg, tok, argc, argv);
mdoc->next = MDOC_NEXT_CHILD;
lastpunct = 0;
}
@@ -409,7 +411,7 @@ macro_text(MACRO_PROT_ARGS)
return(0);
if (ppos > 1)
return(1);
- return(append_delims(mdoc, tok, pos, buf));
+ return(append_delims(mdoc, tok, line, pos, buf));
}
if (mdoc_isdelim(p)) {
@@ -419,7 +421,7 @@ macro_text(MACRO_PROT_ARGS)
}
lastpunct = 1;
}
- mdoc_word_alloc(mdoc, lastarg, p);
+ mdoc_word_alloc(mdoc, line, lastarg, p);
mdoc->next = MDOC_NEXT_SIBLING;
}
@@ -432,7 +434,7 @@ macro_text(MACRO_PROT_ARGS)
return(0);
if (ppos > 1)
return(1);
- return(append_delims(mdoc, tok, pos, buf));
+ return(append_delims(mdoc, tok, line, pos, buf));
}
@@ -470,21 +472,21 @@ macro_scoped(MACRO_PROT_ARGS)
return(0);
}
- mdoc_block_alloc(mdoc, ppos, tok, (size_t)argc, argv);
+ mdoc_block_alloc(mdoc, line, ppos, tok, (size_t)argc, argv);
mdoc->next = MDOC_NEXT_CHILD;
mdoc_argv_free(argc, argv);
if (0 == buf[*pos]) {
- mdoc_head_alloc(mdoc, ppos, tok);
+ mdoc_head_alloc(mdoc, line, ppos, tok);
if ( ! rewind_head(mdoc, ppos, tok))
return(0);
- mdoc_body_alloc(mdoc, ppos, tok);
+ mdoc_body_alloc(mdoc, line, ppos, tok);
mdoc->next = MDOC_NEXT_CHILD;
return(1);
}
- mdoc_head_alloc(mdoc, ppos, tok);
+ mdoc_head_alloc(mdoc, line, ppos, tok);
mdoc->next = MDOC_NEXT_CHILD;
for (j = 0; j < MDOC_LINEARG_MAX; j++) {
@@ -499,7 +501,7 @@ macro_scoped(MACRO_PROT_ARGS)
break;
if (MDOC_MAX == (c = lookup(mdoc, tok, p))) {
- mdoc_word_alloc(mdoc, lastarg, p);
+ mdoc_word_alloc(mdoc, line, lastarg, p);
mdoc->next = MDOC_NEXT_SIBLING;
continue;
}
@@ -514,10 +516,10 @@ macro_scoped(MACRO_PROT_ARGS)
if ( ! rewind_head(mdoc, ppos, tok))
return(0);
- if (1 == ppos && ! append_delims(mdoc, tok, pos, buf))
+ if (1 == ppos && ! append_delims(mdoc, tok, line, pos, buf))
return(0);
- mdoc_body_alloc(mdoc, ppos, tok);
+ mdoc_body_alloc(mdoc, line, ppos, tok);
mdoc->next = MDOC_NEXT_CHILD;
return(1);
@@ -535,10 +537,10 @@ macro_scoped_line(MACRO_PROT_ARGS)
int lastarg, c, j;
char *p;
- mdoc_block_alloc(mdoc, ppos, tok, 0, NULL);
+ mdoc_block_alloc(mdoc, line, ppos, tok, 0, NULL);
mdoc->next = MDOC_NEXT_CHILD;
- mdoc_head_alloc(mdoc, ppos, tok);
+ mdoc_head_alloc(mdoc, line, ppos, tok);
mdoc->next = MDOC_NEXT_CHILD;
/* XXX - no known argument macros. */
@@ -560,7 +562,7 @@ macro_scoped_line(MACRO_PROT_ARGS)
break;
if (MDOC_MAX == (c = lookup(mdoc, tok, p))) {
- mdoc_word_alloc(mdoc, lastarg, p);
+ mdoc_word_alloc(mdoc, line, lastarg, p);
mdoc->next = MDOC_NEXT_SIBLING;
continue;
}
@@ -576,7 +578,7 @@ macro_scoped_line(MACRO_PROT_ARGS)
if (1 == ppos) {
if ( ! rewind_head(mdoc, ppos, tok))
return(0);
- if ( ! append_delims(mdoc, tok, pos, buf))
+ if ( ! append_delims(mdoc, tok, line, pos, buf))
return(0);
}
return(rewind_impblock(mdoc, ppos, tok));
@@ -604,17 +606,17 @@ macro_constant_scoped(MACRO_PROT_ARGS)
if ( ! mdoc_valid_pre(mdoc, tok, ppos, 0, NULL))
return(0);
- mdoc_block_alloc(mdoc, ppos, tok, 0, NULL);
+ mdoc_block_alloc(mdoc, line, ppos, tok, 0, NULL);
mdoc->next = MDOC_NEXT_CHILD;
if (0 == maxargs) {
- mdoc_head_alloc(mdoc, ppos, tok);
+ mdoc_head_alloc(mdoc, line, ppos, tok);
if ( ! rewind_head(mdoc, ppos, tok))
return(0);
- mdoc_body_alloc(mdoc, ppos, tok);
+ mdoc_body_alloc(mdoc, line, ppos, tok);
flushed = 1;
} else
- mdoc_head_alloc(mdoc, ppos, tok);
+ mdoc_head_alloc(mdoc, line, ppos, tok);
mdoc->next = MDOC_NEXT_CHILD;
@@ -625,7 +627,7 @@ macro_constant_scoped(MACRO_PROT_ARGS)
if ( ! rewind_head(mdoc, ppos, tok))
return(0);
flushed = 1;
- mdoc_body_alloc(mdoc, ppos, tok);
+ mdoc_body_alloc(mdoc, line, ppos, tok);
mdoc->next = MDOC_NEXT_CHILD;
}
@@ -642,7 +644,7 @@ macro_constant_scoped(MACRO_PROT_ARGS)
if ( ! rewind_head(mdoc, ppos, tok))
return(0);
flushed = 1;
- mdoc_body_alloc(mdoc, ppos, tok);
+ mdoc_body_alloc(mdoc, line, ppos, tok);
mdoc->next = MDOC_NEXT_CHILD;
}
if ( ! mdoc_macro(mdoc, c, line, lastarg, pos, buf))
@@ -654,11 +656,11 @@ macro_constant_scoped(MACRO_PROT_ARGS)
if ( ! rewind_head(mdoc, ppos, tok))
return(0);
flushed = 1;
- mdoc_body_alloc(mdoc, ppos, tok);
+ mdoc_body_alloc(mdoc, line, ppos, tok);
mdoc->next = MDOC_NEXT_CHILD;
}
- mdoc_word_alloc(mdoc, lastarg, p);
+ mdoc_word_alloc(mdoc, line, lastarg, p);
mdoc->next = MDOC_NEXT_SIBLING;
}
@@ -668,13 +670,13 @@ macro_constant_scoped(MACRO_PROT_ARGS)
if ( ! flushed) {
if ( ! rewind_head(mdoc, ppos, tok))
return(0);
- mdoc_body_alloc(mdoc, ppos, tok);
+ mdoc_body_alloc(mdoc, line, ppos, tok);
mdoc->next = MDOC_NEXT_CHILD;
}
if (ppos > 1)
return(1);
- return(append_delims(mdoc, tok, pos, buf));
+ return(append_delims(mdoc, tok, line, pos, buf));
}
@@ -725,7 +727,7 @@ macro_constant_delimited(MACRO_PROT_ARGS)
return(0);
}
- mdoc_elem_alloc(mdoc, lastarg, tok, argc, argv);
+ mdoc_elem_alloc(mdoc, line, lastarg, tok, argc, argv);
mdoc->next = MDOC_NEXT_CHILD;
mdoc_argv_free(argc, argv);
@@ -762,7 +764,7 @@ macro_constant_delimited(MACRO_PROT_ARGS)
flushed = 1;
}
- mdoc_word_alloc(mdoc, lastarg, p);
+ mdoc_word_alloc(mdoc, line, lastarg, p);
mdoc->next = MDOC_NEXT_SIBLING;
}
@@ -774,7 +776,7 @@ macro_constant_delimited(MACRO_PROT_ARGS)
if (ppos > 1)
return(1);
- return(append_delims(mdoc, tok, pos, buf));
+ return(append_delims(mdoc, tok, line, pos, buf));
}
@@ -815,7 +817,7 @@ macro_constant(MACRO_PROT_ARGS)
return(mdoc_err(mdoc, tok, lastarg, ERR_ARGS_MANY));
}
- mdoc_elem_alloc(mdoc, ppos, tok, argc, argv);
+ mdoc_elem_alloc(mdoc, line, ppos, tok, argc, argv);
mdoc->next = MDOC_NEXT_CHILD;
mdoc_argv_free(argc, argv);
@@ -828,7 +830,7 @@ macro_constant(MACRO_PROT_ARGS)
if (ARGS_EOLN == c)
break;
- mdoc_word_alloc(mdoc, lastarg, p);
+ mdoc_word_alloc(mdoc, line, lastarg, p);
mdoc->next = MDOC_NEXT_SIBLING;
}
diff --git a/mdoc.c b/mdoc.c
index 1ac6d6f3..821f3ce9 100644
--- a/mdoc.c
+++ b/mdoc.c
@@ -121,7 +121,7 @@ const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
{ macro_obsolete, 0 }, /* Ot */
{ macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Pa */
{ macro_constant, 0 }, /* Rv */
- /* XXX - supposed to be (but isn't) callable. */
+ /* XXX - .St supposed to be (but isn't) callable. */
{ macro_constant_delimited, MDOC_PARSED }, /* St */
{ macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Va */
{ macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Vt */
@@ -278,7 +278,7 @@ mdoc_parseln(struct mdoc *mdoc, int line, char *buf)
if ('.' != *buf) {
if (SEC_PROLOGUE == mdoc->sec_lastn)
return(mdoc_err(mdoc, -1, 0, ERR_SYNTAX_NOTEXT));
- mdoc_word_alloc(mdoc, 0, buf);
+ mdoc_word_alloc(mdoc, line, 0, buf);
mdoc->next = MDOC_NEXT_SIBLING;
return(1);
}
@@ -376,7 +376,8 @@ mdoc_macro(struct mdoc *mdoc, int tok,
return(0);
}
- return((*mdoc_macros[tok].fp)(mdoc, tok, line, ppos, pos, buf));
+ return((*mdoc_macros[tok].fp)(mdoc, tok,
+ line, ppos, pos, buf));
}
@@ -478,7 +479,7 @@ mdoc_node_append(struct mdoc *mdoc, int pos, struct mdoc_node *p)
void
-mdoc_tail_alloc(struct mdoc *mdoc, int pos, int tok)
+mdoc_tail_alloc(struct mdoc *mdoc, int line, int pos, int tok)
{
struct mdoc_node *p;
@@ -487,6 +488,8 @@ mdoc_tail_alloc(struct mdoc *mdoc, int pos, int tok)
p = xcalloc(1, sizeof(struct mdoc_node));
+ p->line = line;
+ p->pos = pos;
p->type = MDOC_TAIL;
p->data.tail.tok = tok;
@@ -495,7 +498,7 @@ mdoc_tail_alloc(struct mdoc *mdoc, int pos, int tok)
void
-mdoc_head_alloc(struct mdoc *mdoc, int pos, int tok)
+mdoc_head_alloc(struct mdoc *mdoc, int line, int pos, int tok)
{
struct mdoc_node *p;
@@ -504,6 +507,8 @@ mdoc_head_alloc(struct mdoc *mdoc, int pos, int tok)
p = xcalloc(1, sizeof(struct mdoc_node));
+ p->line = line;
+ p->pos = pos;
p->type = MDOC_HEAD;
p->data.head.tok = tok;
@@ -512,7 +517,7 @@ mdoc_head_alloc(struct mdoc *mdoc, int pos, int tok)
void
-mdoc_body_alloc(struct mdoc *mdoc, int pos, int tok)
+mdoc_body_alloc(struct mdoc *mdoc, int line, int pos, int tok)
{
struct mdoc_node *p;
@@ -521,6 +526,8 @@ mdoc_body_alloc(struct mdoc *mdoc, int pos, int tok)
p = xcalloc(1, sizeof(struct mdoc_node));
+ p->line = line;
+ p->pos = pos;
p->type = MDOC_BODY;
p->data.body.tok = tok;
@@ -529,13 +536,15 @@ mdoc_body_alloc(struct mdoc *mdoc, int pos, int tok)
void
-mdoc_block_alloc(struct mdoc *mdoc, int pos, int tok,
- size_t argsz, const struct mdoc_arg *args)
+mdoc_block_alloc(struct mdoc *mdoc, int line, int pos,
+ int tok, size_t argsz, const struct mdoc_arg *args)
{
struct mdoc_node *p;
p = xcalloc(1, sizeof(struct mdoc_node));
+ p->pos = pos;
+ p->line = line;
p->type = MDOC_BLOCK;
p->data.block.tok = tok;
p->data.block.argc = argsz;
@@ -546,12 +555,15 @@ mdoc_block_alloc(struct mdoc *mdoc, int pos, int tok,
void
-mdoc_elem_alloc(struct mdoc *mdoc, int pos, int tok,
- size_t argsz, const struct mdoc_arg *args)
+mdoc_elem_alloc(struct mdoc *mdoc, int line, int pos,
+ int tok, size_t argsz, const struct mdoc_arg *args)
{
struct mdoc_node *p;
p = xcalloc(1, sizeof(struct mdoc_node));
+
+ p->line = line;
+ p->pos = pos;
p->type = MDOC_ELEM;
p->data.elem.tok = tok;
p->data.elem.argc = argsz;
@@ -562,11 +574,14 @@ mdoc_elem_alloc(struct mdoc *mdoc, int pos, int tok,
void
-mdoc_word_alloc(struct mdoc *mdoc, int pos, const char *word)
+mdoc_word_alloc(struct mdoc *mdoc,
+ int line, int pos, const char *word)
{
struct mdoc_node *p;
p = xcalloc(1, sizeof(struct mdoc_node));
+ p->line = line;
+ p->pos = pos;
p->type = MDOC_TEXT;
p->data.text.string = xstrdup(word);
diff --git a/private.h b/private.h
index 81c3e3ab..e760bcbc 100644
--- a/private.h
+++ b/private.h
@@ -64,14 +64,15 @@ int mdoc_warn(struct mdoc *, int, int, enum mdoc_warn);
void mdoc_msg(struct mdoc *, int, const char *, ...);
int mdoc_macro(MACRO_PROT_ARGS);
int mdoc_find(const struct mdoc *, const char *);
-void mdoc_word_alloc(struct mdoc *, int, const char *);
+void mdoc_word_alloc(struct mdoc *,
+ int, int, const char *);
void mdoc_elem_alloc(struct mdoc *, int, int,
- size_t, const struct mdoc_arg *);
+ int, size_t, const struct mdoc_arg *);
void mdoc_block_alloc(struct mdoc *, int, int,
- size_t, const struct mdoc_arg *);
-void mdoc_head_alloc(struct mdoc *, int, int);
-void mdoc_tail_alloc(struct mdoc *, int, int);
-void mdoc_body_alloc(struct mdoc *, int, int);
+ int, size_t, const struct mdoc_arg *);
+void mdoc_head_alloc(struct mdoc *, int, int, int);
+void mdoc_tail_alloc(struct mdoc *, int, int, int);
+void mdoc_body_alloc(struct mdoc *, int, int, int);
void mdoc_node_free(struct mdoc_node *);
void mdoc_sibling(struct mdoc *, int, struct mdoc_node **,
struct mdoc_node **, struct mdoc_node *);