version 1.161, 2014/12/22 23:27:32 |
version 1.164, 2015/02/01 23:56:37 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2010, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2010, 2012-2015 Ingo Schwarze <schwarze@openbsd.org> |
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
* purpose with or without fee is hereby granted, provided that the above |
* purpose with or without fee is hereby granted, provided that the above |
Line 1137 blk_full(MACRO_PROT_ARGS) |
|
Line 1137 blk_full(MACRO_PROT_ARGS) |
|
|
|
if (tok == MDOC_Nd) { |
if (tok == MDOC_Nd) { |
head = mdoc_head_alloc(mdoc, line, ppos, tok); |
head = mdoc_head_alloc(mdoc, line, ppos, tok); |
rew_sub(MDOC_HEAD, mdoc, tok, line, ppos); |
rew_last(mdoc, head); |
body = mdoc_body_alloc(mdoc, line, ppos, tok); |
body = mdoc_body_alloc(mdoc, line, ppos, tok); |
} |
} |
|
|
Line 1274 blk_part_imp(MACRO_PROT_ARGS) |
|
Line 1274 blk_part_imp(MACRO_PROT_ARGS) |
|
*/ |
*/ |
|
|
blk = mdoc_block_alloc(mdoc, line, ppos, tok, NULL); |
blk = mdoc_block_alloc(mdoc, line, ppos, tok, NULL); |
mdoc_head_alloc(mdoc, line, ppos, tok); |
rew_last(mdoc, mdoc_head_alloc(mdoc, line, ppos, tok)); |
rew_sub(MDOC_HEAD, mdoc, tok, line, ppos); |
|
|
|
/* |
/* |
* Open the body scope "on-demand", that is, after we've |
* Open the body scope "on-demand", that is, after we've |
Line 1322 blk_part_imp(MACRO_PROT_ARGS) |
|
Line 1321 blk_part_imp(MACRO_PROT_ARGS) |
|
} |
} |
} |
} |
assert(n == body); |
assert(n == body); |
rew_sub(MDOC_BODY, mdoc, tok, line, ppos); |
rew_last(mdoc, body); |
if (nl) |
if (nl) |
append_delims(mdoc, line, pos, buf); |
append_delims(mdoc, line, pos, buf); |
rew_sub(MDOC_BLOCK, mdoc, tok, line, ppos); |
rew_last(mdoc, blk); |
|
|
|
/* |
|
* The current block extends an enclosing block. |
|
* Now that the current block ends, close the enclosing block, too. |
|
*/ |
|
|
|
while ((blk = blk->pending) != NULL) { |
|
rew_last(mdoc, blk); |
|
if (blk->type == MDOC_HEAD) |
|
mdoc_body_alloc(mdoc, blk->line, blk->pos, blk->tok); |
|
} |
|
|
/* Move trailing .Ns out of scope. */ |
/* Move trailing .Ns out of scope. */ |
|
|
for (n = body->child; n && n->next; n = n->next) |
for (n = body->child; n && n->next; n = n->next) |
Line 1341 blk_part_exp(MACRO_PROT_ARGS) |
|
Line 1351 blk_part_exp(MACRO_PROT_ARGS) |
|
int la, nl; |
int la, nl; |
enum margserr ac; |
enum margserr ac; |
struct mdoc_node *head; /* keep track of head */ |
struct mdoc_node *head; /* keep track of head */ |
struct mdoc_node *body; /* keep track of body */ |
|
char *p; |
char *p; |
|
|
nl = MDOC_NEWLINE & mdoc->flags; |
nl = MDOC_NEWLINE & mdoc->flags; |
Line 1353 blk_part_exp(MACRO_PROT_ARGS) |
|
Line 1362 blk_part_exp(MACRO_PROT_ARGS) |
|
*/ |
*/ |
|
|
mdoc_block_alloc(mdoc, line, ppos, tok, NULL); |
mdoc_block_alloc(mdoc, line, ppos, tok, NULL); |
for (head = body = NULL; ; ) { |
head = NULL; |
|
for (;;) { |
la = *pos; |
la = *pos; |
ac = mdoc_args(mdoc, line, pos, buf, tok, &p); |
ac = mdoc_args(mdoc, line, pos, buf, tok, &p); |
if (ac == ARGS_PUNCT || ac == ARGS_EOLN) |
if (ac == ARGS_PUNCT || ac == ARGS_EOLN) |
Line 1363 blk_part_exp(MACRO_PROT_ARGS) |
|
Line 1373 blk_part_exp(MACRO_PROT_ARGS) |
|
|
|
if (head == NULL && ac != ARGS_QWORD && |
if (head == NULL && ac != ARGS_QWORD && |
mdoc_isdelim(p) == DELIM_OPEN) { |
mdoc_isdelim(p) == DELIM_OPEN) { |
assert(NULL == body); |
|
dword(mdoc, line, la, p, DELIM_OPEN, 0); |
dword(mdoc, line, la, p, DELIM_OPEN, 0); |
continue; |
continue; |
} |
} |
|
|
if (head == NULL) { |
if (head == NULL) { |
assert(body == NULL); |
|
head = mdoc_head_alloc(mdoc, line, ppos, tok); |
head = mdoc_head_alloc(mdoc, line, ppos, tok); |
} |
if (tok == MDOC_Eo) /* Not parsed. */ |
|
|
/* |
|
* `Eo' gobbles any data into the head, but most other |
|
* macros just immediately close out and begin the body. |
|
*/ |
|
|
|
if (body == NULL) { |
|
assert(head); |
|
/* No check whether it's a macro! */ |
|
if (tok == MDOC_Eo) |
|
dword(mdoc, line, la, p, DELIM_MAX, 0); |
dword(mdoc, line, la, p, DELIM_MAX, 0); |
rew_sub(MDOC_HEAD, mdoc, tok, line, ppos); |
rew_last(mdoc, head); |
body = mdoc_body_alloc(mdoc, line, ppos, tok); |
mdoc_body_alloc(mdoc, line, ppos, tok); |
if (tok == MDOC_Eo) |
if (tok == MDOC_Eo) |
continue; |
continue; |
} |
} |
assert(head != NULL && body != NULL); |
|
|
|
if (macro_or_word(mdoc, tok, line, la, pos, buf, 1)) |
if (macro_or_word(mdoc, tok, line, la, pos, buf, 1)) |
break; |
break; |
Line 1396 blk_part_exp(MACRO_PROT_ARGS) |
|
Line 1393 blk_part_exp(MACRO_PROT_ARGS) |
|
|
|
/* Clean-up to leave in a consistent state. */ |
/* Clean-up to leave in a consistent state. */ |
|
|
if (head == NULL) |
if (head == NULL) { |
mdoc_head_alloc(mdoc, line, ppos, tok); |
rew_last(mdoc, mdoc_head_alloc(mdoc, line, ppos, tok)); |
|
|
if (body == NULL) { |
|
rew_sub(MDOC_HEAD, mdoc, tok, line, ppos); |
|
mdoc_body_alloc(mdoc, line, ppos, tok); |
mdoc_body_alloc(mdoc, line, ppos, tok); |
} |
} |
if (nl) |
if (nl) |