Deleted Added
full compact
wcstombs.c (103012) wcstombs.c (106032)
1/*-
2 * Copyright (c) 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Paul Borman at Krystal Technologies.
7 *
8 * Redistribution and use in source and binary forms, with or without

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

30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 */
36
37#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Paul Borman at Krystal Technologies.
7 *
8 * Redistribution and use in source and binary forms, with or without

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

30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 */
36
37#include <sys/cdefs.h>
38__FBSDID("$FreeBSD: head/lib/libc/locale/wcstombs.c 103012 2002-09-06 11:24:06Z tjr $");
38__FBSDID("$FreeBSD: head/lib/libc/locale/wcstombs.c 106032 2002-10-27 10:41:21Z tjr $");
39
40#include <errno.h>
41#include <stdlib.h>
42#include <limits.h>
43#include <stddef.h>
44#include <rune.h>
45
46size_t
39
40#include <errno.h>
41#include <stdlib.h>
42#include <limits.h>
43#include <stddef.h>
44#include <rune.h>
45
46size_t
47wcstombs(s, pwcs, n)
48 char * __restrict s;
49 const wchar_t * __restrict pwcs;
50 size_t n;
47wcstombs(char * __restrict s, const wchar_t * __restrict pwcs, size_t n)
51{
52 char buf[MB_LEN_MAX];
53 char *e;
54 int cnt, nb;
55
48{
49 char buf[MB_LEN_MAX];
50 char *e;
51 int cnt, nb;
52
56 if (!pwcs || n > INT_MAX) {
53 if (pwcs == NULL || n > INT_MAX) {
57 errno = EINVAL;
58 return (-1);
59 }
60
61 cnt = 0;
62
63 if (s == NULL) {
64 /* Convert and count only, do not store. */
65 while (*pwcs != L'\0') {
54 errno = EINVAL;
55 return (-1);
56 }
57
58 cnt = 0;
59
60 if (s == NULL) {
61 /* Convert and count only, do not store. */
62 while (*pwcs != L'\0') {
66 if (!sputrune(*pwcs++, buf, MB_LEN_MAX, &e)) {
63 if (sputrune(*pwcs++, buf, MB_LEN_MAX, &e) == 0) {
67 errno = EILSEQ;
68 return (-1);
69 }
70 cnt += e - buf;
71 }
72 return (cnt);
73 }
74
75 /* Convert, store and count characters. */
76 nb = n;
77 while (nb > 0) {
64 errno = EILSEQ;
65 return (-1);
66 }
67 cnt += e - buf;
68 }
69 return (cnt);
70 }
71
72 /* Convert, store and count characters. */
73 nb = n;
74 while (nb > 0) {
78 if (*pwcs == 0) {
79 *s = 0;
75 if (*pwcs == L'\0') {
76 *s = '\0';
80 break;
81 }
77 break;
78 }
82 if (!sputrune(*pwcs++, s, nb, &e)) {
79 if (sputrune(*pwcs++, s, nb, &e) == 0) {
83 errno = EILSEQ;
84 return (-1);
85 }
80 errno = EILSEQ;
81 return (-1);
82 }
86 if (!e) /* too long */
83 if (e == NULL) /* too long */
87 return (cnt);
88 cnt += e - s;
89 nb -= e - s;
90 s = e;
91 }
92
93 return (cnt);
94}
84 return (cnt);
85 cnt += e - s;
86 nb -= e - s;
87 s = e;
88 }
89
90 return (cnt);
91}