From 0f8d90bd48f669a9575a0a0750db7ba883f4dfa0 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Wed, 31 Mar 1993 06:27:07 +0000 Subject: sort changes from Mike --- old/textutils/ChangeLog | 20 +++++++++++++ src/sort.c | 75 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 69 insertions(+), 26 deletions(-) diff --git a/old/textutils/ChangeLog b/old/textutils/ChangeLog index bf8b34eb9..34aaf66be 100644 --- a/old/textutils/ChangeLog +++ b/old/textutils/ChangeLog @@ -9,6 +9,26 @@ Mon Mar 29 21:27:56 1993 Jim Meyering (meyering@comco.com) * cut.c, expand.c, join.c, nl.c: Always call error with errno (not zero) after failed fclose or non-zero ferror. +Sun Mar 28 16:59:31 1993 Mike Haertel (mike@cs.uoregon.edu) + + * configure.in: Add check for working memcmp; use GNU's if + the system's doesn't grok the 8th bit. + * memcmp.c: Fix it so it groks the 8th bit. + TODO: We really need to provide a fast memcmp, since most + machines will have a broken memcmp. Probably should get + the one from glibc. + * sort.c (mergefps): Maintain keybeg and keylim when copying + the current line to `saved'. + (numcompare): Skip white space here since -n no longer implies -b. + (getmonth): Skip white space here since -M no longer implies -b. + (compare): Completely overhauled to make the 8th bit work right, + also to properly handle the global reverse option. + (set_ordering): -n no longer implies -b, according to Posix. + For consistency, -M also no longer implies -b. + (main): Correct treatment of -r and global keys. + (findlines): Clear keybeg and keylim if no keys are used. + (sort): Avoid overwriting tempfiles[] array bounds. + Sun Mar 21 22:29:29 1993 Jim Meyering (meyering@comco.com) * pr.c (close_file): Reverse May 13, '92 change, but add the condition diff --git a/src/sort.c b/src/sort.c index 483d7ef6e..4acc1e5a6 100644 --- a/src/sort.c +++ b/src/sort.c @@ -554,6 +554,11 @@ findlines (buf, lines) lines->lines[lines->used].keybeg = beg; } } + else + { + lines->lines[lines->used].keybeg = 0; + lines->lines[lines->used].keylim = 0; + } ++lines->used; beg = ptr + 1; @@ -630,6 +635,11 @@ numcompare (a, b) tmpa = UCHAR (*a), tmpb = UCHAR (*b); + while (blanks[tmpa]) + tmpa = UCHAR (*++a); + while (blanks[tmpb]) + tmpb = UCHAR (*++b); + if (tmpa == '-') { tmpa = UCHAR (*++a); @@ -724,6 +734,9 @@ getmonth (s, len) char month[4]; register int i, lo = 0, hi = 12; + while (len > 0 && blanks[UCHAR(*s)]) + ++s, --len; + if (len < 3) return 0; @@ -877,36 +890,34 @@ compare (a, b) { int diff, tmpa, tmpb, mini; + /* First try to compare on the specified keys (if any). + The only two cases with no key at all are unadorned sort, + and unadorned sort -r. */ if (keyhead.next) { diff = keycompare (a, b); - if (diff) + if (diff != 0) return diff; - if (!unique && !stable) - { - tmpa = a->length, tmpb = b->length; - diff = memcmp (a->text, b->text, min (tmpa, tmpb)); - if (!diff) - diff = tmpa - tmpb; - } + if (unique || stable) + return 0; } + + /* If the keys all compare equal (or no keys were specified) + fall through to the default byte-by-byte comparison. */ + tmpa = a->length, tmpb = b->length; + mini = min (tmpa, tmpb); + if (mini == 0) + diff = tmpa - tmpb; else { - tmpa = a->length, tmpb = b->length; - mini = min (tmpa, tmpb); - if (mini == 0) - diff = tmpa - tmpb; - else - { - char *ap = a->text, *bp = b->text; + char *ap = a->text, *bp = b->text; - diff = *ap - *bp; + diff = UCHAR (*ap) - UCHAR (*bp); + if (diff == 0) + { + diff = memcmp (ap, bp, mini); if (diff == 0) - { - diff = memcmp (ap, bp, mini); - if (diff == 0) - diff = tmpa - tmpb; - } + diff = tmpa - tmpb; } } @@ -1069,6 +1080,18 @@ mergefps (fps, nfps, ofp) saved.length = lines[ord[0]].lines[cur[ord[0]]].length; bcopy (lines[ord[0]].lines[cur[ord[0]]].text, saved.text, saved.length + 1); + if (lines[ord[0]].lines[cur[ord[0]]].keybeg != NULL) + { + saved.keybeg = saved.text + + (lines[ord[0]].lines[cur[ord[0]]].keybeg + - lines[ord[0]].lines[cur[ord[0]]].text); + } + if (lines[ord[0]].lines[cur[ord[0]]].keylim != NULL) + { + saved.keylim = saved.text + + (lines[ord[0]].lines[cur[ord[0]]].keylim + - lines[ord[0]].lines[cur[ord[0]]].text); + } savedflag = 1; } } @@ -1308,7 +1331,7 @@ sort (files, nfiles, ofp) { tempfiles = (char **) xmalloc (ntemp * sizeof (char *)); i = ntemp; - for (node = temphead.next; node; node = node->next) + for (node = temphead.next; i > 0; node = node->next) tempfiles[--i] = node->name; merge (tempfiles, ntemp, ofp); free ((char *) tempfiles); @@ -1392,10 +1415,10 @@ set_ordering (s, key, blanktype) key->ignore = nonprinting; break; case 'M': - key->skipsblanks = key->skipeblanks = key->month = 1; + key->month = 1; break; case 'n': - key->skipsblanks = key->skipeblanks = key->numeric = 1; + key->numeric = 1; break; case 'r': key->reverse = 1; @@ -1673,9 +1696,9 @@ main (argc, argv) } if (!keyhead.next && (gkey.ignore || gkey.translate || gkey.skipsblanks - || gkey.reverse || gkey.skipeblanks - || gkey.month || gkey.numeric)) + || gkey.skipeblanks || gkey.month || gkey.numeric)) insertkey (&gkey); + reverse = gkey.reverse; if (nfiles == 0) { -- cgit v1.2.3-70-g09d2