From jeff@jeff.tk  Mon Jan 27 20:35:37 2003
Return-Path: <jeff@jeff.tk>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id D3C5F37B497
	for <FreeBSD-gnats-submit@freebsd.org>; Mon, 27 Jan 2003 20:35:34 -0800 (PST)
Received: from jeff.tk (lsanca1-ar8-4-60-074-043.lsanca1.dsl-verizon.net [4.60.74.43])
	by mx1.FreeBSD.org (Postfix) with SMTP id BB39243F3F
	for <FreeBSD-gnats-submit@freebsd.org>; Mon, 27 Jan 2003 20:35:33 -0800 (PST)
	(envelope-from jeff@jeff.tk)
Received: (qmail 28327 invoked by uid 1000); 28 Jan 2003 04:36:31 -0000
Message-Id: <20030128043631.28326.qmail@jeff.tk>
Date: 28 Jan 2003 04:36:31 -0000
From: Jeff Connelly <j@jeff.tk>
Reply-To: Jeff Connelly <freebsd@xyzzy.cjb.net>
To: FreeBSD-gnats-submit@freebsd.org
Cc: freebsd@xyzzy.cjb.net
Subject: [PATCH] factor(6)ing of negative numbers
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         47576
>Category:       bin
>Synopsis:       [patch] factor(6)ing of negative numbers
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    edwin
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Mon Jan 27 20:40:07 PST 2003
>Closed-Date:    
>Last-Modified:  Mon Dec 29 17:37:00 UTC 2008
>Originator:     Jeff Connelly <freebsd@xyzzy.cjb.net>
>Release:        FreeBSD 5.0-RELEASE i386
>Organization:
>Environment:
System: FreeBSD aptlap 5.0-RELEASE FreeBSD 5.0-RELEASE #5: Sun Jan 26 05:48:37 GMT 2003 root@aptlap:/usr/obj/usr/src/sys/APTLAP i386

>Description:
	factor(6) cannot factor negative numbers.
>How-To-Repeat:
	# factor -- -4
>Fix:
	Patch given first factors -1 out of negatives, then factors the
	absolute value as usual. A patch has also been provided for the
	accompanying documentation.

--- factor.c.patch begins here ---
--- factor.c.orig	Wed Oct  9 19:55:04 2002
+++ factor.c	Mon Jan 27 07:29:30 2003
@@ -113,6 +113,7 @@
 
 static BN_CTX	*ctx;			/* just use a global context */
 static int	hflag;
+static int	negflag;
 
 int
 main(int argc, char *argv[])
@@ -149,8 +150,7 @@
 			for (p = buf; isblank(*p); ++p);
 			if (*p == '\n' || *p == '\0')
 				continue;
-			if (*p == '-')
-				errx(1, "negative numbers aren't permitted.");
+			negflag = *p == '-';
 			if (BN_dec2bn(&val, buf) == 0 &&
 			    BN_hex2bn(&val, buf) == 0)
 				errx(1, "%s: illegal numeric format.", buf);
@@ -159,8 +159,7 @@
 	/* Factor the arguments. */
 	else
 		for (; *argv != NULL; ++argv) {
-			if (argv[0][0] == '-')
-				errx(1, "negative numbers aren't permitted.");
+			negflag = argv[0][0] == '-';
 			if (BN_dec2bn(&val, argv[0]) == 0 &&
 			    BN_hex2bn(&val, argv[0]) == 0)
 				errx(1, "%s: illegal numeric format.", argv[0]);
@@ -187,9 +186,14 @@
 	if (BN_is_zero(val))	/* Historical practice; 0 just exits. */
 		exit(0);
 	if (BN_is_one(val)) {
-		printf("1: 1\n");
+		if (negflag)
+			printf("1: -1\n");
+		else
+			printf("1: 1\n");
 		return;
 	}
+	if (val < 0)
+		printf("-1 ");
 
 	/* Factor value. */
 
@@ -199,6 +203,8 @@
 	} else
 		BN_print_dec_fp(stdout, val);
 	putchar(':');
