PERFORCE change 174344 for review

Gabor Kovesdan gabor at FreeBSD.org
Fri Feb 5 06:00:39 UTC 2010


http://p4web.freebsd.org/chv.cgi?CH=174344

Change 174344 by gabor at gabor_aspire on 2010/02/05 05:59:38

	- Add support for various sorting algoritms by command line options
	- Add support for -s
	- Remove some leftovers

Affected files ...

.. //depot/projects/soc2008/gabor_textproc/newsort/sort.c#6 edit
.. //depot/projects/soc2008/gabor_textproc/newsort/sort.h#4 edit

Differences ...

==== //depot/projects/soc2008/gabor_textproc/newsort/sort.c#6 (text+ko) ====

@@ -61,6 +61,7 @@
 extern char	*__progname;
 
 int		 count, listlen = 0;
+int		 sort_method = SORT_QSORT;
 wchar_t		**list;
 wchar_t		 field_sep = L' ';
 unsigned long	 sfield, lfield;
@@ -76,10 +77,17 @@
 bool		 nflag;
 bool		 mflag;
 bool		 rflag;
+bool		 sflag;
 bool		 uflag;
 bool		 zflag;
 
-#define	OPTIONS	"cbdfghik:Mmno:rS:t:T:uVz"
+enum {
+	QSORT_OPT = CHAR_MAX + 1,
+	MERGESORT_OPT,
+	HEAPSORT_OPT
+};
+
+#define	OPTIONS	"cbdfghik:Mmno:rst:uVz"
 
 struct option long_options[]=
 {
@@ -96,12 +104,14 @@
 	{"merge",			no_argument,		NULL,	'm'},
 	{"output",			required_argument,	NULL,	'o'},
 	{"reverse",			no_argument,		NULL,	'r'},
-	{"buffer-size",			required_argument,	NULL,	'S'},
+	{"stable",			no_argument,		NULL,	's'},
 	{"field-separator",		required_argument,	NULL,	't'},
-//	{"temporary-directory",		required_argument,	NULL,	'T'},
 	{"unique",			no_argument,		NULL,	'u'},
 	{"version",			no_argument,		NULL,	'V'},
 	{"zero-terminated",		no_argument,		NULL,	'z'},
+	{"qsort",			no_argument,		NULL,	QSORT_OPT},
+	{"mergesort",			no_argument,		NULL,	MERGESORT_OPT},
+	{"heapsort",			no_argument,		NULL,	HEAPSORT_OPT},
 	{NULL,				no_argument,		NULL,	0}
 };
 
@@ -114,7 +124,7 @@
 
 int
 main(int argc, char *argv[]) {
-	char		 c;
+	int		 c;
 	char		*sptr;
 	char		*outfile;
 
@@ -196,10 +206,8 @@
 		case 'r':
 			rflag = true;
 			break;
-		case 'S':
-			bufsiz = strtoull(optarg, (char **)NULL, 10);
-				if ((errno == ERANGE) && (bufsiz == ULLONG_MAX))
-					err(2, NULL);
+		case 's':
+			sflag = true;
 			break;
 		case 't':
 			if (strlen(optarg) > 1)
@@ -224,6 +232,15 @@
 		case 'z':
 			zflag = true;
 			break;
+		case QSORT_OPT:
+			sort_method = SORT_QSORT;
+			break;
+		case MERGESORT_OPT:
+			sort_method = SORT_MERGESORT;
+			break;
+		case HEAPSORT_OPT:
+			sort_method = SORT_HEAPSORT;
+			break;
 		case 'h':
 		default:
 			usage();
@@ -249,6 +266,9 @@
 	if (mflag && (argc != 2))
 		errx(1, getstr(2), 'c');
 
+	if (sflag && (sort_method != SORT_MERGESORT))
+		errx(2, "stable sort is only available with merge sort");
+
 #ifndef WITHOUT_NLS
 	catclose(catalog);
 #endif
@@ -269,7 +289,19 @@
 			++argv;
 		}
 
-		qsort(list, count, sizeof(wchar_t *), coll);
+		switch (sort_method) {
+		case SORT_QSORT:
+			qsort(list, count, sizeof(wchar_t *), coll);
+			break;
+		case SORT_MERGESORT:
+			if (mergesort(list, count, sizeof(wchar_t *), coll) == -1)
+				err(2, NULL);
+			break;
+		case SORT_HEAPSORT:
+			if (heapsort(list, count, sizeof(wchar_t *), coll) == -1)
+				err(2, NULL);
+			break;
+		}
 
 		for (int i = 0; i < count; i++)
 			printf("%ls\n", list[i]);

==== //depot/projects/soc2008/gabor_textproc/newsort/sort.h#4 (text+ko) ====

@@ -29,10 +29,9 @@
 #include <wchar.h>
 
 #define		VERSION	"5.3.0-FreeBSD"
-#define		OPT_BUFSIZE	(64 * 1024)
-#define		MAX_BUFSIZE	(512 * 1024)
-#define		OPT_SLICES	8
-#define		TMPPAT	"/sort.XXXXXXXX"
+#define		SORT_QSORT	0
+#define		SORT_MERGESORT	1
+#define		SORT_HEAPSORT	2
 
 #ifdef WITHOUT_NLS
 #define getstr(n)	 nlsstr[n]
@@ -49,11 +48,9 @@
  * sort.c
  */
 extern bool	cflag, bflag, dflag, fflag, gflag, iflag, kflag, Mflag, mflag,
-		nflag, rflag, uflag, zflag;
-extern int	 bufcnt, count, listlen, tempno;
+		nflag, rflag, sflag, uflag, zflag;
+extern int	count, listlen;
 extern wchar_t	 field_sep, **list;
-extern char	**tempfiles, *tmpdir;
-extern unsigned long long bufsiz;
 extern unsigned long lfield, sfield;
 
 /*
@@ -75,9 +72,3 @@
  */
 void *		 sort_malloc(size_t);
 void *		 sort_realloc(void *, size_t);
-
-/*
- * msort.c
- */
-wchar_t		**merge(wchar_t **, int, wchar_t **, int);
-wchar_t		**merge_sort(wchar_t **, int);


More information about the p4-projects mailing list