Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 30 Mar 2008 12:35:15 -0600 (MDT)
From:      John Hein <jhein@timing.com>
To:        FreeBSD-gnats-submit@FreeBSD.org
Cc:        gabor@FreeBSD.org
Subject:   ports/122266: update bsdsort to latest OpenBSD source
Message-ID:  <200803301835.m2UIZFbB044842@bugs.timing.com>
Resent-Message-ID: <200803301840.m2UIe15C077256@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         122266
>Category:       ports
>Synopsis:       update bsdsort to latest OpenBSD source
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          update
>Submitter-Id:   current-users
>Arrival-Date:   Sun Mar 30 18:40:01 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator:     John Hein
>Release:        
>Organization:
>Environment:


>Description:

Update ports/textproc/bsdsort to latest OpenBSD code.
Most significantly, this adds -s (stable sort).

>How-To-Repeat:

>Fix:

Below is the diff between the OpenBSD sort code as of 20070612 and now.
If you apply this patch directly to the files in the sort-20070612.tar.gz,
there are conflicts only in the $OpenBSD$ and $Mdocdate$ hunks,
which can be resolved manually.
The code parts in the other hunks all apply cleanly.

Update PORTREVISION to 20080330, re-roll a new distfile with the changes
and update distinfo.

Index: fields.c
===================================================================
RCS file: /base/OpenBSD-CVS/src/usr.bin/sort/fields.c,v
retrieving revision 1.11
retrieving revision 1.13
diff -u -p -r1.11 -r1.13
--- fields.c	14 Feb 2006 14:45:36 -0000	1.11
+++ fields.c	22 Feb 2008 01:24:58 -0000	1.13
@@ -1,4 +1,4 @@
-/*	$OpenBSD: fields.c,v 1.11 2006/02/14 14:45:36 jmc Exp $	*/
+/*	$OpenBSD: fields.c,v 1.13 2008/02/22 01:24:58 millert Exp $	*/
 
 /*-
  * Copyright (c) 1993
@@ -36,7 +36,7 @@
 #if 0
 static char sccsid[] = "@(#)fields.c	8.1 (Berkeley) 6/6/93";
 #else
-static char rcsid[] = "$OpenBSD: fields.c,v 1.11 2006/02/14 14:45:36 jmc Exp $";
+static char rcsid[] = "$OpenBSD: fields.c,v 1.13 2008/02/22 01:24:58 millert Exp $";
 #endif
 #endif /* not lint */
 
