(open_archive): Replace using label 'again' with a loop to work around gcc 3.2 bug.
[glibc.git] / wcsmbs / wcsncmp.c
blob9bf7a91f386cce2b12222b6e36e934a33446dd49
1 /* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3 Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, write to the Free
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18 02111-1307 USA. */
20 #include <wchar.h>
23 /* Compare no more than N characters of S1 and S2,
24 returning less than, equal to or greater than zero
25 if S1 is lexicographically less than, equal to or
26 greater than S2. */
27 int
28 wcsncmp (s1, s2, n)
29 const wchar_t *s1;
30 const wchar_t *s2;
31 size_t n;
33 wint_t c1 = L'\0';
34 wint_t c2 = L'\0';
36 if (n >= 4)
38 size_t n4 = n >> 2;
41 c1 = (wint_t) *s1++;
42 c2 = (wint_t) *s2++;
43 if (c1 == L'\0' || c1 != c2)
44 return c1 - c2;
45 c1 = (wint_t) *s1++;
46 c2 = (wint_t) *s2++;
47 if (c1 == L'\0' || c1 != c2)
48 return c1 - c2;
49 c1 = (wint_t) *s1++;
50 c2 = (wint_t) *s2++;
51 if (c1 == L'\0' || c1 != c2)
52 return c1 - c2;
53 c1 = (wint_t) *s1++;
54 c2 = (wint_t) *s2++;
55 if (c1 == L'\0' || c1 != c2)
56 return c1 - c2;
57 } while (--n4 > 0);
58 n &= 3;
61 while (n > 0)
63 c1 = (wint_t) *s1++;
64 c2 = (wint_t) *s2++;
65 if (c1 == L'\0' || c1 != c2)
66 return c1 - c2;
67 n--;
70 return c1 - c2;