Module Name: src Committed By: dsl Date: Thu Aug 20 06:36:26 UTC 2009
Modified Files: src/usr.bin/sort: append.c fields.c fsort.c fsort.h msort.c sort.c sort.h Log Message: Delete more unwanted/unused cruft. Simplify logic for reading input records. Do a merge sort whenever we have 16 partial sorted blocks. The patient is breathing, but still carrying a lot of extra weight. To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/usr.bin/sort/append.c cvs rdiff -u -r1.23 -r1.24 src/usr.bin/sort/fields.c src/usr.bin/sort/sort.h cvs rdiff -u -r1.37 -r1.38 src/usr.bin/sort/fsort.c cvs rdiff -u -r1.14 -r1.15 src/usr.bin/sort/fsort.h cvs rdiff -u -r1.21 -r1.22 src/usr.bin/sort/msort.c cvs rdiff -u -r1.50 -r1.51 src/usr.bin/sort/sort.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/sort/append.c diff -u src/usr.bin/sort/append.c:1.18 src/usr.bin/sort/append.c:1.19 --- src/usr.bin/sort/append.c:1.18 Tue Aug 18 18:00:28 2009 +++ src/usr.bin/sort/append.c Thu Aug 20 06:36:25 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: append.c,v 1.18 2009/08/18 18:00:28 dsl Exp $ */ +/* $NetBSD: append.c,v 1.19 2009/08/20 06:36:25 dsl Exp $ */ /*- * Copyright (c) 2000-2003 The NetBSD Foundation, Inc. @@ -64,7 +64,7 @@ #include "sort.h" #ifndef lint -__RCSID("$NetBSD: append.c,v 1.18 2009/08/18 18:00:28 dsl Exp $"); +__RCSID("$NetBSD: append.c,v 1.19 2009/08/20 06:36:25 dsl Exp $"); __SCCSID("@(#)append.c 8.1 (Berkeley) 6/6/93"); #endif /* not lint */ @@ -73,13 +73,8 @@ #define OUTPUT { \ if ((n = cpos - ppos) > 1) { \ - for (; ppos < cpos; ++ppos) \ - *ppos -= depth; \ ppos -= n; \ - if (stable_sort) \ - sradixsort(ppos, n, wts1, REC_D); \ - else \ - radixsort(ppos, n, wts1, REC_D); \ + radix_sort(ppos, n, wts1, REC_D); \ for (; ppos < cpos; ppos++) { \ prec = (const RECHEADER *) (*ppos - REC_DATA_OFFSET);\ put(prec, fp); \ @@ -91,35 +86,36 @@ * copy sorted lines to output; check for uniqueness */ void -append(const u_char **keylist, int nelem, int depth, FILE *fp, put_func_t put, +append(const u_char **keylist, int nelem, FILE *fp, put_func_t put, struct field *ftbl) { u_char *wts, *wts1; int n; - int hdr_off; const u_char **cpos, **ppos, **lastkey; const u_char *cend, *pend, *start; const struct recheader *crec, *prec; if (*keylist == '\0' && UNIQUE) return; + wts1 = wts = ftbl[0].weights; - if ((!UNIQUE) && SINGL_FLD) { - if ((ftbl[0].flags & F) && (ftbl[0].flags & R)) + if ((!UNIQUE) && SINGL_FLD && ftbl[0].flags & F) { + /* Folding case */ + if (ftbl[0].flags & R) wts1 = Rascii; - else if (ftbl[0].flags & F) + else wts1 = ascii; } + lastkey = keylist + nelem; - hdr_off = REC_DATA_OFFSET + depth; if (SINGL_FLD && (UNIQUE || wts1 != wts)) { ppos = keylist; - prec = (const RECHEADER *) (*ppos - hdr_off); + prec = (const RECHEADER *) (*ppos - REC_DATA_OFFSET); if (UNIQUE) put(prec, fp); for (cpos = &keylist[1]; cpos < lastkey; cpos++) { - crec = (const RECHEADER *) (*cpos - hdr_off); - if (crec->length == prec->length) { + crec = (const RECHEADER *) (*cpos - REC_DATA_OFFSET); + if (crec->length == prec->length) { /* * Set pend and cend so that trailing NUL and * record separator is ignored. @@ -151,10 +147,10 @@ if (!UNIQUE) { OUTPUT; } } else if (UNIQUE) { ppos = keylist; - prec = (const RECHEADER *) (*ppos - hdr_off); + prec = (const RECHEADER *) (*ppos - REC_DATA_OFFSET); put(prec, fp); for (cpos = &keylist[1]; cpos < lastkey; cpos++) { - crec = (const RECHEADER *) (*cpos - hdr_off); + crec = (const RECHEADER *) (*cpos - REC_DATA_OFFSET); if (crec->offset == prec->offset) { /* * Set pend and cend so that trailing NUL and @@ -179,7 +175,7 @@ } } } else for (cpos = keylist; cpos < lastkey; cpos++) { - crec = (const RECHEADER *) (*cpos - hdr_off); + crec = (const RECHEADER *) (*cpos - REC_DATA_OFFSET); put(crec, fp); } } Index: src/usr.bin/sort/fields.c diff -u src/usr.bin/sort/fields.c:1.23 src/usr.bin/sort/fields.c:1.24 --- src/usr.bin/sort/fields.c:1.23 Sat Aug 15 21:26:32 2009 +++ src/usr.bin/sort/fields.c Thu Aug 20 06:36:25 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: fields.c,v 1.23 2009/08/15 21:26:32 dsl Exp $ */ +/* $NetBSD: fields.c,v 1.24 2009/08/20 06:36:25 dsl Exp $ */ /*- * Copyright (c) 2000-2003 The NetBSD Foundation, Inc. @@ -66,7 +66,7 @@ #include "sort.h" #ifndef lint -__RCSID("$NetBSD: fields.c,v 1.23 2009/08/15 21:26:32 dsl Exp $"); +__RCSID("$NetBSD: fields.c,v 1.24 2009/08/20 06:36:25 dsl Exp $"); __SCCSID("@(#)fields.c 8.1 (Berkeley) 6/6/93"); #endif /* not lint */ @@ -97,7 +97,8 @@ * followed by the original line. */ length_t -enterkey(RECHEADER *keybuf, const u_char *keybuf_end, u_char *line_data, size_t line_size, struct field fieldtable[]) +enterkey(RECHEADER *keybuf, const u_char *keybuf_end, u_char *line_data, + size_t line_size, struct field fieldtable[]) /* keybuf: pointer to start of key */ { int i; @@ -169,7 +170,8 @@ * constructs a field (as defined by -k) within a key */ static u_char * -enterfield(u_char *tablepos, const u_char *endkey, struct field *cur_fld, int gflags) +enterfield(u_char *tablepos, const u_char *endkey, struct field *cur_fld, + int gflags) { u_char *start, *end, *lineend, *mask, *lweight; struct column icol, tcol; Index: src/usr.bin/sort/sort.h diff -u src/usr.bin/sort/sort.h:1.23 src/usr.bin/sort/sort.h:1.24 --- src/usr.bin/sort/sort.h:1.23 Tue Aug 18 18:00:28 2009 +++ src/usr.bin/sort/sort.h Thu Aug 20 06:36:25 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: sort.h,v 1.23 2009/08/18 18:00:28 dsl Exp $ */ +/* $NetBSD: sort.h,v 1.24 2009/08/20 06:36:25 dsl Exp $ */ /*- * Copyright (c) 2000-2003 The NetBSD Foundation, Inc. @@ -171,17 +171,16 @@ extern struct coldesc *clist; extern int ncols; -void append(const u_char **, int, int, FILE *, +void append(const u_char **, int, FILE *, void (*)(const RECHEADER *, FILE *), struct field *); void concat(FILE *, FILE *); length_t enterkey(RECHEADER *, const u_char *, u_char *, size_t, struct field *); void fixit(int *, char **); void fldreset(struct field *); FILE *ftmp(void); -void fmerge(int, int, struct filelist *, int, +void fmerge(int, struct filelist *, int, get_func_t, FILE *, put_func_t, struct field *); -void fsort(int, int, int, struct filelist *, int, FILE *, - struct field *); +void fsort(struct filelist *, int, FILE *, struct field *); int geteasy(int, int, struct filelist *, int, RECHEADER *, u_char *, struct field *); int makekey(int, int, struct filelist *, @@ -189,7 +188,6 @@ int makeline(int, int, struct filelist *, int, RECHEADER *, u_char *, struct field *); void num_init(void); -void onepass(const u_char **, int, long, long *, u_char *, FILE *); int optval(int, int); void order(struct filelist *, get_func_t, struct field *); void putline(const RECHEADER *, FILE *); Index: src/usr.bin/sort/fsort.c diff -u src/usr.bin/sort/fsort.c:1.37 src/usr.bin/sort/fsort.c:1.38 --- src/usr.bin/sort/fsort.c:1.37 Tue Aug 18 18:00:28 2009 +++ src/usr.bin/sort/fsort.c Thu Aug 20 06:36:25 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: fsort.c,v 1.37 2009/08/18 18:00:28 dsl Exp $ */ +/* $NetBSD: fsort.c,v 1.38 2009/08/20 06:36:25 dsl Exp $ */ /*- * Copyright (c) 2000-2003 The NetBSD Foundation, Inc. @@ -72,7 +72,7 @@ #include "fsort.h" #ifndef lint -__RCSID("$NetBSD: fsort.c,v 1.37 2009/08/18 18:00:28 dsl Exp $"); +__RCSID("$NetBSD: fsort.c,v 1.38 2009/08/20 06:36:25 dsl Exp $"); __SCCSID("@(#)fsort.c 8.1 (Berkeley) 6/6/93"); #endif /* not lint */ @@ -82,148 +82,112 @@ static const u_char **keylist = 0; u_char *buffer = 0; size_t bufsize = DEFBUFSIZE; -#define FSORTMAX 4 -int PANIC = FSORTMAX; struct tempfile fstack[MAXFCT]; -#define MSTART (MAXFCT - MERGE_FNUM) -#define CHECKFSTACK(n) \ - if (n >= MAXFCT) \ - errx(2, "fstack: too many temporary files; use -H or sort in pieces") - + #define SALIGN(n) ((n+sizeof(length_t)-1) & ~(sizeof(length_t)-1)) void -fsort(int binno, int depth, int top, struct filelist *filelist, int nfiles, - FILE *outfp, struct field *ftbl) +fsort(struct filelist *filelist, int nfiles, FILE *outfp, struct field *ftbl) { - const u_char **keypos; + const u_char **keypos, **keyp; u_char *bufend; - u_char *weights; - int ntfiles, mfct = 0; + int mfct = 0; int c, nelem; get_func_t get; struct recheader *crec; - struct field tfield[2]; u_char *nbuffer; - memset(tfield, 0, sizeof(tfield)); - if (ftbl[0].flags & R) - tfield[0].weights = Rascii; - else - tfield[0].weights = ascii; - tfield[0].icol.num = 1; - weights = ftbl[0].weights; if (!buffer) { buffer = malloc(bufsize); keylist = malloc(MAXNUM * sizeof(u_char *)); memset(keylist, 0, MAXNUM * sizeof(u_char *)); } bufend = buffer + bufsize; + if (SINGL_FLD) + /* Key and data are one! */ get = makeline; else + /* Key (merged key fields) added before data */ get = makekey; - c = nelem = ntfiles = 0; /* XXXGCC -Wuninitialized m68k */ - keypos = keylist; /* XXXGCC -Wuninitialized m68k */ - crec = (RECHEADER *) buffer; /* XXXGCC -Wuninitialized m68k */ - while (c != EOF) { + /* Loop through reads of chunk of input files that get sorted + * and then merged together. */ + for (;;) { keypos = keylist; nelem = 0; crec = (RECHEADER *) buffer; - do_read: - while ((c = get(-1, top, filelist, nfiles, crec, - bufend, ftbl)) == 0) { - *keypos++ = crec->data + depth; - if (++nelem == MAXNUM) { - c = BUFFEND; - break; + /* Loop reading records */ + for (;;) { + c = get(-1, 0, filelist, nfiles, crec, bufend, ftbl); + /* 'c' is 0, EOF or BUFFEND */ + if (c == 0) { + /* Save start of key in input buffer */ + *keypos++ = crec->data; + if (++nelem == MAXNUM) { + c = BUFFEND; + break; + } + crec = (RECHEADER *)((char *) crec + + SALIGN(crec->length) + REC_DATA_OFFSET); + continue; } - crec =(RECHEADER *)((char *) crec + - SALIGN(crec->length) + REC_DATA_OFFSET); - } + if (c == EOF) + break; + if (nelem >= MAXNUM || bufsize >= MAXBUFSIZE) + /* Need to sort and save this lot of data */ + break; - if (c == BUFFEND && nelem < MAXNUM - && bufsize < MAXBUFSIZE) { - const u_char **keyp; - u_char *oldb = buffer; - - /* buffer was too small for data, allocate - * bigger buffer */ - nbuffer = realloc(buffer, bufsize * 2); + /* c == BUFFEND, and we can process more data */ + /* Allocate a larger buffer for this lot of data */ + bufsize *= 2; + nbuffer = realloc(buffer, bufsize); if (!nbuffer) { - err(2, "failed to realloc buffer to %lu bytes", - (unsigned long) bufsize * 2); + err(2, "failed to realloc buffer to %zu bytes", + bufsize); } - buffer = nbuffer; - bufsize *= 2; - bufend = buffer + bufsize; /* patch up keylist[] */ for (keyp = &keypos[-1]; keyp >= keylist; keyp--) - *keyp = buffer + (*keyp - oldb); + *keyp = nbuffer + (*keyp - buffer); - crec = (RECHEADER *) (buffer + ((u_char *)crec - oldb)); - goto do_read; + crec = (RECHEADER *) (nbuffer + ((u_char *)crec - buffer)); + buffer = nbuffer; + bufend = buffer + bufsize; } - if (c != BUFFEND && !ntfiles && !mfct) { - /* do not push */ - continue; + /* Sort this set of records */ + if (radix_sort(keylist, nelem, ftbl[0].weights, REC_D)) + err(2, NULL); + + if (c == EOF && mfct == 0) { + /* all the data is (sorted) in the buffer */ + append(keylist, nelem, outfp, putline, ftbl); + break; } - /* push */ - fstack[MSTART + mfct].fp = ftmp(); - if (radix_sort(keylist, nelem, weights, REC_D)) - err(2, NULL); - append(keylist, nelem, depth, fstack[MSTART + mfct].fp, putrec, - ftbl); + /* Save current data to a temporary file for a later merge */ + fstack[mfct].fp = ftmp(); + append(keylist, nelem, fstack[mfct].fp, putrec, ftbl); mfct++; - /* reduce number of open files */ - if (mfct == MERGE_FNUM ||(c == EOF && ntfiles)) { - /* - * Only copy extra incomplete crec - * data if there are any. - */ - int nodata = (bufend >= (u_char *)crec - && bufend <= crec->data); - size_t sz=0; - u_char *tmpbuf=NULL; - - if (!nodata) { - sz = bufend - crec->data; - tmpbuf = malloc(sz); - memmove(tmpbuf, crec->data, sz); - } - CHECKFSTACK(ntfiles); - fstack[ntfiles].fp = ftmp(); - fmerge(0, MSTART, filelist, mfct, geteasy, - fstack[ntfiles].fp, putrec, ftbl); - ntfiles++; - mfct = 0; - - if (!nodata) { - memmove(crec->data, tmpbuf, sz); - free(tmpbuf); - } + if (c == EOF) { + /* merge to output file */ + fmerge(0, filelist, mfct, geteasy, outfp, putline, + ftbl); + break; } - } - if (!ntfiles && !mfct) { /* everything in memory--pop */ - if (nelem > 1 && radix_sort(keylist, nelem, weights, REC_D)) - err(2, NULL); - if (nelem > 0) - append(keylist, nelem, depth, outfp, putline, ftbl); + if (mfct == MERGE_FNUM) { + /* Merge the files we have */ + FILE *fp = ftmp(); + fmerge(0, filelist, mfct, geteasy, fp, putrec, ftbl); + mfct = 1; + fstack[0].fp = fp; + } } - if (!ntfiles) - fmerge(0, MSTART, filelist, mfct, geteasy, - outfp, putline, ftbl); - else - fmerge(0, 0, filelist, ntfiles, geteasy, - outfp, putline, ftbl); free(keylist); keylist = NULL; Index: src/usr.bin/sort/fsort.h diff -u src/usr.bin/sort/fsort.h:1.14 src/usr.bin/sort/fsort.h:1.15 --- src/usr.bin/sort/fsort.h:1.14 Sat Aug 15 16:50:29 2009 +++ src/usr.bin/sort/fsort.h Thu Aug 20 06:36:25 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: fsort.h,v 1.14 2009/08/15 16:50:29 dsl Exp $ */ +/* $NetBSD: fsort.h,v 1.15 2009/08/20 06:36:25 dsl Exp $ */ /*- * Copyright (c) 2000-2003 The NetBSD Foundation, Inc. @@ -87,16 +87,8 @@ extern u_char *buffer; extern size_t bufsize; -/* temp files in the stack have a file descriptor, a largest bin (maxb) - * which becomes the last non-empty bin (lastb) when the actual largest - * bin is smaller than max(half the total file, BUFSIZE) - * Max_o is the offset of maxb so it can be sought after the other bins - * are sorted. -*/ +/* Temporary files contian data (with record headers) in sorted order */ struct tempfile { FILE *fp; - u_char maxb; - u_char lastb; - off_t max_o; }; extern struct tempfile fstack[MAXFCT]; Index: src/usr.bin/sort/msort.c diff -u src/usr.bin/sort/msort.c:1.21 src/usr.bin/sort/msort.c:1.22 --- src/usr.bin/sort/msort.c:1.21 Sun Aug 16 19:53:43 2009 +++ src/usr.bin/sort/msort.c Thu Aug 20 06:36:25 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: msort.c,v 1.21 2009/08/16 19:53:43 dsl Exp $ */ +/* $NetBSD: msort.c,v 1.22 2009/08/20 06:36:25 dsl Exp $ */ /*- * Copyright (c) 2000-2003 The NetBSD Foundation, Inc. @@ -65,7 +65,7 @@ #include "fsort.h" #ifndef lint -__RCSID("$NetBSD: msort.c,v 1.21 2009/08/16 19:53:43 dsl Exp $"); +__RCSID("$NetBSD: msort.c,v 1.22 2009/08/20 06:36:25 dsl Exp $"); __SCCSID("@(#)msort.c 8.1 (Berkeley) 6/6/93"); #endif /* not lint */ @@ -89,13 +89,12 @@ static void merge(int, int, get_func_t, FILE *, put_func_t, struct field *); void -fmerge(int binno, int top, struct filelist *filelist, int nfiles, +fmerge(int binno, struct filelist *filelist, int nfiles, get_func_t get, FILE *outfp, put_func_t fput, struct field *ftbl) { FILE *tout; int i, j, last; put_func_t put; - struct tempfile *l_fstack; wts = ftbl->weights; if (!UNIQUE && SINGL_FLD && ftbl->flags & F) @@ -108,11 +107,6 @@ memset(buffer, 0, bufsize); } - if (binno >= 0) - l_fstack = fstack + top; - else - l_fstack = fstack; - while (nfiles) { put = putrec; for (j = 0; j < nfiles; j += MERGE_FNUM) { @@ -125,18 +119,18 @@ last = min(MERGE_FNUM, nfiles - j); if (binno < 0) { for (i = 0; i < last; i++) - if (!(l_fstack[i+MAXFCT-1-MERGE_FNUM].fp = + if (!(fstack[i+MAXFCT-1-MERGE_FNUM].fp = fopen(filelist->names[j+i], "r"))) err(2, "%s", filelist->names[j+i]); merge(MAXFCT-1-MERGE_FNUM, last, get, tout, put, ftbl); } else { for (i = 0; i< last; i++) - rewind(l_fstack[i+j].fp); - merge(top+j, last, get, tout, put, ftbl); + rewind(fstack[i+j].fp); + merge(j, last, get, tout, put, ftbl); } if (nfiles > MERGE_FNUM) - l_fstack[j/MERGE_FNUM].fp = tout; + fstack[j/MERGE_FNUM].fp = tout; } nfiles = (nfiles + (MERGE_FNUM - 1)) / MERGE_FNUM; if (nfiles == 1) @@ -144,7 +138,6 @@ if (binno < 0) { binno = 0; get = geteasy; - top = 0; } } } Index: src/usr.bin/sort/sort.c diff -u src/usr.bin/sort/sort.c:1.50 src/usr.bin/sort/sort.c:1.51 --- src/usr.bin/sort/sort.c:1.50 Tue Aug 18 18:00:28 2009 +++ src/usr.bin/sort/sort.c Thu Aug 20 06:36:25 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: sort.c,v 1.50 2009/08/18 18:00:28 dsl Exp $ */ +/* $NetBSD: sort.c,v 1.51 2009/08/20 06:36:25 dsl Exp $ */ /*- * Copyright (c) 2000-2003 The NetBSD Foundation, Inc. @@ -76,7 +76,7 @@ #endif /* not lint */ #ifndef lint -__RCSID("$NetBSD: sort.c,v 1.50 2009/08/18 18:00:28 dsl Exp $"); +__RCSID("$NetBSD: sort.c,v 1.51 2009/08/20 06:36:25 dsl Exp $"); __SCCSID("@(#)sort.c 8.1 (Berkeley) 6/6/93"); #endif /* not lint */ @@ -127,6 +127,7 @@ struct field *fldtab, *p; size_t fldtab_sz = 3, fidx = 0; struct filelist filelist; + int num_input_files; FILE *outfp = NULL; struct rlimit rl; struct stat st; @@ -146,6 +147,7 @@ fldtab = malloc(fldtab_sz * sizeof(*fldtab)); memset(fldtab, 0, fldtab_sz * sizeof(*fldtab)); + /* Convert "+field" args to -f format */ fixit(&argc, argv); if (!(tmpdir = getenv("TMPDIR"))) @@ -240,6 +242,7 @@ usage(NULL); } } + if (cflag && argc > optind+1) errx(2, "too many input files for -c option"); if (argc - 2 > optind && !strcmp(argv[argc-2], "-o")) { @@ -248,6 +251,7 @@ } if (mflag && argc - optind > (MAXFCT - (16+1))*16) errx(2, "too many input files for -m option"); + for (i = optind; i < argc; i++) { /* allow one occurrence of /dev/stdin */ if (!strcmp(argv[i], "-") || !strcmp(argv[i], _PATH_STDIN)) { @@ -258,12 +262,15 @@ stdinflag = 1; /* change to /dev/stdin if '-' */ - if (argv[i][0] == '-') - argv[i] = __UNCONST(_PATH_STDIN); + if (argv[i][0] == '-') { + static char path_stdin[] = _PATH_STDIN; + argv[i] = path_stdin; + } } else if ((ch = access(argv[i], R_OK))) err(2, "%s", argv[i]); } + if (!(fldtab->flags & (I|D|N) || fldtab[1].icol.num)) { SINGL_FLD = 1; fldtab[0].icol.num = 1; @@ -278,13 +285,15 @@ settables(fldtab[0].flags); num_init(); fldtab->weights = gweights; + if (optind == argc) { static const char * const names[] = { _PATH_STDIN, NULL }; - filelist.names = names; - optind--; - } else + num_input_files = 1; + } else { filelist.names = (const char * const *) &argv[optind]; + num_input_files = argc - optind; + } if (SINGL_FLD) get = makeline; @@ -313,15 +322,15 @@ outpath); if ((outfd = mkstemp(toutpath)) == -1) err(2, "Cannot create temporary file `%s'", toutpath); - if ((outfp = fdopen(outfd, "w")) == NULL) - err(2, "Cannot open temporary file `%s'", toutpath); - outfile = toutpath; (void)atexit(cleanup); act.sa_handler = onsignal; (void) sigemptyset(&act.sa_mask); act.sa_flags = SA_RESTART | SA_RESETHAND; for (i = 0; sigtable[i]; ++i) /* always unlink toutpath */ sigaction(sigtable[i], &act, 0); + outfile = toutpath; + if ((outfp = fdopen(outfd, "w")) == NULL) + err(2, "Cannot open temporary file `%s'", toutpath); } else { outfile = outpath; @@ -330,10 +339,10 @@ } if (mflag) { - fmerge(-1, 0, &filelist, argc-optind, get, outfp, putline, + fmerge(-1, &filelist, num_input_files, get, outfp, putline, fldtab); } else - fsort(-1, 0, 0, &filelist, argc-optind, outfp, fldtab); + fsort(&filelist, num_input_files, outfp, fldtab); if (outfile != outpath) { if (access(outfile, F_OK)) @@ -354,6 +363,7 @@ err(2, "cannot link %s: output left in %s", outpath, outfile); (void)unlink(outfile); + toutpath[0] = 0; } exit(0); }