source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: some scaling unit fixes: - .sp with an invalid argument is .sp
@ 2014-12-23  9:32 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2014-12-23  9:32 UTC (permalink / raw)
  To: source

Log Message:
-----------
some scaling unit fixes:
- .sp with an invalid argument is .sp 1v, not .sp 0v
- in man(1), trailing garbage doesn't make scaling units invalid

Modified Files:
--------------
    mdocml:
        man_html.c
        man_term.c
        mdoc_html.c
        mdoc_man.c
        mdoc_term.c
        out.c

Revision Data
-------------
Index: mdoc_term.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mdoc_term.c,v
retrieving revision 1.299
retrieving revision 1.300
diff -Lmdoc_term.c -Lmdoc_term.c -u -p -r1.299 -r1.300
--- mdoc_term.c
+++ mdoc_term.c
@@ -50,7 +50,6 @@ struct	termact {
 };
 
 static	size_t	  a2width(const struct termp *, const char *);
-static	size_t	  a2height(const struct termp *, const char *);
 
 static	void	  print_bvspace(struct termp *,
 			const struct mdoc_node *,
@@ -527,25 +526,11 @@ print_mdoc_head(struct termp *p, const v
 }
 
 static size_t
-a2height(const struct termp *p, const char *v)
-{
-	struct roffsu	 su;
-
-
-	assert(v);
-	if ( ! a2roffsu(v, &su, SCALE_VS))
-		SCALE_VS_INIT(&su, atoi(v));
-
-	return(term_vspan(p, &su));
-}
-
-static size_t
 a2width(const struct termp *p, const char *v)
 {
 	struct roffsu	 su;
 
-	assert(v);
-	if ( ! a2roffsu(v, &su, SCALE_MAX)) {
+	if (a2roffsu(v, &su, SCALE_MAX) < 2) {
 		SCALE_HS_INIT(&su, term_strlen(p, v));
 		su.scale /= term_strlen(p, "0");
 	}
@@ -1816,11 +1801,17 @@ termp_in_post(DECL_ARGS)
 static int
 termp_sp_pre(DECL_ARGS)
 {
+	struct roffsu	 su;
 	size_t		 i, len;
 
 	switch (n->tok) {
 	case MDOC_sp:
-		len = n->child ? a2height(p, n->child->string) : 1;
+		if (n->child) {
+			if ( ! a2roffsu(n->child->string, &su, SCALE_VS))
+				su.scale = 1.0;
+			len = term_vspan(p, &su);
+		} else
+			len = 1;
 		break;
 	case MDOC_br:
 		len = 0;
Index: mdoc_man.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mdoc_man.c,v
retrieving revision 1.77
retrieving revision 1.78
diff -Lmdoc_man.c -Lmdoc_man.c -u -p -r1.77 -r1.78
--- mdoc_man.c
+++ mdoc_man.c
@@ -434,7 +434,7 @@ print_offs(const char *v, int keywords)
 		sz = 6;
 	else if (keywords && !strcmp(v, "indent-two"))
 		sz = 12;
-	else if (a2roffsu(v, &su, SCALE_MAX)) {
+	else if (a2roffsu(v, &su, SCALE_EN) < 2) {
 		if (SCALE_EN == su.unit)
 			sz = su.scale;
 		else {
@@ -481,7 +481,7 @@ print_width(const char *v, const struct 
 	/* Convert v into a number (of characters). */
 	if (NULL == v)
 		sz = defsz;
-	else if (a2roffsu(v, &su, SCALE_MAX)) {
+	else if (a2roffsu(v, &su, SCALE_MAX) < 2) {
 		if (SCALE_EN == su.unit)
 			sz = su.scale;
 		else {
Index: mdoc_html.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mdoc_html.c,v
retrieving revision 1.216
retrieving revision 1.217
diff -Lmdoc_html.c -Lmdoc_html.c -u -p -r1.216 -r1.217
--- mdoc_html.c
+++ mdoc_html.c
@@ -279,7 +279,7 @@ static void
 a2width(const char *p, struct roffsu *su)
 {
 
-	if ( ! a2roffsu(p, su, SCALE_MAX)) {
+	if (a2roffsu(p, su, SCALE_MAX) < 2) {
 		su->unit = SCALE_EN;
 		su->scale = html_strlen(p);
 	}
@@ -1568,7 +1568,7 @@ mdoc_sp_pre(MDOC_ARGS)
 	if (MDOC_sp == n->tok) {
 		if (NULL != (n = n->child))
 			if ( ! a2roffsu(n->string, &su, SCALE_VS))
-				SCALE_VS_INIT(&su, atoi(n->string));
+				su.scale = 1.0;
 	} else
 		su.scale = 0.0;
 
Index: out.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/out.c,v
retrieving revision 1.55
retrieving revision 1.56
diff -Lout.c -Lout.c -u -p -r1.55 -r1.56
--- out.c
+++ out.c
@@ -40,65 +40,64 @@ static	void	tblcalc_number(struct rofftb
  * Parse the *src string and store a scaling unit into *dst.
  * If the string doesn't specify the unit, use the default.
  * If no default is specified, fail.
- * Return 1 on success and 0 on failure.
+ * Return 2 on complete success, 1 when a conversion was done,
+ * but there was trailing garbage, and 0 on total failure.
  */
 int
 a2roffsu(const char *src, struct roffsu *dst, enum roffscale def)
 {
 	char		*endptr;
-	double		 scale;
-	enum roffscale	 unit;
 
-	scale = strtod(src, &endptr);
-	if (endptr == src || (endptr[0] != '\0' && endptr[1] != '\0'))
+	dst->unit = def == SCALE_MAX ? SCALE_BU : def;
+	dst->scale = strtod(src, &endptr);
+	if (endptr == src)
 		return(0);
 
-	switch (*endptr) {
+	switch (*endptr++) {
 	case 'c':
-		unit = SCALE_CM;
+		dst->unit = SCALE_CM;
 		break;
 	case 'i':
-		unit = SCALE_IN;
+		dst->unit = SCALE_IN;
+		break;
+	case 'f':
+		dst->unit = SCALE_FS;
+		break;
+	case 'M':
+		dst->unit = SCALE_MM;
+		break;
+	case 'm':
+		dst->unit = SCALE_EM;
+		break;
+	case 'n':
+		dst->unit = SCALE_EN;
 		break;
 	case 'P':
-		unit = SCALE_PC;
+		dst->unit = SCALE_PC;
 		break;
 	case 'p':
-		unit = SCALE_PT;
+		dst->unit = SCALE_PT;
 		break;
-	case 'f':
-		unit = SCALE_FS;
+	case 'u':
+		dst->unit = SCALE_BU;
 		break;
 	case 'v':
-		unit = SCALE_VS;
-		break;
-	case 'm':
-		unit = SCALE_EM;
+		dst->unit = SCALE_VS;
 		break;
 	case '\0':
+		endptr--;
+		/* FALLTHROUGH */
+	default:
 		if (SCALE_MAX == def)
 			return(0);
-		unit = def;
-		break;
-	case 'u':
-		unit = SCALE_BU;
-		break;
-	case 'M':
-		unit = SCALE_MM;
-		break;
-	case 'n':
-		unit = SCALE_EN;
+		dst->unit = def;
 		break;
-	default:
-		return(0);
 	}
 
 	/* FIXME: do this in the caller. */
-	if (scale < 0.0)
-		scale = 0.0;
-	dst->scale = scale;
-	dst->unit = unit;
-	return(1);
+	if (dst->scale < 0.0)
+		dst->scale = 0.0;
+	return(*endptr == '\0' ? 2 : 1);
 }
 
 /*
Index: man_term.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/man_term.c,v
retrieving revision 1.161
retrieving revision 1.162
diff -Lman_term.c -Lman_term.c -u -p -r1.161 -r1.162
--- man_term.c
+++ man_term.c
@@ -57,7 +57,6 @@ struct	termact {
 };
 
 static	int		  a2width(const struct termp *, const char *);
-static	size_t		  a2height(const struct termp *, const char *);
 
 static	void		  print_man_nodelist(DECL_ARGS);
 static	void		  print_man_node(DECL_ARGS);
@@ -184,18 +183,6 @@ terminal_man(void *arg, const struct man
 	}
 }
 
-
-static size_t
-a2height(const struct termp *p, const char *cp)
-{
-	struct roffsu	 su;
-
-	if ( ! a2roffsu(cp, &su, SCALE_VS))
-		SCALE_VS_INIT(&su, atoi(cp));
-
-	return(term_vspan(p, &su));
-}
-
 static int
 a2width(const struct termp *p, const char *cp)
 {
@@ -464,6 +451,7 @@ pre_in(DECL_ARGS)
 static int
 pre_sp(DECL_ARGS)
 {
+	struct roffsu	 su;
 	char		*s;
 	size_t		 i, len;
 	int		 neg;
@@ -501,7 +489,9 @@ pre_sp(DECL_ARGS)
 			neg = 1;
 			s++;
 		}
-		len = a2height(p, s);
+		if ( ! a2roffsu(s, &su, SCALE_VS))
+			su.scale = 1.0;
+		len = term_vspan(p, &su);
 		break;
 	}
 
Index: man_html.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/man_html.c,v
retrieving revision 1.107
retrieving revision 1.108
diff -Lman_html.c -Lman_html.c -u -p -r1.107 -r1.108
--- man_html.c
+++ man_html.c
@@ -362,7 +362,7 @@ man_br_pre(MAN_ARGS)
 	if (MAN_sp == n->tok) {
 		if (NULL != (n = n->child))
 			if ( ! a2roffsu(n->string, &su, SCALE_VS))
-				SCALE_VS_INIT(&su, atoi(n->string));
+				su.scale = 1.0;
 	} else
 		su.scale = 0.0;
 
--
 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:[~2014-12-23  9:32 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-12-23  9:32 mdocml: some scaling unit fixes: - .sp with an invalid argument is .sp schwarze

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).