source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* 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).