@@ -118,7 +118,7 @@ enterkey(RECHEADER *keybuf,	/* pointer t
 		    fieldtable->flags)) == NULL)
 			return (1);
 
-	if (UNIQUE)
+	if (UNIQUE || STABLE)
 		*(keypos-1) = REC_D;
 	keybuf->offset = keypos - keybuf->data;
 	keybuf->length = keybuf->offset + line->size;
@@ -196,7 +196,7 @@ enterfield(u_char *tablepos, u_char *end
  * To avoid confusing the exponent and the mantissa, use a field delimiter
  * if the exponent is exactly 61, 61+252, etc--this is ok, since it's the
  * only time a field delimiter can come in that position.
- * Reverse order is done analagously.
+ * Reverse order is done analogously.
  */
 
 u_char *
@@ -204,8 +204,8 @@ number(u_char *pos, u_char *bufend, u_ch
 {
 	int or_sign, parity = 0;
 	int expincr = 1, exponent = -1;
-	int bite, expsign = 1, sign = 1;
-	u_char lastvalue, *nonzero, *tline, *C_TENS;
+	int bite, expsign = 1, sign = 1, zeroskip = 0;
+	u_char lastvalue, *tline, *C_TENS;
 	u_char *nweights;
 
 	if (Rflag)
@@ -227,7 +227,7 @@ number(u_char *pos, u_char *bufend, u_ch
 	}
 	/* eat initial zeroes */
 	for (; *line == '0' && line < lineend; line++)
-		;
+		zeroskip = 1;
 	/* calculate exponents < 0 */
 	if (*line == DECIMAL) {
 		exponent = 1;
@@ -238,8 +238,10 @@ number(u_char *pos, u_char *bufend, u_ch
 	}
 	/* next character better be a digit */
 	if (*line < '1' || *line > '9' || line >= lineend) {
-		*pos++ = nweights[127];
-		return (pos);
+		if (!zeroskip) {
+			*pos++ = nweights[127];
+			return (pos);
+		}
 	}
 	if (expincr) {
 		for (tline = line-1; *++tline >= '0' && 
@@ -270,8 +272,6 @@ number(u_char *pos, u_char *bufend, u_ch
 						: *line);
 				if (pos == bufend)
 					return (NULL);
-				if (*line != '0' || lastvalue != '0')
-					nonzero = pos;	
 			} else
 				lastvalue = *line;
 			parity ^= 1;
@@ -282,11 +282,10 @@ number(u_char *pos, u_char *bufend, u_ch
 		} else
 			break;
 	}
-	if (parity && lastvalue != '0') {
+	if (parity) {
 		*pos++ = or_sign ? OFF_NTENS[lastvalue] - '0' :
 					OFF_TENS[lastvalue] + '0';
-	} else
-		pos = nonzero;	
+	}
 	if (pos > bufend-1)
 		return (NULL);
 	*pos++ = or_sign ? nweights[254] : nweights[0];
Index: fsort.c
===================================================================
RCS file: /base/OpenBSD-CVS/src/usr.bin/sort/fsort.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -p -r1.18 -r1.19
--- fsort.c	13 Mar 2007 17:33:58 -0000	1.18
+++ fsort.c	21 Aug 2007 20:29:25 -0000	1.19
@@ -1,4 +1,4 @@
-/*	$OpenBSD: fsort.c,v 1.18 2007/03/13 17:33:58 millert Exp $	*/
+/*	$OpenBSD: fsort.c,v 1.19 2007/08/21 20:29:25 millert Exp $	*/
 
 /*-
  * Copyright (c) 1993
@@ -36,7 +36,7 @@
 #if 0
 static char sccsid[] = "@(#)fsort.c	8.1 (Berkeley) 6/6/93";
 #else
-static char rcsid[] = "$OpenBSD: fsort.c,v 1.18 2007/03/13 17:33:58 millert Exp $";
+static char rcsid[] = "$OpenBSD: fsort.c,v 1.19 2007/08/21 20:29:25 millert Exp $";
 #endif
 #endif /* not lint */
 
@@ -173,9 +173,17 @@ fsort(int binno, int depth, union f_hand
 		}
 		get = getnext;
 		if (!ntfiles && !mfct) {	/* everything in memory--pop */
-			if (nelem > 1 && radixsort((const u_char **)keylist,
-			    nelem, weights, REC_D))
-				err(2, NULL);
+			if (nelem > 1) {
+				if (STABLE) {
+					i = sradixsort((const u_char **)keylist,
+					    nelem, weights, REC_D);
+				} else {
+					i = radixsort((const u_char **)keylist,
+					    nelem, weights, REC_D);
+				}
+				if (i)
+					err(2, NULL);
+			}
 			append(keylist, nelem, depth, outfp, putline, ftbl);
 			break;					/* pop */
 		}
Index: init.c
===================================================================
RCS file: /base/OpenBSD-CVS/src/usr.bin/sort/init.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -p -r1.10 -r1.11
--- init.c	2 Apr 2007 08:04:52 -0000	1.10
+++ init.c	1 Sep 2007 18:13:58 -0000	1.11
@@ -1,4 +1,4 @@
-/*	$OpenBSD: init.c,v 1.10 2007/04/02 08:04:52 moritz Exp $	*/
+/*	$OpenBSD: init.c,v 1.11 2007/09/01 18:13:58 kili Exp $	*/
 
 /*-
  * Copyright (c) 1993
@@ -36,7 +36,7 @@
 #if 0
 static char sccsid[] = "@(#)init.c	8.1 (Berkeley) 6/6/93";
 #else
-static char rcsid[] = "$OpenBSD: init.c,v 1.10 2007/04/02 08:04:52 moritz Exp $";
+static char rcsid[] = "$OpenBSD: init.c,v 1.11 2007/09/01 18:13:58 kili Exp $";
 #endif
 #endif /* not lint */
 
@@ -215,11 +215,10 @@ optval(int desc, int tcolflag)
 void
 fixit(int *argc, char **argv)
 {
-	int i, j;
+	int i, j, n;
 	long v, w, x;
 	char *p, *ep;
 	char buf[128], *bufp, *bufend;
-	size_t n;
 
 	bufend = buf + sizeof(buf);
 	for (i = 1; i < *argc; i++) {
Index: msort.c
===================================================================
RCS file: /base/OpenBSD-CVS/src/usr.bin/sort/msort.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -p -r1.20 -r1.21
--- msort.c	13 Mar 2007 17:33:58 -0000	1.20
+++ msort.c	21 Aug 2007 20:29:25 -0000	1.21
@@ -1,4 +1,4 @@
-/*	$OpenBSD: msort.c,v 1.20 2007/03/13 17:33:58 millert Exp $	*/
+/*	$OpenBSD: msort.c,v 1.21 2007/08/21 20:29:25 millert Exp $	*/
 
 /*-
  * Copyright (c) 1993
@@ -36,7 +36,7 @@
 #if 0
 static char sccsid[] = "@(#)msort.c	8.1 (Berkeley) 6/6/93";
 #else
-static char rcsid[] = "$OpenBSD: msort.c,v 1.20 2007/03/13 17:33:58 millert Exp $";
+static char rcsid[] = "$OpenBSD: msort.c,v 1.21 2007/08/21 20:29:25 millert Exp $";
 #endif
 #endif /* not lint */
 
@@ -295,7 +295,7 @@ cmp(RECHEADER *rec1, RECHEADER *rec2)
 	for (cwts = wts; cwts; cwts = (cwts == wts1 ? 0 : wts1)) {
 		pos1 = rec1->data;
 		pos2 = rec2->data;
-		if (!SINGL_FLD && UNIQUE)
+		if (!SINGL_FLD && (UNIQUE || STABLE))
 			end = pos1 + min(rec1->offset, rec2->offset);
 		else
 			end = pos1 + min(rec1->length, rec2->length);
Index: sort.1
===================================================================
RCS file: /base/OpenBSD-CVS/src/usr.bin/sort/sort.1,v
retrieving revision 1.29
retrieving revision 1.31
diff -u -p -r1.29 -r1.31
--- sort.1	31 May 2007 19:20:16 -0000	1.29
+++ sort.1	21 Aug 2007 21:22:37 -0000	1.31
@@ -1,4 +1,4 @@
-.\"	$OpenBSD: sort.1,v 1.29 2007/05/31 19:20:16 jmc Exp $
+.\"	$OpenBSD: sort.1,v 1.31 2007/08/21 21:22:37 millert Exp $
 .\"
 .\" Copyright (c) 1991, 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -32,7 +32,7 @@
 .\"
 .\"     @(#)sort.1	8.1 (Berkeley) 6/6/93
 .\"
-.Dd $Mdocdate$
+.Dd $Mdocdate: August 21 2007 $
 .Dt SORT 1
 .Os
 .Sh NAME
@@ -40,7 +40,7 @@
 .Nd sort or merge text files
 .Sh SYNOPSIS
 .Nm sort
-.Op Fl bcdfHimnruz
+.Op Fl bcdfHimnrsuz
 .Sm off
 .Op Fl k\ \& Ar field1 Op , Ar field2
 .Sm on
@@ -136,6 +136,10 @@ option no longer implies the
 option.)
 .It Fl r
 Reverse the sense of comparisons.
+.It Fl s
+Enable stable sort.
+Uses additional resources (see
+.Xr sradixsort 3 ) .
 .El
 .Pp
 The treatment of field separators can be altered using these options:
Index: sort.c
===================================================================
RCS file: /base/OpenBSD-CVS/src/usr.bin/sort/sort.c,v
retrieving revision 1.34
retrieving revision 1.36
diff -u -p -r1.34 -r1.36
--- sort.c	13 Mar 2007 17:33:58 -0000	1.34
+++ sort.c	22 Aug 2007 06:56:40 -0000	1.36
@@ -1,4 +1,4 @@
-/*	$OpenBSD: sort.c,v 1.34 2007/03/13 17:33:58 millert Exp $	*/
+/*	$OpenBSD: sort.c,v 1.36 2007/08/22 06:56:40 jmc Exp $	*/
 
 /*-
  * Copyright (c) 1993
@@ -42,7 +42,7 @@ static char copyright[] =
 #if 0
 static char sccsid[] = "@(#)sort.c	8.1 (Berkeley) 6/6/93";
 #else
-static char rcsid[] = "$OpenBSD: sort.c,v 1.34 2007/03/13 17:33:58 millert Exp $";
+static char rcsid[] = "$OpenBSD: sort.c,v 1.36 2007/08/22 06:56:40 jmc Exp $";
 #endif
 #endif /* not lint */
 
@@ -80,7 +80,7 @@ u_char ascii[NBINS], Rascii[NBINS], RFta
  * masks of ignored characters.  Alltable is 256 ones
  */
 u_char dtable[NBINS], itable[NBINS], alltable[NBINS];
-int SINGL_FLD = 0, SEP_FLAG = 0, UNIQUE = 0;
+int SINGL_FLD = 0, SEP_FLAG = 0, UNIQUE = 0, STABLE = 0;
 struct coldesc *clist;
 int ncols = 0;
 int ND = 10;			/* limit on number of -k options. */
@@ -125,7 +125,7 @@ main(int argc, char *argv[])
 	fixit(&argc, argv);
 	if (!issetugid() && (outfile = getenv("TMPDIR")))
 		tmpdir = outfile;
-	while ((ch = getopt(argc, argv, "bcdfik:mHno:rR:t:T:uy:z")) != -1) {
+	while ((ch = getopt(argc, argv, "bcdfik:mHno:rR:t:T:uy:zs")) != -1) {
 		switch (ch) {
 		case 'b': fldtab->flags |= BI | BT;
 			break;
@@ -192,6 +192,9 @@ main(int argc, char *argv[])
 			d_mask['\n'] = d_mask[' '];
 			d_mask[REC_D] = REC_D_F;
 			break;
+		case 's':
+			STABLE = 1;
+			break;
 		case '?':
 		default:
 			usage(NULL);
@@ -340,7 +343,7 @@ usage(char *msg)
 
 	if (msg != NULL)
 		warnx("%s", msg);
-	(void)fprintf(stderr, "usage: %s [-bcdfHimnruz] "
+	(void)fprintf(stderr, "usage: %s [-bcdfHimnrsuz] "
 	    "[-k field1[,field2]] [-o output] [-R char]\n"
 	    "\t[-T dir] [-t char] [file ...]\n", __progname);
 	exit(2);
Index: sort.h
===================================================================
RCS file: /base/OpenBSD-CVS/src/usr.bin/sort/sort.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -p -r1.6 -r1.7
--- sort.h	3 Jun 2003 02:56:16 -0000	1.6
+++ sort.h	21 Aug 2007 20:29:25 -0000	1.7
@@ -1,4 +1,4 @@
-/*	$OpenBSD: sort.h,v 1.6 2003/06/03 02:56:16 millert Exp $	*/
+/*	$OpenBSD: sort.h,v 1.7 2007/08/21 20:29:25 millert Exp $	*/
 
 /*-
  * Copyright (c) 1993
@@ -133,7 +133,7 @@ extern int PANIC;	/* maximum depth of fs
 extern u_char ascii[NBINS], Rascii[NBINS], Ftable[NBINS], RFtable[NBINS];
 extern u_char alltable[NBINS], dtable[NBINS], itable[NBINS];
 extern u_char d_mask[NBINS];
-extern int SINGL_FLD, SEP_FLAG, UNIQUE;
+extern int SINGL_FLD, SEP_FLAG, UNIQUE, STABLE;
 extern int REC_D;
 extern char *tmpdir;
 extern int ND;		/* limit on number of -k options. */
Index: tmp.c
===================================================================
RCS file: /base/OpenBSD-CVS/src/usr.bin/sort/tmp.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -p -r1.7 -r1.8
--- tmp.c	6 Dec 2006 05:03:29 -0000	1.7
+++ tmp.c	19 Mar 2008 19:25:49 -0000	1.8
@@ -1,4 +1,4 @@
-/*	$OpenBSD: tmp.c,v 1.7 2006/12/06 05:03:29 ray Exp $	*/
+/*	$OpenBSD: tmp.c,v 1.8 2008/03/19 19:25:49 kili Exp $	*/
 
 /*-
  * Copyright (c) 1993
@@ -36,7 +36,7 @@
 #if 0
 static char sccsid[] = "@(#)tmp.c	8.1 (Berkeley) 6/6/93";
 #else
-static char rcsid[] = "$OpenBSD: tmp.c,v 1.7 2006/12/06 05:03:29 ray Exp $";
+static char rcsid[] = "$OpenBSD: tmp.c,v 1.8 2008/03/19 19:25:49 kili Exp $";
 #endif
 #endif /* not lint */
 
@@ -62,12 +62,11 @@ ftmp(void)
 	sigset_t set, oset;
 	FILE *fp;
 	int fd;
-	char pathb[PATH_MAX], *path;
+	char path[PATH_MAX];
 
-	path = pathb;
 	if (tmpdir[0] == '\0')
 		errx(2, "invalid temporary directory: \"\"");
-	(void)snprintf(path, sizeof(pathb), "%s%s%s", tmpdir,
+	(void)snprintf(path, sizeof(path), "%s%s%s", tmpdir,
 		       (tmpdir[strlen(tmpdir)-1] != '/') ? "/" : "", _NAME_TMP);
 
 	sigfillset(&set);
>Release-Note:
>Audit-Trail:
>Unformatted:



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