* mdocml: Squash bug noted by Ulrich Spoerlein where "-" were being
@ 2010-06-09 19:22 kristaps
0 siblings, 0 replies; only message in thread
From: kristaps @ 2010-06-09 19:22 UTC (permalink / raw)
To: source
Log Message:
-----------
Squash bug noted by Ulrich Spoerlein where "-" were being converted to
ASCII_HYPH, as per normal, but were screwing up mandoc_special(). Fixed
by making mandoc_special() first check isspace() instead of ! isgraph(),
then normalise its string as it passes out. This require de-constifying
some validation routines not already de-constified (those in libman),
but that's ok, because I'd like to be pushing actions into validation
routines to save on space and redundant calculations.
Modified Files:
--------------
mdocml:
libman.h
libmandoc.h
man_validate.c
mandoc.c
mdoc_validate.c
Revision Data
-------------
Index: mandoc.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mandoc.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -Lmandoc.c -Lmandoc.c -u -p -r1.17 -r1.18
--- mandoc.c
+++ mandoc.c
@@ -27,20 +27,42 @@
#include <string.h>
#include <time.h>
+#include "mandoc.h"
#include "libmandoc.h"
-static int a2time(time_t *, const char *, const char *);
+static int a2time(time_t *, const char *, const char *);
+static int spec_norm(char *, int);
+
+
+/*
+ * "Normalise" a special string by converting its ASCII_HYPH entries
+ * into actual hyphens.
+ */
+static int
+spec_norm(char *p, int sz)
+{
+ int i;
+
+ for (i = 0; i < sz; i++)
+ if (ASCII_HYPH == p[i])
+ p[i] = '-';
+
+ return(sz);
+}
int
-mandoc_special(const char *p)
+mandoc_special(char *p)
{
int terminator; /* Terminator for \s. */
int lim; /* Limit for N in \s. */
int c, i;
+ char *sv;
+ sv = p;
+
if ('\\' != *p++)
- return(0);
+ return(spec_norm(sv, 0));
switch (*p) {
case ('\''):
@@ -49,6 +71,8 @@ mandoc_special(const char *p)
/* FALLTHROUGH */
case ('q'):
/* FALLTHROUGH */
+ case (ASCII_HYPH):
+ /* FALLTHROUGH */
case ('-'):
/* FALLTHROUGH */
case ('~'):
@@ -72,12 +96,12 @@ mandoc_special(const char *p)
case (':'):
/* FALLTHROUGH */
case ('c'):
- return(2);
+ /* FALLTHROUGH */
case ('e'):
- return(2);
+ return(spec_norm(sv, 2));
case ('s'):
if ('\0' == *++p)
- return(2);
+ return(spec_norm(sv, 2));
c = 2;
terminator = 0;
@@ -107,21 +131,21 @@ mandoc_special(const char *p)
if (*p == '\'') {
if (terminator)
- return(0);
+ return(spec_norm(sv, 0));
lim = 0;
terminator = 1;
++p;
++c;
} else if (*p == '[') {
if (terminator)
- return(0);
+ return(spec_norm(sv, 0));
lim = 0;
terminator = 2;
++p;
++c;
} else if (*p == '(') {
if (terminator)
- return(0);
+ return(spec_norm(sv, 0));
lim = 2;
terminator = 3;
++p;
@@ -131,7 +155,7 @@ mandoc_special(const char *p)
/* TODO: needs to handle floating point. */
if ( ! isdigit((u_char)*p))
- return(0);
+ return(spec_norm(sv, 0));
for (i = 0; isdigit((u_char)*p); i++) {
if (lim && i >= lim)
@@ -142,52 +166,52 @@ mandoc_special(const char *p)
if (terminator && terminator < 3) {
if (1 == terminator && *p != '\'')
- return(0);
+ return(spec_norm(sv, 0));
if (2 == terminator && *p != ']')
- return(0);
+ return(spec_norm(sv, 0));
++p;
++c;
}
- return(c);
+ return(spec_norm(sv, c));
case ('f'):
/* FALLTHROUGH */
case ('F'):
/* FALLTHROUGH */
case ('*'):
- if (0 == *++p || ! isgraph((u_char)*p))
- return(0);
+ if ('\0' == *++p || isspace((u_char)*p))
+ return(spec_norm(sv, 0));
switch (*p) {
case ('('):
- if (0 == *++p || ! isgraph((u_char)*p))
- return(0);
- return(4);
+ if ('\0' == *++p || isspace((u_char)*p))
+ return(spec_norm(sv, 0));
+ return(spec_norm(sv, 4));
case ('['):
for (c = 3, p++; *p && ']' != *p; p++, c++)
- if ( ! isgraph((u_char)*p))
+ if (isspace((u_char)*p))
break;
- return(*p == ']' ? c : 0);
+ return(spec_norm(sv, *p == ']' ? c : 0));
default:
break;
}
- return(3);
+ return(spec_norm(sv, 3));
case ('('):
- if (0 == *++p || ! isgraph((u_char)*p))
- return(0);
- if (0 == *++p || ! isgraph((u_char)*p))
- return(0);
- return(4);
+ if ('\0' == *++p || isspace((u_char)*p))
+ return(spec_norm(sv, 0));
+ if ('\0' == *++p || isspace((u_char)*p))
+ return(spec_norm(sv, 0));
+ return(spec_norm(sv, 4));
case ('['):
break;
default:
- return(0);
+ return(spec_norm(sv, 0));
}
for (c = 3, p++; *p && ']' != *p; p++, c++)
- if ( ! isgraph((u_char)*p))
+ if (isspace((u_char)*p))
break;
- return(*p == ']' ? c : 0);
+ return(spec_norm(sv, *p == ']' ? c : 0));
}
Index: mdoc_validate.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_validate.c,v
retrieving revision 1.91
retrieving revision 1.92
diff -Lmdoc_validate.c -Lmdoc_validate.c -u -p -r1.91 -r1.92
--- mdoc_validate.c
+++ mdoc_validate.c
@@ -47,12 +47,10 @@ struct valids {
static int check_parent(PRE_ARGS, enum mdoct, enum mdoc_type);
static int check_stdarg(PRE_ARGS);
-static int check_text(struct mdoc *, int, int, const char *);
+static int check_text(struct mdoc *, int, int, char *);
static int check_argv(struct mdoc *,
- const struct mdoc_node *,
- const struct mdoc_argv *);
-static int check_args(struct mdoc *,
- const struct mdoc_node *);
+ struct mdoc_node *, struct mdoc_argv *);
+static int check_args(struct mdoc *, struct mdoc_node *);
static int err_child_lt(struct mdoc *, const char *, int);
static int warn_child_lt(struct mdoc *, const char *, int);
static int err_child_gt(struct mdoc *, const char *, int);
@@ -277,7 +275,7 @@ mdoc_valid_pre(struct mdoc *mdoc, struct
{
v_pre *p;
int line, pos;
- const char *tp;
+ char *tp;
if (MDOC_TEXT == n->type) {
tp = n->string;
@@ -419,7 +417,7 @@ check_stdarg(PRE_ARGS)
static int
-check_args(struct mdoc *m, const struct mdoc_node *n)
+check_args(struct mdoc *m, struct mdoc_node *n)
{
int i;
@@ -436,8 +434,7 @@ check_args(struct mdoc *m, const struct
static int
-check_argv(struct mdoc *m, const struct mdoc_node *n,
- const struct mdoc_argv *v)
+check_argv(struct mdoc *m, struct mdoc_node *n, struct mdoc_argv *v)
{
int i;
@@ -457,7 +454,7 @@ check_argv(struct mdoc *m, const struct
static int
-check_text(struct mdoc *mdoc, int line, int pos, const char *p)
+check_text(struct mdoc *mdoc, int line, int pos, char *p)
{
int c;
Index: libman.h
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/libman.h,v
retrieving revision 1.34
retrieving revision 1.35
diff -Llibman.h -Llibman.h -u -p -r1.34 -r1.35
--- libman.h
+++ libman.h
@@ -79,7 +79,7 @@ int man_args(struct man *, int, int *
int man_vmsg(struct man *, enum mandocerr,
int, int, const char *, ...);
int man_valid_post(struct man *);
-int man_valid_pre(struct man *, const struct man_node *);
+int man_valid_pre(struct man *, struct man_node *);
int man_action_post(struct man *);
int man_action_pre(struct man *, struct man_node *);
int man_unscope(struct man *,
Index: man_validate.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/man_validate.c,v
retrieving revision 1.42
retrieving revision 1.43
diff -Lman_validate.c -Lman_validate.c -u -p -r1.42 -r1.43
--- man_validate.c
+++ man_validate.c
@@ -31,7 +31,7 @@
#include "libman.h"
#include "libmandoc.h"
-#define CHKARGS struct man *m, const struct man_node *n
+#define CHKARGS struct man *m, struct man_node *n
typedef int (*v_check)(CHKARGS);
@@ -101,7 +101,7 @@ static const struct man_valid man_valids
int
-man_valid_pre(struct man *m, const struct man_node *n)
+man_valid_pre(struct man *m, struct man_node *n)
{
v_check *cp;
@@ -204,7 +204,7 @@ check_title(CHKARGS)
static int
check_text(CHKARGS)
{
- const char *p;
+ char *p;
int pos, c;
assert(n->string);
Index: libmandoc.h
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/libmandoc.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -Llibmandoc.h -Llibmandoc.h -u -p -r1.6 -r1.7
--- libmandoc.h
+++ libmandoc.h
@@ -19,7 +19,7 @@
__BEGIN_DECLS
-int mandoc_special(const char *);
+int mandoc_special(char *);
void *mandoc_calloc(size_t, size_t);
char *mandoc_strdup(const char *);
void *mandoc_malloc(size_t);
--
To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2010-06-09 19:22 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-06-09 19:22 mdocml: Squash bug noted by Ulrich Spoerlein where "-" were being kristaps
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).