aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2008-12-04 16:34:59 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2008-12-04 16:34:59 +0000
commita705f91ffa6329b5fc3e6c09ce337b0972c19e2e (patch)
tree24b987382872da9c87d33e083a60e72e3afe4644
parent9b08769d420c8fb749fc6b70d3118ead5f54e2ea (diff)
downloadmandoc-a705f91ffa6329b5fc3e6c09ce337b0972c19e2e.tar.gz
mandoc-a705f91ffa6329b5fc3e6c09ce337b0972c19e2e.tar.zst
mandoc-a705f91ffa6329b5fc3e6c09ce337b0972c19e2e.zip
Character-set validation fixes.
-rw-r--r--index.716
-rw-r--r--mlg.c15
-rw-r--r--private.h5
-rw-r--r--roff.c12
-rw-r--r--tokens.c11
5 files changed, 44 insertions, 15 deletions
diff --git a/index.7 b/index.7
index 5fa0e2e4..fdf6eede 100644
--- a/index.7
+++ b/index.7
@@ -21,8 +21,9 @@ and
.Nm
acts directly on source documents, validating its input and producing a
variety of outputs.
-.Ss Features
-In order to operate properly,
+.\"
+.Ss Validation
+In order to operate sanely,
.Nm
fully validates its input. This includes, but is not limited to, the
following checks:
@@ -40,10 +41,19 @@ macros clobbering a pending
.Sq \&.Bl
scope),
.It
-predefined characters (such as \\*(>= and \\*q),
+predefined characters (such as \\*(>= and \\*q, rendering as \*(>= and \*q,
+respectively),
.It
correctly-ordered document prelude,
+.It
+sane argument values (such as those for
+.Sq \& Dt
+or
+.Sq \& Sm ) ,
+.It
+and so on.
.El
+.Pp
.\"
.Sh ENVIRONMENT
The
diff --git a/mlg.c b/mlg.c
index fb35210f..b8356839 100644
--- a/mlg.c
+++ b/mlg.c
@@ -1,4 +1,4 @@
-/* $Id: mlg.c,v 1.5 2008/12/04 16:19:52 kristaps Exp $ */
+/* $Id: mlg.c,v 1.6 2008/12/04 16:34:59 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -594,10 +594,6 @@ mlg_rofftoken(void *arg, int space, int value)
seq = "&nbsp;";
sz = 6;
break;
- case (ROFFTok_Null):
- seq = "";
- sz = 0;
- break;
case (ROFFTok_Hyphen):
seq = "&#8208;";
sz = 7;
@@ -670,13 +666,20 @@ mlg_rofftoken(void *arg, int space, int value)
seq = "Nan";
sz = 3;
break;
+ case (ROFFTok_Quote):
+ seq = "&quot;";
+ sz = 6;
+ break;
+ default:
+ /* TODO: print error. */
+ return(0);
}
if (space && ! ml_nputs(p->mbuf, " ", 1, &res))
return(0);
p->pos += res;
- if (0 != sz && ! ml_nputs(p->mbuf, seq, sz, &res))
+ if ( ! ml_nputs(p->mbuf, seq, sz, &res))
return(0);
p->pos += res;
diff --git a/private.h b/private.h
index b68b54aa..20b94d57 100644
--- a/private.h
+++ b/private.h
@@ -1,4 +1,4 @@
-/* $Id: private.h,v 1.27 2008/12/04 16:19:52 kristaps Exp $ */
+/* $Id: private.h,v 1.28 2008/12/04 16:34:59 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -64,7 +64,8 @@ struct md_mbuf {
#define ROFFTok_Infty 24
#define ROFFTok_Bar 25
#define ROFFTok_Nan 26
-#define ROFFTok_MAX 27
+#define ROFFTok_Quote 27
+#define ROFFTok_MAX 28
#define ROFF___ 0
#define ROFF_Dd 1
diff --git a/roff.c b/roff.c
index d61be82a..f5e3cc1f 100644
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/* $Id: roff.c,v 1.37 2008/12/04 16:19:52 kristaps Exp $ */
+/* $Id: roff.c,v 1.38 2008/12/04 16:34:59 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -971,12 +971,20 @@ roffdata(struct rofftree *tree, int space, char *buf)
{
int tok;
+ if (0 == *buf)
+ return(1);
+
if (-1 == (tok = rofftok_scan(buf))) {
roff_err(tree, buf, "invalid character sequence");
return(0);
- } else if (ROFFTok_MAX != tok)
+ } else if (ROFFTok_MAX != tok) {
+ if (ROFFTok_Null == tok) { /* FIXME */
+ buf += 2;
+ return(roffdata(tree, space, buf));
+ }
return((*tree->cb.rofftoken)
(tree->arg, space != 0, tok));
+ }
return((*tree->cb.roffdata)(tree->arg,
space != 0, tree->cur, buf));
diff --git a/tokens.c b/tokens.c
index 6c9bab30..82b1af7a 100644
--- a/tokens.c
+++ b/tokens.c
@@ -1,4 +1,4 @@
-/* $Id: tokens.c,v 1.1 2008/12/04 16:19:52 kristaps Exp $ */
+/* $Id: tokens.c,v 1.2 2008/12/04 16:34:59 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -88,7 +88,12 @@ rofftok_predef(const char *buf)
if ('(' == *buf)
return(rofftok_defined(++buf));
- /* TODO */
+ switch (*buf) {
+ case ('q'):
+ return(ROFFTok_Quote);
+ default:
+ break;
+ }
return(-1);
}
@@ -173,6 +178,8 @@ rofftok_scan(const char *buf)
return(ROFFTok_Hyphen);
case ('*'):
return(rofftok_predef(++buf));
+ case ('\\'):
+ return(ROFFTok_MAX);
default:
break;
}