summaryrefslogtreecommitdiffstats
path: root/macro.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2008-12-30 13:43:53 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2008-12-30 13:43:53 +0000
commit66fbe2667c8cf108e8878d8fb7091f0659bc477c (patch)
tree6f9f386fcf6f30b7d3cd1bd82d883c5a7fce2b92 /macro.c
parent38b49bee113edcc4afc7b96453d5f3eb3ef7b965 (diff)
downloadmandoc-66fbe2667c8cf108e8878d8fb7091f0659bc477c.tar.gz
*** empty log message ***
Diffstat (limited to 'macro.c')
-rw-r--r--macro.c99
1 files changed, 82 insertions, 17 deletions
diff --git a/macro.c b/macro.c
index d2e5d30f..63284f8a 100644
--- a/macro.c
+++ b/macro.c
@@ -28,6 +28,7 @@
#include "private.h"
/* FIXME: maxlineargs should be per LINE, no per TOKEN. */
+/* FIXME: prologue check should be in macro_call. */
#define _CC(p) ((const char **)p)
@@ -36,6 +37,8 @@ static int scope_rewind_imp(struct mdoc *, int, int);
static int append_text(struct mdoc *, int,
int, int, char *[]);
static int append_const(struct mdoc *, int, int, int, char *[]);
+static int append_constarg(struct mdoc *, int, int,
+ int, const struct mdoc_arg *);
static int append_scoped(struct mdoc *, int, int, int,
const char *[], int, const struct mdoc_arg *);
static int append_delims(struct mdoc *, int, int *, char *);
@@ -127,6 +130,25 @@ scope_rewind_exp(struct mdoc *mdoc, int ppos, int tok, int dst)
static int
+append_constarg(struct mdoc *mdoc, int tok, int pos,
+ int argc, const struct mdoc_arg *argv)
+{
+
+ switch (tok) {
+ default:
+ break;
+ }
+
+ mdoc_elem_alloc(mdoc, pos, tok, argc, argv, 0, NULL);
+ return(1);
+}
+
+
+/*
+ * Append a node with implicit or explicit scoping ONLY. ALL macros
+ * with the implicit- or explicit-scope callback must be included here.
+ */
+static int
append_scoped(struct mdoc *mdoc, int tok, int pos,
int sz, const char *args[],
int argc, const struct mdoc_arg *argv)
@@ -136,7 +158,15 @@ append_scoped(struct mdoc *mdoc, int tok, int pos,
switch (tok) {
/* ======= ADD MORE MACRO CHECKS BELOW. ======= */
+
case (MDOC_Sh):
+ /*
+ * Check rules for section ordering. We can have
+ * "known" sections (like NAME and so on) and "custom"
+ * sections, which are unknown. If we have a known
+ * section, we should fall within the conventional
+ * section order.
+ */
if (0 == sz)
return(mdoc_err(mdoc, tok, pos, ERR_ARGS_GE1));
@@ -147,18 +177,22 @@ append_scoped(struct mdoc *mdoc, int tok, int pos,
if (SEC_BODY == mdoc->sec_last && SEC_NAME != sec)
return(mdoc_err(mdoc, tok, pos, ERR_SEC_NAME));
-
if (SEC_CUSTOM != sec)
mdoc->sec_lastn = sec;
mdoc->sec_last = sec;
break;
case (MDOC_Ss):
- if (0 == sz)
- return(mdoc_err(mdoc, tok, pos, ERR_ARGS_GE1));
- break;
+ if (0 != sz)
+ break;
+ return(mdoc_err(mdoc, tok, pos, ERR_ARGS_GE1));
case (MDOC_Bd):
+ /*
+ * We can't be nested within any other block displays
+ * (or really any other kind of display, although Bd is
+ * the only multi-line one that will show up).
+ */
assert(mdoc->last);
node = mdoc->last->parent;
/* LINTED */
@@ -167,9 +201,11 @@ append_scoped(struct mdoc *mdoc, int tok, int pos,
continue;
if (node->data.block.tok != MDOC_Bd)
continue;
- return(mdoc_err(mdoc, tok, pos, ERR_SCOPE_NONEST));
+ break;
}
- break;
+ if (NULL == node)
+ break;
+ return(mdoc_err(mdoc, tok, pos, ERR_SCOPE_NONEST));
case (MDOC_Bl):
break;
@@ -194,6 +230,8 @@ append_const(struct mdoc *mdoc, int tok,
switch (tok) {
/* ======= ADD MORE MACRO CHECKS BELOW. ======= */
+
+ /* FIXME: this is the ugliest part of this page. */
case (MDOC_At):
/* This needs special handling. */
if (0 == sz)
@@ -270,9 +308,6 @@ append_text(struct mdoc *mdoc, int tok,
int pos, int sz, char *args[])
{
- assert(sz >= 0);
- args[sz] = NULL;
-
switch (tok) {
/* ======= ADD MORE MACRO CHECKS BELOW. ======= */
case (MDOC_Pp):
@@ -344,7 +379,7 @@ int
macro_text(MACRO_PROT_ARGS)
{
int lastarg, lastpunct, c, j;
- char *args[MDOC_LINEARG_MAX], *p;
+ char *args[MDOC_LINEARG_MAX];
if (SEC_PROLOGUE == mdoc->sec_lastn)
return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE));
@@ -443,11 +478,10 @@ again:
* is non-terminal punctuation.
*/
- p = args[j];
if ( ! lastpunct && ! append_text(mdoc, tok, ppos, j, args))
return(0);
- mdoc_word_alloc(mdoc, lastarg, p);
+ mdoc_word_alloc(mdoc, lastarg, args[j]);
j = 0;
lastpunct = 1;
@@ -967,7 +1001,7 @@ int
macro_constant_delimited(MACRO_PROT_ARGS)
{
int lastarg, flushed, c, maxargs;
- char *p, *pp;
+ char *p;
if (SEC_PROLOGUE == mdoc->sec_lastn)
return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE));
@@ -1014,10 +1048,8 @@ again:
/* Accepts no arguments: flush out symbol and continue. */
if (0 == maxargs) {
- pp = p;
if ( ! append_const(mdoc, tok, ppos, 0, &p))
return(0);
- p = pp;
flushed = 1;
}
@@ -1042,10 +1074,8 @@ again:
flushed = 1;
goto again;
} else if ( ! flushed) {
- pp = p;
if ( ! append_const(mdoc, tok, ppos, 0, &p))
return(0);
- p = pp;
flushed = 1;
}
@@ -1065,6 +1095,7 @@ macro_constant(MACRO_PROT_ARGS)
return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE));
j = 0;
+ lastarg = ppos;
again:
if (j == MDOC_LINEARG_MAX)
@@ -1092,3 +1123,37 @@ again:
goto again;
/* NOTREACHED */
}
+
+
+int
+macro_constant_argv(MACRO_PROT_ARGS)
+{
+ int c, lastarg, j;
+ struct mdoc_arg argv[MDOC_LINEARG_MAX];
+
+ if (SEC_PROLOGUE == mdoc->sec_lastn)
+ return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE));
+
+ lastarg = *pos;
+
+ for (j = 0; j < MDOC_LINEARG_MAX; j++) {
+ lastarg = *pos;
+ c = mdoc_argv(mdoc, tok, &argv[j], pos, buf);
+ if (0 == c)
+ break;
+ else if (1 == c)
+ continue;
+
+ mdoc_argv_free(j, argv);
+ return(0);
+ }
+
+ if (MDOC_LINEARG_MAX == j) {
+ mdoc_argv_free(j, argv);
+ return(mdoc_err(mdoc, tok, lastarg, ERR_ARGS_MANY));
+ }
+
+ c = append_constarg(mdoc, tok, ppos, j, argv);
+ mdoc_argv_free(j, argv);
+ return(c);
+}