Print this page
2964 need POSIX 2008 locale object support
Reviewed by: Robert Mustacchi <rm@joyent.com>
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/lib/libc/port/locale/wcsxfrm.c
+++ new/usr/src/lib/libc/port/locale/wcsxfrm.c
1 1 /*
2 + * Copyright 2013 Garrett D'Amore <garrett@damore.org>
2 3 * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
3 4 * Copyright (c) 1995 Alex Tatmanjants <alex@elvisti.kiev.ua>
4 5 * at Electronni Visti IA, Kiev, Ukraine.
5 6 * All rights reserved.
6 7 *
7 8 * Redistribution and use in source and binary forms, with or without
8 9 * modification, are permitted provided that the following conditions
9 10 * are met:
10 11 * 1. Redistributions of source code must retain the above copyright
11 12 * notice, this list of conditions and the following disclaimer.
12 13 * 2. Redistributions in binary form must reproduce the above copyright
13 14 * notice, this list of conditions and the following disclaimer in the
14 15 * documentation and/or other materials provided with the distribution.
15 16 *
16 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
17 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
20 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 27 * SUCH DAMAGE.
27 28 */
28 29
↓ open down ↓ |
17 lines elided |
↑ open up ↑ |
29 30 #include "lint.h"
30 31 #include <stdlib.h>
31 32 #include <string.h>
32 33 #include <wchar.h>
33 34 #include <assert.h>
34 35 #include "collate.h"
35 36
36 37 #define WCS_XFRM_OFFSET 1
37 38
38 39 size_t
39 -wcsxfrm(wchar_t *_RESTRICT_KYWD dest,
40 - const wchar_t *_RESTRICT_KYWD src, size_t len)
40 +wcsxfrm_l(wchar_t *_RESTRICT_KYWD dest,
41 + const wchar_t *_RESTRICT_KYWD src, size_t len, locale_t loc)
41 42 {
42 43 size_t slen;
44 + const struct lc_collate *lcc = loc->collate;
43 45
44 46 if (*src == L'\0') {
45 47 if (len != 0)
46 48 *dest = L'\0';
47 49 return (0);
48 50 }
49 51
50 - if ((_collate_load_error) ||
51 - ((slen = _collate_wxfrm(src, dest, len)) == (size_t)-1)) {
52 + if ((lcc->lc_is_posix) ||
53 + ((slen = _collate_wxfrm(lcc, src, dest, len)) == (size_t)-1)) {
52 54 goto error;
53 55 }
54 56
55 57 /* Add null termination at the correct location. */
56 58 if (len > slen) {
57 59 dest[slen] = 0;
58 60 } else if (len != 0) {
59 61 dest[len-1] = 0;
60 62 }
61 63
62 64 return (slen);
↓ open down ↓ |
1 lines elided |
↑ open up ↑ |
63 65
64 66 error:
65 67 slen = wcslen(src);
66 68 if (slen < len)
67 69 (void) wcscpy(dest, src);
68 70 else if (len != 0) {
69 71 (void) wcsncpy(dest, src, len - 1);
70 72 dest[len - 1] = L'\0';
71 73 }
72 74 return (slen);
75 +}
76 +
77 +size_t
78 +wcsxfrm(wchar_t *_RESTRICT_KYWD dest,
79 + const wchar_t *_RESTRICT_KYWD src, size_t len)
80 +{
81 + return (wcsxfrm_l(dest, src, len, uselocale(NULL)));
73 82 }
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX