Deleted Added
sdiff udiff text old ( 127998 ) new ( 227753 )
full compact
1/*-
2 * Copyright (c) 2002 Tim J. Robbins
3 * All rights reserved.
4 *
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>
28__FBSDID("$FreeBSD: head/lib/libc/string/wcscoll.c 127998 2004-04-07 09:47:56Z tjr $");
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
44wcscoll(const wchar_t *ws1, const wchar_t *ws2)
45{
46 char *mbs1, *mbs2;
47 int diff, sverrno;
48
49 if (__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
70 diff = strcoll(mbs1, mbs2);
71 sverrno = errno;
72 free(mbs1);
73 free(mbs2);
74 errno = sverrno;
75
76 return (diff);
77}
78
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 ---