Handle sorting in better way

This commit is contained in:
Andrey A. Chernov 1996-06-09 19:41:31 +00:00
parent 9cca9761a6
commit 65b3693411
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=16262

View File

@ -350,6 +350,35 @@ void do_order()
Tbl.str_flags |= STR_ORDERED; Tbl.str_flags |= STR_ORDERED;
} }
int collcmp (c1, c2)
int c1, c2;
{
static char s1[2], s2[2];
if ( (isascii(c1) && isascii(c2))
|| (!isalpha(c1) && !isalpha(c2))
)
return (c1 - c2);
if (isalpha(c1) && !isalpha(c2)) {
if (isupper(c1))
return ('A' - c2);
else
return ('a' - c2);
} else if (isalpha(c2) && !isalpha(c1)) {
if (isupper(c2))
return (c1 - 'A');
else
return (c1 - 'a');
}
if (isupper(c1) && islower(c2))
return (-1);
else if (islower(c1) && isupper(c2))
return (1);
s1[0] = c1;
s2[0] = c2;
return strcoll(s1, s2);
}
/* /*
* cmp_str: * cmp_str:
* Compare two strings in the file * Compare two strings in the file
@ -359,18 +388,15 @@ STR *p1, *p2;
{ {
register int c1, c2; register int c1, c2;
register int n1, n2; register int n1, n2;
static char s1[2], s2[2];
int r; int r;
# define SET_N(nf,ch) (nf = (ch == '\n')) # define SET_N(nf,ch) (nf = (ch == '\n'))
# define IS_END(ch,nf) (ch == EOF || (ch == (unsigned char) Delimch && nf)) # define IS_END(ch,nf) (ch == EOF || (ch == (unsigned char) Delimch && nf))
s1[0] = c1 = (unsigned char) p1->first; c1 = (unsigned char) p1->first;
s2[0] = c2 = (unsigned char) p2->first; c2 = (unsigned char) p2->first;
if ((r = strcoll(s1, s2)) != 0) if ((r = collcmp(c1, c2)) != 0)
return r; return r;
if (c1 != c2)
return c1 - c2;
(void) fseek(Sort_1, p1->pos, 0); (void) fseek(Sort_1, p1->pos, 0);
(void) fseek(Sort_2, p2->pos, 0); (void) fseek(Sort_2, p2->pos, 0);
@ -389,12 +415,8 @@ STR *p1, *p2;
if (isupper(c2)) if (isupper(c2))
c2 = tolower(c2); c2 = tolower(c2);
} }
s1[0] = c1; if ((r = collcmp(c1, c2)) != 0)
s2[0] = c2;
if ((r = strcoll(s1, s2)) != 0)
return r; return r;
if (c1 != c2)
return c1 - c2;
SET_N(n1, c1); SET_N(n1, c1);
SET_N(n2, c2); SET_N(n2, c2);
c1 = getc(Sort_1); c1 = getc(Sort_1);
@ -404,11 +426,7 @@ STR *p1, *p2;
c1 = 0; c1 = 0;
if (IS_END(c2, n2)) if (IS_END(c2, n2))
c2 = 0; c2 = 0;
s1[0] = c1; return collcmp(c1, c2);
s2[0] = c2;
if ((r = strcoll(s1, s2)) != 0)
return r;
return c1 - c2;
} }
/* /*