+	if (negflag)
+		fputs(" -1", stdout);
 	for (fact = &prime[0]; !BN_is_one(val); ++fact) {
 		/* Look for the smallest factor. */
 		do {
--- factor.c.patch ends here ---

--- factor.6.patch begins here ---
--- factor.6.orig	Fri Nov 29 16:21:33 2002
+++ factor.6	Mon Jan 27 06:35:26 2003
@@ -110,9 +110,10 @@
 The
 .Ar start
 value is terminated by a non-digit character (such as a newline).
+Negative numbers may be specified on the command line if the "--" pseudoflag
+preceeds the negative argument.
 .Sh DIAGNOSTICS
 .Bl -diag
-.It "negative numbers aren't permitted"
 .It "illegal numeric format"
 .It "start value must be less than stop value"
 .It "Result too large"
--- factor.6.patch ends here ---


>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->edwin 
Responsible-Changed-By: edwin 
Responsible-Changed-When: Wed Aug 13 05:36:01 UTC 2008 
Responsible-Changed-Why:  
Handle with mentor. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=47576 

From: Edwin Groothuis <edwin@freebsd.org>
To: bde@freebsd.org
Cc:  
Subject: bin/47576 - b64decode issues
Date: Mon, 18 Aug 2008 15:29:30 +1000

 --huq684BweRXVnRxX
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 
 On your request I have replaced the getline() loop with a with an
 fgetc() loop which gets four non-whitespace characters and shoves
 them into b64_pton(). Works like a charm. See patch.
 
 Together with it, I have updated the regression tests for uudecode
 to incorperate the tests. Yes, the original will fail with the new
 test but the new one will work with both (more or less a requirement :-)
 
 See patches. Okay to commit?
 
 -- 
 Edwin Groothuis
 edwin@freebsd.org
 http://www.mavetju.org
 
 --huq684BweRXVnRxX
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: attachment; filename=a
 
 --- uudecode.c.1	2008-08-06 16:00:48.000000000 +1000
 +++ uudecode.c	2008-08-14 17:25:07.000000000 +1000
 @@ -57,6 +57,7 @@
  
  #include <netinet/in.h>
  
 +#include <ctype.h>
  #include <err.h>
  #include <errno.h>
  #include <fcntl.h>
 @@ -413,21 +414,28 @@
  static int
  base64_decode(void)
  {
 -	int n;
 -	char inbuf[MAXPATHLEN + 1];
 -	unsigned char outbuf[MAXPATHLEN * 4];
 -
 -	for (;;) {
 -		switch (getline(inbuf, sizeof(inbuf))) {
 -		case 0:
 -			return (0);
 -		case 1:
 +#define BUFSIZE	5
 +	int n, count;
 +	char inbuf[BUFSIZE];
 +	char c;
 +	unsigned char outbuf[BUFSIZE];
 +
 +	inbuf[0] = '\0';
 +	inbuf[4] = '\0';
 +	count = 0;
 +	while (!feof(infp)) {
 +		if ((c = fgetc(infp)) == EOF)
  			return (1);
 +		if (isspace(c))
 +			continue;
 +		inbuf[count++] = c;
 +		if (count == 4) {
 +			count = 0;
 +			n = b64_pton(inbuf, outbuf, sizeof(outbuf));
 +			if (n < 0)
 +				break;
 +			fwrite(outbuf, 1, n, outfp);
  		}
 -		n = b64_pton(inbuf, outbuf, sizeof(outbuf));
 -		if (n < 0)
 -			break;
 -		fwrite(outbuf, 1, n, outfp);
  	}
  	return (checkend(inbuf, "====", "error decoding base64 input stream"));
  }
 
 --huq684BweRXVnRxX
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: attachment; filename=b
 
 
 Property changes on: regress.base64.1.in
 ___________________________________________________________________
 Added: svn:mergeinfo
 
 Index: regress.base64.in (deleted)
 ===================================================================
 Index: regress.base64.2.in
 ===================================================================
 --- regress.base64.2.in	(revision 0)
 +++ regress.base64.2.in	(revision 0)
 @@ -0,0 +1,115 @@
 +begin-base64 644 regress.out
 +d B745nc7bs6q4W24dCU/WprFX3UkvTwO6wlHiV+L4U +QEH1p/P9WjgFZ0MSGI2lE
 +TC IH+3j4oqf3JJA/uvQ2WnWzCjFXG17cZpBq8UQGM h /e8QLyahMOTrrHP9Cf2ZE9
 +Wty bokTG8E2Ft0QrfiTsIpcUPMd7VDRvCQGLD+t6 bqJ kPJKaGmXXCwLwLz2WpAOX
 +RW+d 4UhnCnB0aBs7IByd6beMYwQxIcM4XvyAnG1 z3XK9 gCwvIwzI6wYYzXCIAo/K
 +pP90o NA6ijFYYNK3s/uttytzC5QfKn6gaVerwY cb1QQHq yrxoryOrjwgwgazSfwL
 +hDK1fL ejnpTXL1Uh2j9E+pM0WSftA0wX1tdyK xy7kUarWz EACH8htTSd3NDamR/2
 +T66xNHP YZhW31cjeNTX0czIfpRWBbBQI3rc5 yhWZlGA0j8X 8zQR4puaGpQ6QNnbB
 +QkSU4Ak+ pveRT8JuFbJVQI6WHemB7H9LV5C SYVCoZ2iOFA/Z 8PSM473XXjqBk/M1
 +Zz4irDw8V 1tBp519qNgXFt52fdrkbzJCa+ 71pfAuP2LsytpAd 2LUJwhgiV7uj6cx
 +4DjEfdd/QY dcJGDm435wfsniPoPnrghEJ dqfgWIvaFNpuoQ9By rznWacs50AQFxy
 +ZpfAaLJnGNi PehTOosTT6dPOKp8x2ms6 mdkr2neZ0I0leoNHxCB KvgUxC0uFieo6
 +GLpussFEB8Qe Csy1mjnXDI1qsC2Sp34 PZTvR5apH29FB1eIeAPFZ MkFxO2TTs0Y4
 +q3yKDcPGHaAdP y8J64UpyBlO3rbcLy qEbKcuSHHd69iT/5mD4arby YHMY6S7S7QP
 +DHpH1x8Woo5xMo 0MVkmBGbKc5Sy4J 37T8xjj4h0pcKvEdCSanJ2A1E 2jHzpfbe8u
 +/NSxpB49+JGYGJ2 nsgpsKzwTXabg KDZPydqcAIpNXnAdsQBNskmzBYb 8959xCzws
 +ybQ7+0g4a0DYyLDc nW2NH/OCYHv kOgyM72FQJAXGg61GnZZiAjSlrqsP X2NVUtXi
 +vRrueFSG5rYnYJvO2 OfhwgEfxT Y8b7x8AFQntBvaKqG5rWC+a2d+4Xj0B 2ODy+/M
 +5Hppj0dNwpLPKHa8UH 6IDd+m0 Aql5u5oCbh+WIDovGtN2BpkyCq00M/kKE rTbTT+
 +qfuWSDow0ZjLeFdSErU tdi1t KhDh5oy5Ev+ShLywKPm4/NfJ3CLhbZSvhOW Wxwzf
 +KEgMCnHNd8uc3JIDNM7c 3Dm 5w0QrD0AObOUSBF8iouNBjMvdUviIBVFPeVkZ 3xYs
 +TciSRJm/fB5QNhrcYRMbZ J 5iOVHuuOxFw+zPoEIjVBPO1wXZgsSwgFED20bKL cOv
 +SnWGM3IyNZVKqdo3a4oh4H 4Lv/y6rMrtSTr7kQJlwEvU6WiyvtQob/fMdHWIbc/ W
 +RPR47l6JDz4V3AUqPcF3Jy6RaNUKRvFi+7cOWYBKbNFRmE/jA6dyUuVkCYIMDuhu
 + I  7   i    Q     L       0        u         4
 + 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
 +8
 +O
 +K
 +l
 +L
 +H
 +w
 +x
 +W
 +b
 +E
 +7
 +x
 +E
 +7
 +t
 +e
 +D
 +c
 +A
 +Z
 +w
 +=
 +=
 +=
 +=
 +=
 +=
 
 Property changes on: regress.base64.2.in
 ___________________________________________________________________
 Added: svn:mime-type
    + text/plain
 Added: svn:keywords
    + FreeBSD=%H
 Added: svn:eol-style
    + native
 
 Index: regress.sh
 ===================================================================
 --- regress.sh	(revision 181277)
 +++ regress.sh	(working copy)
 @@ -1,10 +1,11 @@
  # $FreeBSD$
  
 -echo 1..2
 +echo 1..3
  
  REGRESSION_START($1)
  
  REGRESSION_TEST_ONE(`uudecode -p < regress.traditional.in', `traditional')
 -REGRESSION_TEST_ONE(`uudecode -p < regress.base64.in', `base64')
 +REGRESSION_TEST_ONE(`uudecode -p < regress.base64.1.in', `base64')
 +REGRESSION_TEST_ONE(`uudecode -p < regress.base64.2.in', `base64')
  
  REGRESSION_END()
 
 --huq684BweRXVnRxX--
>Unformatted:
