aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-04-03 14:02:10 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-04-03 14:02:10 +0000
commit59c7bc58d7303ddeb6eb395dc50a072f2ed339f5 (patch)
tree7f3504c6d42d01d731e46758220cef92739731a7
parenta907445c2b200a31f661cd37cd622ec9328eb04d (diff)
downloadmandoc-59c7bc58d7303ddeb6eb395dc50a072f2ed339f5.tar.gz
mandoc-59c7bc58d7303ddeb6eb395dc50a072f2ed339f5.tar.zst
mandoc-59c7bc58d7303ddeb6eb395dc50a072f2ed339f5.zip
Merged Ingo Schwarze's patch (plus documentation) for removing extraneous list types, which happens fairly often.
-rw-r--r--libmdoc.h3
-rw-r--r--mdoc_argv.c35
-rw-r--r--mdoc_validate.c17
3 files changed, 36 insertions, 19 deletions
diff --git a/libmdoc.h b/libmdoc.h
index 229d660d..c1cf4175 100644
--- a/libmdoc.h
+++ b/libmdoc.h
@@ -1,4 +1,4 @@
-/* $Id: libmdoc.h,v 1.31 2010/03/31 07:13:53 kristaps Exp $ */
+/* $Id: libmdoc.h,v 1.32 2010/04/03 14:02:10 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -167,6 +167,7 @@ int mdoc_argv(struct mdoc *, int, enum mdoct,
#define ARGV_ARG (1)
#define ARGV_WORD (2)
void mdoc_argv_free(struct mdoc_arg *);
+void mdoc_argn_free(struct mdoc_arg *, int);
int mdoc_args(struct mdoc *, int,
int *, char *, enum mdoct, char **);
int mdoc_zargs(struct mdoc *, int,
diff --git a/mdoc_argv.c b/mdoc_argv.c
index 52483803..47221073 100644
--- a/mdoc_argv.c
+++ b/mdoc_argv.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_argv.c,v 1.36 2010/03/31 07:42:04 kristaps Exp $ */
+/* $Id: mdoc_argv.c,v 1.37 2010/04/03 14:02:10 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -288,7 +288,7 @@ mdoc_argv(struct mdoc *m, int line, enum mdoct tok,
void
mdoc_argv_free(struct mdoc_arg *p)
{
- int i, j;
+ int i;
if (NULL == p)
return;
@@ -300,23 +300,28 @@ mdoc_argv_free(struct mdoc_arg *p)
}
assert(p->argc);
- /* LINTED */
- for (i = 0; i < (int)p->argc; i++) {
- if (0 == p->argv[i].sz)
- continue;
- if (NULL == p->argv[i].value)
- continue;
+ for (i = (int)p->argc - 1; i >= 0; i--)
+ mdoc_argn_free(p, i);
+
+ free(p->argv);
+ free(p);
+}
+
- /* LINTED */
- for (j = 0; j < (int)p->argv[i].sz; j++)
- if (p->argv[i].value[j])
- free(p->argv[i].value[j]);
+void
+mdoc_argn_free(struct mdoc_arg *p, int iarg)
+{
+ struct mdoc_argv *arg = &p->argv[iarg];
+ int j;
- free(p->argv[i].value);
+ if (arg->sz && arg->value) {
+ for (j = (int)arg->sz - 1; j >= 0; j--)
+ free(arg->value[j]);
+ free(arg->value);
}
- free(p->argv);
- free(p);
+ for (--p->argc; iarg < (int)p->argc; iarg++)
+ p->argv[iarg] = p->argv[iarg+1];
}
diff --git a/mdoc_validate.c b/mdoc_validate.c
index e83b4c2b..f63bae4e 100644
--- a/mdoc_validate.c
+++ b/mdoc_validate.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_validate.c,v 1.60 2010/04/03 13:02:35 kristaps Exp $ */
+/* $Id: mdoc_validate.c,v 1.61 2010/04/03 14:02:10 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -621,8 +621,19 @@ pre_bl(PRE_ARGS)
case (MDOC_Inset):
/* FALLTHROUGH */
case (MDOC_Column):
- if (type >= 0)
- return(mdoc_nerr(mdoc, n, EMULTILIST));
+ /*
+ * Note that if a duplicate is detected, we
+ * remove the duplicate instead of passing it
+ * over. If we don't do this, mdoc_action will
+ * become confused when it scans over multiple
+ * types whilst setting its bitmasks.
+ */
+ if (type >= 0) {
+ if ( ! mdoc_nwarn(mdoc, n, EMULTILIST))
+ return(0);
+ mdoc_argn_free(n->args, pos);
+ break;
+ }
type = n->args->argv[pos].arg;
break;
case (MDOC_Compact):