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 * %sccs.include.redist.c%
9 */
10
11 #if defined(LIBC_SCCS) && !defined(lint)
12 static char sccsid[] = "@(#)ansi.c 8.1 (Berkeley) 06/27/93";
13 #endif /* LIBC_SCCS and not lint */
14
15 #include <stdlib.h>
16 #include <limits.h>
17 #include <stddef.h>
18 #include <rune.h>
19
20 int
mblen(s,n)21 mblen(s, n)
22 const char *s;
23 size_t n;
24 {
25 char const *e;
26
27 if (s == 0 || *s == 0)
28 return (0); /* No support for state dependent encodings. */
29
30 if (sgetrune(s, (int)n, &e) == _INVALID_RUNE)
31 return (s - e);
32 return (e - s);
33 }
34
35 int
mbtowc(pwc,s,n)36 mbtowc(pwc, s, n)
37 wchar_t *pwc;
38 const char *s;
39 size_t n;
40 {
41 char const *e;
42 rune_t r;
43
44 if (s == 0 || *s == 0)
45 return (0); /* No support for state dependent encodings. */
46
47 if ((r = sgetrune(s, (int)n, &e)) == _INVALID_RUNE)
48 return (s - e);
49 if (pwc)
50 *pwc = r;
51 return (e - s);
52 }
53
54 int
wctomb(s,wchar)55 wctomb(s, wchar)
56 char *s;
57 wchar_t wchar;
58 {
59 char *e;
60
61 if (s == 0)
62 return (0); /* No support for state dependent encodings. */
63
64 if (wchar == 0) {
65 *s = 0;
66 return (1);
67 }
68
69 sputrune(wchar, s, MB_CUR_MAX, &e);
70 return (e ? e - s : -1);
71 }
72
73 size_t
mbstowcs(pwcs,s,n)74 mbstowcs(pwcs, s, n)
75 wchar_t *pwcs;
76 const char *s;
77 size_t n;
78 {
79 char const *e;
80 int cnt = 0;
81
82 if (!pwcs || !s)
83 return (-1);
84
85 while (n-- > 0) {
86 *pwcs = sgetrune(s, MB_LEN_MAX, &e);
87 if (*pwcs == _INVALID_RUNE)
88 return (-1);
89 if (*pwcs++ == 0)
90 break;
91 s = e;
92 ++cnt;
93 }
94 return (cnt);
95 }
96
97 size_t
wcstombs(s,pwcs,n)98 wcstombs(s, pwcs, n)
99 char *s;
100 const wchar_t *pwcs;
101 size_t n;
102 {
103 char *e;
104 int cnt = 0;
105
106 if (!pwcs || !s)
107 return (-1);
108
109 while (n > 0) {
110 if (*pwcs == 0) {
111 *s = 0;
112 break;
113 }
114 if (!sputrune(*pwcs++, s, (int)n, &e))
115 return (-1); /* encoding error */
116 if (!e) /* too long */
117 return (cnt);
118 cnt += e - s;
119 s = e;
120 }
121 return (cnt);
122 }
123