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