Deleted Added
full compact
wcscoll.c (127998) wcscoll.c (227753)
1/*-
2 * Copyright (c) 2002 Tim J. Robbins
3 * All rights reserved.
4 *
1/*-
2 * Copyright (c) 2002 Tim J. Robbins
3 * All rights reserved.
4 *
5 * Copyright (c) 2011 The FreeBSD Foundation
6 * All rights reserved.
7 * Portions of this software were developed by David Chisnall
8 * under sponsorship from the FreeBSD Foundation.
9 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.

--- 7 unchanged lines hidden (view full) ---

20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.

--- 7 unchanged lines hidden (view full) ---

25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 */
31
32#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: head/lib/libc/string/wcscoll.c 127998 2004-04-07 09:47:56Z tjr $");
33__FBSDID("$FreeBSD: head/lib/libc/string/wcscoll.c 227753 2011-11-20 14:45:42Z theraven $");
29
30#include <errno.h>
31#include <stdlib.h>
32#include <string.h>
33#include <wchar.h>
34#include "collate.h"
35
36static char *__mbsdup(const wchar_t *);
37
38/*
39 * Placeholder implementation of wcscoll(). Attempts to use the single-byte
40 * collation ordering where possible, and falls back on wcscmp() in locales
41 * with extended character sets.
42 */
43int
34
35#include <errno.h>
36#include <stdlib.h>
37#include <string.h>
38#include <wchar.h>
39#include "collate.h"
40
41static char *__mbsdup(const wchar_t *);
42
43/*
44 * Placeholder implementation of wcscoll(). Attempts to use the single-byte
45 * collation ordering where possible, and falls back on wcscmp() in locales
46 * with extended character sets.
47 */
48int
44wcscoll(const wchar_t *ws1, const wchar_t *ws2)
49wcscoll_l(const wchar_t *ws1, const wchar_t *ws2, locale_t locale)
45{
46 char *mbs1, *mbs2;
47 int diff, sverrno;
50{
51 char *mbs1, *mbs2;
52 int diff, sverrno;
53 FIX_LOCALE(locale);
54 struct xlocale_collate *table =
55 (struct xlocale_collate*)locale->components[XLC_COLLATE];
48
56
49 if (__collate_load_error || MB_CUR_MAX > 1)
57 if (table->__collate_load_error || MB_CUR_MAX > 1)
50 /*
51 * Locale has no special collating order, could not be
52 * loaded, or has an extended character set; do a fast binary
53 * comparison.
54 */
55 return (wcscmp(ws1, ws2));
56
57 if ((mbs1 = __mbsdup(ws1)) == NULL || (mbs2 = __mbsdup(ws2)) == NULL) {

--- 4 unchanged lines hidden (view full) ---

62 * incorrect result.
63 */
64 sverrno = errno;
65 free(mbs1);
66 errno = sverrno;
67 return (wcscmp(ws1, ws2));
68 }
69
58 /*
59 * Locale has no special collating order, could not be
60 * loaded, or has an extended character set; do a fast binary
61 * comparison.
62 */
63 return (wcscmp(ws1, ws2));
64
65 if ((mbs1 = __mbsdup(ws1)) == NULL || (mbs2 = __mbsdup(ws2)) == NULL) {

--- 4 unchanged lines hidden (view full) ---

70 * incorrect result.
71 */
72 sverrno = errno;
73 free(mbs1);
74 errno = sverrno;
75 return (wcscmp(ws1, ws2));
76 }
77
70 diff = strcoll(mbs1, mbs2);
78 diff = strcoll_l(mbs1, mbs2, locale);
71 sverrno = errno;
72 free(mbs1);
73 free(mbs2);
74 errno = sverrno;
75
76 return (diff);
77}
78
79 sverrno = errno;
80 free(mbs1);
81 free(mbs2);
82 errno = sverrno;
83
84 return (diff);
85}
86
87int
88wcscoll(const wchar_t *ws1, const wchar_t *ws2)
89{
90 return wcscoll_l(ws1, ws2, __get_locale());
91}
92
79static char *
80__mbsdup(const wchar_t *ws)
81{
82 static const mbstate_t initial;
83 mbstate_t st;
84 const wchar_t *wcp;
85 size_t len;
86 char *mbs;

--- 12 unchanged lines hidden ---
93static char *
94__mbsdup(const wchar_t *ws)
95{
96 static const mbstate_t initial;
97 mbstate_t st;
98 const wchar_t *wcp;
99 size_t len;
100 char *mbs;

--- 12 unchanged lines hidden ---