From b91662305e6d87cdb8d5494c0fc742b1dd45b29c Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Fri, 9 Oct 2009 06:54:11 +0000 Subject: Scaling factor made floating point (as per groff.7) and, e.g., gnu/usr.bin/cvs/man/cvs.1. --- html.c | 10 +++++++--- out.c | 36 ++++++++++++++++++++++++++++++------ out.h | 11 +++++++---- 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/html.c b/html.c index 00094522..5ab4c877 100644 --- a/html.c +++ b/html.c @@ -1,4 +1,4 @@ -/* $Id: html.c,v 1.61 2009/10/07 15:27:11 kristaps Exp $ */ +/* $Id: html.c,v 1.62 2009/10/09 06:54:11 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -599,7 +599,7 @@ buffmt_man(struct html *h, void bufcat_su(struct html *h, const char *p, const struct roffsu *su) { - int v; + double v; char *u; v = su->scale; @@ -639,5 +639,9 @@ bufcat_su(struct html *h, const char *p, const struct roffsu *su) break; } - buffmt(h, "%s: %d%s;", p, v, u); + if (su->pt) + buffmt(h, "%s: %f%s;", p, v, u); + else + /* LINTED */ + buffmt(h, "%s: %d%s;", p, (int)v, u); } diff --git a/out.c b/out.c index 4b30ad40..41467209 100644 --- a/out.c +++ b/out.c @@ -1,4 +1,4 @@ -/* $Id: out.c,v 1.3 2009/10/07 12:35:24 kristaps Exp $ */ +/* $Id: out.c,v 1.4 2009/10/09 06:54:11 kristaps Exp $ */ /* * Copyright (c) 2009 Kristaps Dzonsons * @@ -46,17 +46,39 @@ int a2roffsu(const char *src, struct roffsu *dst) { - char buf[BUFSIZ], *p; + char buf[BUFSIZ], hasd; int i; enum roffscale unit; - for (p = buf, i = 0; i < BUFSIZ && isdigit((u_char)*src); i++) - *p++ = *src++; + i = hasd = 0; + + switch (*src) { + case ('+'): + src++; + break; + case ('-'): + buf[i++] = *src++; + break; + default: + break; + } + + while (i < BUFSIZ) { + if ( ! isdigit((u_char)*src)) { + if ('.' != *src) + break; + else if (hasd) + break; + else + hasd = 1; + } + buf[i++] = *src++; + } if (BUFSIZ == i || (*src && *(src + 1))) return(0); - *p = '\0'; + buf[i] = '\0'; switch (*src) { case ('c'): @@ -95,8 +117,10 @@ a2roffsu(const char *src, struct roffsu *dst) return(0); } - if ((dst->scale = atoi(buf)) < 0) + if ((dst->scale = atof(buf)) < 0) dst->scale = 0; dst->unit = unit; + dst->pt = hasd; + return(1); } diff --git a/out.h b/out.h index db956b5b..6737d70e 100644 --- a/out.h +++ b/out.h @@ -1,4 +1,4 @@ -/* $Id: out.h,v 1.3 2009/10/07 12:35:24 kristaps Exp $ */ +/* $Id: out.h,v 1.4 2009/10/09 06:54:11 kristaps Exp $ */ /* * Copyright (c) 2009 Kristaps Dzonsons * @@ -35,17 +35,20 @@ enum roffscale { struct roffsu { enum roffscale unit; - int scale; + double scale; + int pt; }; #define SCALE_INVERT(p) \ do { (p)->scale = -(p)->scale; } while (/*CONSTCOND*/0) #define SCALE_VS_INIT(p, v) \ do { (p)->unit = SCALE_VS; \ - (p)->scale = (v); } while (/*CONSTCOND*/0) + (p)->scale = (v); \ + (p)->pt = 0; } while (/*CONSTCOND*/0) #define SCALE_HS_INIT(p, v) \ do { (p)->unit = SCALE_BU; \ - (p)->scale = (v); } while (/*CONSTCOND*/0) + (p)->scale = (v); \ + (p)->pt = 0; } while (/*CONSTCOND*/0) int a2roffsu(const char *, struct roffsu *); -- cgit v1.2.3-56-ge451