Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 1 Jun 2002 23:28:48 +1000 (EST)
From:      Bruce Evans <bde@zeta.org.au>
To:        Dag-Erling Smorgrav <des@ofug.org>
Cc:        Dima Dorfman <dima@trit.org>, <audit@FreeBSD.ORG>
Subject:   Re: %j for printf(9)
Message-ID:  <20020601232049.E2458-100000@gamplex.bde.org>
In-Reply-To: <xzpptzc8dbp.fsf@flood.ping.uio.no>

next in thread | previous in thread | raw e-mail | index | archive | help
On 31 May 2002, Dag-Erling Smorgrav wrote:

> Bruce Evans <bde@zeta.org.au> writes:
> > I don't remember all the context for this.  Is everything restructured so
> > that all the va_arg()'s for fetching integers are in the above patch?
>
> Yes.
>
> > If so, consider the following further restructurings:
> >
> > - merge fetch_nosign with nosign (rename it to something like
> >   handle_unsigned) and use it handle all the unsigned cases that are now
> >   handled by fetch_number.
> > - rename fetch_number to handle_signed and use it for only the signed cases
> >   (%d and %+z).
>
> These two would actually increase code duplication.

It came out 1 line shorter with less duplication for me.  Here is a patch
relative to the version in your next mail.  I didn't rename fetch* to
handle*, and I may have broken something moved the initializations of
`sign' around too much.  I reordered some initializations (especially for
%p) so that the order is almost (?) always (base, ..., sign, num).
%%%
--- subr_prf.c~~	Sat Jun  1 22:59:01 2002
+++ subr_prf.c	Sat Jun  1 23:21:44 2002
@@ -596,7 +596,7 @@
 			break;
 		case 'd':
-			sign = 1;
 			base = 10;
-			goto fetch_number;
+			sign = 1;
+			goto fetch_sign;
 		case 'j':
 			jflag = 1;
@@ -613,8 +613,9 @@
 			goto fetch_nosign;
 		case 'p':
-			num = (uintptr_t)va_arg(ap, void *);
 			base = 16;
 			sharpflag = (width == 0);
-			goto nosign;
+			sign = 0;
+			num = (uintptr_t)va_arg(ap, void *);
+			goto number;
 		case 'q':
 			qflag = 1;
@@ -623,5 +624,7 @@
 		case 'r':
 			base = radix;
-			goto fetch_number;
+			if (sign)
+				goto fetch_sign;
+			goto fetch_nosign;
 		case 's':
 			p = va_arg(ap, char *);
@@ -654,6 +657,8 @@
 		case 'z':
 			base = 16;
-			goto fetch_number;
+			if (sign)
+				goto fetch_sign;
 fetch_nosign:
+			sign = 0;
 			if (jflag)
 				num = va_arg(ap, uintmax_t);
@@ -664,20 +669,14 @@
 			else
 				num = va_arg(ap, u_int);
-			goto nosign;
-fetch_number:
+			goto number;
+fetch_sign:
 			if (jflag)
 				num = va_arg(ap, intmax_t);
 			else if (qflag)
-				num = sign ? va_arg(ap, quad_t) :
-				    va_arg(ap, u_quad_t);
+				num = va_arg(ap, quad_t);
 			else if (lflag)
-				num = sign ? va_arg(ap, long) :
-				    va_arg(ap, u_long);
+				num = va_arg(ap, long);
 			else
-				num = sign ? va_arg(ap, int) :
-				    va_arg(ap, u_int);
-			goto number;
-nosign:
-			sign = 0;
+				num = va_arg(ap, int);
 number:
 			if (sign && (intmax_t)num < 0) {
%%%


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-audit" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020601232049.E2458-100000>