-/* $Id: macro.c,v 1.26 2009/01/07 15:57:14 kristaps Exp $ */
+/* $Id: macro.c,v 1.27 2009/01/07 16:11:40 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
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 *);
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;
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;
}
flushed = 0;
if (maxargs > 0) {
- mdoc_tail_alloc(mdoc, ppos, tt);
+ mdoc_tail_alloc(mdoc, line, ppos, tt);
mdoc->next = MDOC_NEXT_CHILD;
}
break;
}
- mdoc_word_alloc(mdoc, lastarg, p);
+ mdoc_word_alloc(mdoc, line, lastarg, p);
mdoc->next = MDOC_NEXT_SIBLING;
}
if (ppos > 1)
return(1);
- return(append_delims(mdoc, tok, pos, buf));
+ return(append_delims(mdoc, tok, line, pos, buf));
}
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;
}
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)) {
}
lastpunct = 1;
}
- mdoc_word_alloc(mdoc, lastarg, p);
+ mdoc_word_alloc(mdoc, line, lastarg, p);
mdoc->next = MDOC_NEXT_SIBLING;
}
return(0);
if (ppos > 1)
return(1);
- return(append_delims(mdoc, tok, pos, buf));
+ return(append_delims(mdoc, tok, line, pos, buf));
}
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++) {
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;
}
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);
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. */
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;
}
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));
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;
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 ( ! 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))
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;
}
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));
}
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);
flushed = 1;
}
- mdoc_word_alloc(mdoc, lastarg, p);
+ mdoc_word_alloc(mdoc, line, lastarg, p);
mdoc->next = MDOC_NEXT_SIBLING;
}
if (ppos > 1)
return(1);
- return(append_delims(mdoc, tok, pos, buf));
+ return(append_delims(mdoc, tok, line, pos, buf));
}
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);
if (ARGS_EOLN == c)
break;
- mdoc_word_alloc(mdoc, lastarg, p);
+ mdoc_word_alloc(mdoc, line, lastarg, p);
mdoc->next = MDOC_NEXT_SIBLING;
}
-/* $Id: mdoc.c,v 1.21 2009/01/07 15:57:14 kristaps Exp $ */
+/* $Id: mdoc.c,v 1.22 2009/01/07 16:11:40 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
{ 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 */
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);
}
return(0);
}
- return((*mdoc_macros[tok].fp)(mdoc, tok, line, ppos, pos, buf));
+ return((*mdoc_macros[tok].fp)(mdoc, tok,
+ line, ppos, pos, buf));
}
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;
p = xcalloc(1, sizeof(struct mdoc_node));
+ p->line = line;
+ p->pos = pos;
p->type = MDOC_TAIL;
p->data.tail.tok = 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;
p = xcalloc(1, sizeof(struct mdoc_node));
+ p->line = line;
+ p->pos = pos;
p->type = MDOC_HEAD;
p->data.head.tok = 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;
p = xcalloc(1, sizeof(struct mdoc_node));
+ p->line = line;
+ p->pos = pos;
p->type = MDOC_BODY;
p->data.body.tok = 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;
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;
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);