annotate lib/memcoll.c @ 1869:0f0905dd78b2

.
author Jim Meyering <jim@meyering.net>
date Sun, 04 Jul 1999 10:38:37 +0000
parents
children da00e3cba254
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1869
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1 /* Locale-specific memory comparison.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
2 Copyright 1999 Free Software Foundation, Inc.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
3
Jim Meyering <jim@meyering.net>
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
Jim Meyering <jim@meyering.net>
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
Jim Meyering <jim@meyering.net>
parents:
diff changeset
6 the Free Software Foundation; either version 2, or (at your option)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
7 any later version.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
8
Jim Meyering <jim@meyering.net>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
Jim Meyering <jim@meyering.net>
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Jim Meyering <jim@meyering.net>
parents:
diff changeset
12 GNU General Public License for more details.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
13
Jim Meyering <jim@meyering.net>
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
Jim Meyering <jim@meyering.net>
parents:
diff changeset
15 along with this program; if not, write to the Free Software Foundation,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
17
Jim Meyering <jim@meyering.net>
parents:
diff changeset
18 /* Contributed by Paul Eggert <eggert@twinsun.com>. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
19
Jim Meyering <jim@meyering.net>
parents:
diff changeset
20 #if HAVE_CONFIG_H
Jim Meyering <jim@meyering.net>
parents:
diff changeset
21 # include <config.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
22 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
23
Jim Meyering <jim@meyering.net>
parents:
diff changeset
24 #ifndef __GNUC__
Jim Meyering <jim@meyering.net>
parents:
diff changeset
25 # ifdef HAVE_ALLOCA_H
Jim Meyering <jim@meyering.net>
parents:
diff changeset
26 # include <alloca.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
27 # else
Jim Meyering <jim@meyering.net>
parents:
diff changeset
28 # ifdef _AIX
Jim Meyering <jim@meyering.net>
parents:
diff changeset
29 # pragma alloca
Jim Meyering <jim@meyering.net>
parents:
diff changeset
30 # else
Jim Meyering <jim@meyering.net>
parents:
diff changeset
31 # ifdef _WIN32
Jim Meyering <jim@meyering.net>
parents:
diff changeset
32 # include <malloc.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
33 # include <io.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
34 # else
Jim Meyering <jim@meyering.net>
parents:
diff changeset
35 # ifndef alloca
Jim Meyering <jim@meyering.net>
parents:
diff changeset
36 char *alloca ();
Jim Meyering <jim@meyering.net>
parents:
diff changeset
37 # endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
38 # endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
39 # endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
40 # endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
41 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
42
Jim Meyering <jim@meyering.net>
parents:
diff changeset
43 #if HAVE_STRING_H
Jim Meyering <jim@meyering.net>
parents:
diff changeset
44 # include <string.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
45 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
46
Jim Meyering <jim@meyering.net>
parents:
diff changeset
47 /* Compare S1 (with length S1LEN) and S2 (with length S2LEN) according
Jim Meyering <jim@meyering.net>
parents:
diff changeset
48 to the LC_COLLATE locale. S1 and S2 do not overlap, but may be
Jim Meyering <jim@meyering.net>
parents:
diff changeset
49 adjacent. Temporarily modify the bytes after S1 and S2, but
Jim Meyering <jim@meyering.net>
parents:
diff changeset
50 restore their original contents before returning. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
51 int
Jim Meyering <jim@meyering.net>
parents:
diff changeset
52 memcoll (char *s1, size_t s1len, char *s2, size_t s2len)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
53 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
54 int diff;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
55 char n1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
56 char n2;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
57
Jim Meyering <jim@meyering.net>
parents:
diff changeset
58 /* We will temporarily set the bytes after S1 and S2 to zero, so if
Jim Meyering <jim@meyering.net>
parents:
diff changeset
59 S1 and S2 are adjacent, compare to a temporary copy of the
Jim Meyering <jim@meyering.net>
parents:
diff changeset
60 earlier, to avoid temporarily stomping on the later. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
61
Jim Meyering <jim@meyering.net>
parents:
diff changeset
62 if (s1 + s1len == s2)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
63 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
64 char *s2copy = alloca (s2len + 1);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
65 memcpy (s2copy, s2, s2len);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
66 s2 = s2copy;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
67 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
68
Jim Meyering <jim@meyering.net>
parents:
diff changeset
69 if (s2 + s2len == s1)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
70 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
71 char *s1copy = alloca (s1len + 1);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
72 memcpy (s1copy, s1, s1len);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
73 s1 = s1copy;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
74 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
75
Jim Meyering <jim@meyering.net>
parents:
diff changeset
76 n1 = s1[s1len]; s1[s1len++] = '\0';
Jim Meyering <jim@meyering.net>
parents:
diff changeset
77 n2 = s2[s2len]; s2[s2len++] = '\0';
Jim Meyering <jim@meyering.net>
parents:
diff changeset
78
Jim Meyering <jim@meyering.net>
parents:
diff changeset
79 while (! (diff = strcoll (s1, s2)))
Jim Meyering <jim@meyering.net>
parents:
diff changeset
80 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
81 /* strcoll found no difference, but perhaps it was fooled by NUL
Jim Meyering <jim@meyering.net>
parents:
diff changeset
82 characters in the data. Work around this problem by advancing
Jim Meyering <jim@meyering.net>
parents:
diff changeset
83 past the NUL chars. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
84 size_t size1 = strlen (s1) + 1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
85 size_t size2 = strlen (s2) + 1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
86 s1 += size1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
87 s2 += size2;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
88 s1len -= size1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
89 s2len -= size2;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
90
Jim Meyering <jim@meyering.net>
parents:
diff changeset
91 if (s1len == 0)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
92 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
93 if (s2len != 0)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
94 diff = -1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
95 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
96 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
97 else if (s2len == 0)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
98 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
99 diff = 1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
100 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
101 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
102 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
103
Jim Meyering <jim@meyering.net>
parents:
diff changeset
104 s1[s1len - 1] = n1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
105 s2[s2len - 1] = n2;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
106
Jim Meyering <jim@meyering.net>
parents:
diff changeset
107 return diff;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
108 }