Commit | Line | Data |
---|---|---|
0f4af149 KB |
1 | /*- |
2 | * Copyright (c) 1993 The Regents of the University of California. | |
3 | * 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) | |
a6cdec1a | 12 | static char sccsid[] = "@(#)ansi.c 5.2 (Berkeley) %G%"; |
0f4af149 KB |
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 | |
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 | |
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 | |
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 | |
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 | |
98 | wcstombs(s, pwcs, n) | |
99 | char *s; | |
100 | const wchar_t *pwcs; | |
101 | size_t n; | |
102 | { | |
103 | char *e; | |
a6cdec1a | 104 | int cnt = 0; |
0f4af149 KB |
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 | } |