-/* $Id: mdoc_macro.c,v 1.65 2010/05/15 04:47:38 kristaps Exp $ */
+/* $Id: mdoc_macro.c,v 1.68 2010/05/17 22:11:42 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
#include <string.h>
#include <time.h>
+#include "mandoc.h"
#include "libmdoc.h"
#include "libmandoc.h"
int line, int pos, const struct mdoc_node *p)
{
const char *n, *t, *tt;
+ int rc;
n = t = "<root>";
tt = "block";
break;
}
- if ( ! (MDOC_IGN_SCOPE & mdoc->pflags))
- return(mdoc_verr(mdoc, line, pos,
- "%s scope breaks %s scope of %s",
- tt, t, n));
- return(mdoc_vwarn(mdoc, line, pos,
- "%s scope breaks %s scope of %s",
- tt, t, n));
+ rc = mdoc_vmsg(mdoc, MANDOCERR_SCOPE, line, pos,
+ "%s scope breaks %s of %s", tt, t, n);
+
+ /* FIXME: logic should be in driver. */
+ return(MDOC_IGN_SCOPE & mdoc->pflags ? rc : 0);
}
continue;
if ( ! (MDOC_EXPLICIT & mdoc_macros[n->tok].flags))
continue;
- return(mdoc_nerr(m, n, EOPEN));
+ mdoc_nmsg(m, n, MANDOCERR_SYNTSCOPE);
+ return(0);
}
/* Rewind to the first. */
return(1);
if ( ! (MDOC_EXPLICIT & mdoc_macros[tok].flags))
return(1);
- return(mdoc_perr(m, line, ppos, ENOCTX));
+ /* FIXME: shouldn't raise an error */
+ mdoc_pmsg(m, line, ppos, MANDOCERR_SYNTNOSCOPE);
+ return(0);
}
if (REWIND_REWIND == c)
break;
static int
-append_delims(struct mdoc *mdoc, int line, int *pos, char *buf)
+append_delims(struct mdoc *m, int line, int *pos, char *buf)
{
- int lastarg;
+ int la;
enum margserr ac;
char *p;
- if (0 == buf[*pos])
+ if ('\0' == buf[*pos])
return(1);
for (;;) {
- lastarg = *pos;
- ac = mdoc_zargs(mdoc, line, pos, buf, ARGS_NOWARN, &p);
+ la = *pos;
+ ac = mdoc_zargs(m, line, pos, buf, ARGS_NOWARN, &p);
if (ARGS_ERROR == ac)
return(0);
else if (ARGS_EOLN == ac)
break;
- assert(mdoc_isdelim(p));
- if ( ! mdoc_word_alloc(mdoc, line, lastarg, p))
+
+ assert(DELIM_NONE != mdoc_isdelim(p));
+ if ( ! mdoc_word_alloc(m, line, la, p))
return(0);
+
+ /*
+ * If we encounter end-of-sentence symbols, then trigger
+ * the double-space.
+ *
+ * XXX: it's easy to allow this to propogate outward to
+ * the last symbol, such that `. )' will cause the
+ * correct double-spacing. However, (1) groff isn't
+ * smart enough to do this and (2) it would require
+ * knowing which symbols break this behaviour, for
+ * example, `. ;' shouldn't propogate the double-space.
+ */
+ if (mandoc_eos(p, strlen(p)))
+ m->last->flags |= MDOC_EOS;
}
return(1);
}
if ( ! (MDOC_CALLABLE & mdoc_macros[tok].flags)) {
+ /* FIXME: do this in validate */
if (buf[*pos])
- if ( ! mdoc_pwarn(m, line, ppos, ENOLINE))
+ if ( ! mdoc_pmsg(m, line, ppos, MANDOCERR_ARGSLOST))
return(0);
if ( ! rew_sub(MDOC_BODY, m, tok, line, ppos))
static int
in_line(MACRO_PROT_ARGS)
{
- int la, lastpunct, cnt, d, nc, nl;
+ int la, lastpunct, cnt, nc, nl;
enum margverr av;
enum mdoct ntok;
enum margserr ac;
+ enum mdelim d;
struct mdoc_arg *arg;
char *p;
return(0);
} else if ( ! nc && 0 == cnt) {
mdoc_argv_free(arg);
- if ( ! mdoc_pwarn(m, line, ppos, EIGNE))
+ if ( ! mdoc_pmsg(m, line, ppos, MANDOCERR_MACROEMPTY))
return(0);
}
if ( ! mdoc_macro(m, ntok, line, la, pos, buf))
* the word.
*/
- d = ARGS_QWORD == ac ? 0 : mdoc_isdelim(p);
+ d = ARGS_QWORD == ac ? DELIM_NONE : mdoc_isdelim(p);
- if (ARGS_QWORD != ac && d) {
+ if (ARGS_QWORD != ac && DELIM_NONE != d) {
if (0 == lastpunct && ! rew_elem(m, tok))
return(0);
lastpunct = 1;
lastpunct = 0;
}
- if ( ! d)
+ if (DELIM_NONE == d)
cnt++;
if ( ! mdoc_word_alloc(m, line, la, p))
return(0);
return(0);
} else if ( ! nc && 0 == cnt) {
mdoc_argv_free(arg);
- if ( ! mdoc_pwarn(m, line, ppos, EIGNE))
+ if ( ! mdoc_pmsg(m, line, ppos, MANDOCERR_MACROEMPTY))
return(0);
}
ARGS_PHRASE != ac &&
ARGS_PPHRASE != ac &&
ARGS_QWORD != ac &&
- 1 == mdoc_isdelim(p)) {
+ DELIM_OPEN == mdoc_isdelim(p)) {
if ( ! mdoc_word_alloc(m, line, la, p))
return(0);
continue;
break;
if (NULL == body && ARGS_QWORD != ac &&
- 1 == mdoc_isdelim(p)) {
+ DELIM_OPEN == mdoc_isdelim(p)) {
if ( ! mdoc_word_alloc(m, line, la, p))
return(0);
continue;
if (body == n)
break;
- if (NULL == n && ! mdoc_nwarn(m, body, EIMPBRK))
+ if (NULL == n && ! mdoc_nmsg(m, body, MANDOCERR_SCOPE))
return(0);
if (n && ! rew_last(m, body))
/* Flush out leading punctuation. */
if (NULL == head && ARGS_QWORD != ac &&
- 1 == mdoc_isdelim(p)) {
+ DELIM_OPEN == mdoc_isdelim(p)) {
assert(NULL == body);
if ( ! mdoc_word_alloc(m, line, la, p))
return(0);
if ( ! (MDOC_IGNDELIM & mdoc_macros[tok].flags) &&
ARGS_QWORD != ac &&
- 0 == j && 1 == mdoc_isdelim(p)) {
+ 0 == j && DELIM_OPEN == mdoc_isdelim(p)) {
if ( ! mdoc_word_alloc(m, line, la, p))
return(0);
continue;
if ( ! (MDOC_IGNDELIM & mdoc_macros[tok].flags) &&
ARGS_QWORD != ac &&
- ! flushed && mdoc_isdelim(p)) {
+ ! flushed &&
+ DELIM_NONE != mdoc_isdelim(p)) {
if ( ! rew_elem(m, tok))
return(0);
flushed = 1;
obsolete(MACRO_PROT_ARGS)
{
- return(mdoc_pwarn(m, line, ppos, EOBS));
+ return(mdoc_pmsg(m, line, ppos, MANDOCERR_MACROOBS));
}