12f478eed80311d97a55e523972f052ac88188b0
[kopensolaris-gnu/glibc.git] / wcsmbs / bits / wchar2.h
1 /* Checking macros for wchar functions.
2    Copyright (C) 2005 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #ifndef _WCHAR_H
21 # error "Never include <bits/wchar.h> directly; use <wchar.h> instead."
22 #endif
23
24
25 extern wchar_t *__wmemcpy_chk (wchar_t *__restrict __s1,
26                                __const wchar_t *__restrict __s2, size_t __n,
27                                size_t __ns1) __THROW;
28 extern wchar_t *__REDIRECT_NTH (__wmemcpy_alias,
29                                 (wchar_t *__restrict __s1,
30                                  __const wchar_t *__restrict __s2, size_t __n),
31                                 wmemcpy);
32
33 extern __always_inline wchar_t *
34 wmemcpy (wchar_t *__restrict __s1, __const wchar_t *__restrict __s2,
35          size_t __n)
36 {
37   if (__bos0 (__s1) != (size_t) -1)
38     return __wmemcpy_chk (__s1, __s2, __n, __bos0 (__s1) / sizeof (wchar_t));
39   return __wmemcpy_alias (__s1, __s2, __n);
40 }
41
42
43 extern wchar_t *__wmemmove_chk (wchar_t *__s1, __const wchar_t *__s2,
44                                 size_t __n, size_t __ns1) __THROW;
45 extern wchar_t *__REDIRECT_NTH (__wmemmove_alias, (wchar_t *__s1,
46                                                    __const wchar_t *__s2,
47                                                    size_t __n), wmemmove);
48
49 extern __always_inline wchar_t *
50 wmemmove (wchar_t *__restrict __s1, __const wchar_t *__restrict __s2,
51           size_t __n)
52 {
53   if (__bos0 (__s1) != (size_t) -1)
54     return __wmemmove_chk (__s1, __s2, __n, __bos0 (__s1) / sizeof (wchar_t));
55   return __wmemmove_alias (__s1, __s2, __n);
56 }
57
58
59 #ifdef __USE_GNU
60 extern wchar_t *__wmempcpy_chk (wchar_t *__restrict __s1,
61                                 __const wchar_t *__restrict __s2, size_t __n,
62                                 size_t __ns1) __THROW;
63 extern wchar_t *__REDIRECT_NTH (__wmempcpy_alias,
64                                 (wchar_t *__restrict __s1,
65                                  __const wchar_t *__restrict __s2,
66                                  size_t __n), wmempcpy);
67
68 extern __always_inline wchar_t *
69 wmempcpy (wchar_t *__restrict __s1, __const wchar_t *__restrict __s2,
70           size_t __n)
71 {
72   if (__bos0 (__s1) != (size_t) -1)
73     return __wmempcpy_chk (__s1, __s2, __n, __bos0 (__s1) / sizeof (wchar_t));
74   return __wmempcpy_alias (__s1, __s2, __n);
75 }
76 #endif
77
78
79 extern wchar_t *__wmemset_chk (wchar_t *__s, wchar_t __c, size_t __n,
80                                size_t __ns) __THROW;
81 extern wchar_t *__REDIRECT_NTH (__wmemset_alias, (wchar_t *__s, wchar_t __c,
82                                                   size_t __n), wmemset);
83
84 extern __always_inline wchar_t *
85 wmemset (wchar_t *__restrict __s, wchar_t __c, size_t __n)
86 {
87   if (__bos0 (__s) != (size_t) -1)
88     return __wmemset_chk (__s, __c, __n, __bos0 (__s) / sizeof (wchar_t));
89   return __wmemset_alias (__s, __c, __n);
90 }
91
92
93 extern wchar_t *__wcscpy_chk (wchar_t *__restrict __dest,
94                               __const wchar_t *__restrict __src,
95                               size_t __n) __THROW;
96 extern wchar_t *__REDIRECT_NTH (__wcscpy_alias,
97                                 (wchar_t *__restrict __dest,
98                                  __const wchar_t *__restrict __src), wcscpy);
99
100 extern __always_inline wchar_t *
101 wcscpy (wchar_t *__dest, __const wchar_t *__src)
102 {
103   if (__bos (__dest) != (size_t) -1)
104     return __wcscpy_chk (__dest, __src, __bos (__dest) / sizeof (wchar_t));
105   return __wcscpy_alias (__dest, __src);
106 }
107
108
109 extern wchar_t *__wcpcpy_chk (wchar_t *__dest, __const wchar_t *__src,
110                               size_t __destlen) __THROW;
111 extern wchar_t *__REDIRECT_NTH (__wcpcpy_alias, (wchar_t *__dest,
112                                                  __const wchar_t *__src),
113                                 wcpcpy);
114
115 extern __always_inline wchar_t *
116 wcpcpy (wchar_t *__dest, __const wchar_t *__src)
117 {
118   if (__bos (__dest) != (size_t) -1)
119     return __wcpcpy_chk (__dest, __src, __bos (__dest) / sizeof (wchar_t));
120   return __wcpcpy_alias (__dest, __src);
121 }
122
123
124 extern wchar_t *__wcsncpy_chk (wchar_t *__restrict __dest,
125                                __const wchar_t *__restrict __src, size_t __n,
126                                size_t __destlen) __THROW;
127 extern wchar_t *__REDIRECT_NTH (__wcsncpy_alias,
128                                 (wchar_t *__restrict __dest,
129                                  __const wchar_t *__restrict __src,
130                                  size_t __n), wcsncpy);
131
132 extern __always_inline wchar_t *
133 wcsncpy (wchar_t *__dest, __const wchar_t *__src, size_t __n)
134 {
135   if (__bos (__dest) != (size_t) -1
136       && (!__builtin_constant_p (__n) || __bos (__dest) >= __n))
137     return __wcsncpy_chk (__dest, __src, __n,
138                           __bos (__dest) / sizeof (wchar_t));
139   return __wcsncpy_alias (__dest, __src, __n);
140 }
141
142
143 extern wchar_t *__wcpncpy_chk (wchar_t *__restrict __dest,
144                                __const wchar_t *__restrict __src, size_t __n,
145                                size_t __destlen) __THROW;
146 extern wchar_t *__REDIRECT_NTH (__wcpncpy_alias,
147                                 (wchar_t *__restrict __dest,
148                                  __const wchar_t *__restrict __src,
149                                  size_t __n), wcpncpy);
150
151 extern __always_inline wchar_t *
152 wcpncpy (wchar_t *__dest, __const wchar_t *__src, size_t __n)
153 {
154   if (__bos (__dest) != (size_t) -1
155       && (!__builtin_constant_p (__n) || __bos (__dest) >= __n))
156     return __wcpncpy_chk (__dest, __src, __n,
157                           __bos (__dest) / sizeof (wchar_t));
158   return __wcpncpy_alias (__dest, __src, __n);
159 }
160
161
162 extern wchar_t *__wcscat_chk (wchar_t *__restrict __dest,
163                               __const wchar_t *__restrict __src,
164                               size_t __destlen) __THROW;
165 extern wchar_t *__REDIRECT_NTH (__wcscat_alias,
166                                 (wchar_t *__restrict __dest,
167                                  __const wchar_t *__restrict __src), wcscat);
168
169 extern __always_inline wchar_t *
170 wcscat (wchar_t *__dest, __const wchar_t *__src)
171 {
172   if (__bos (__dest) != (size_t) -1)
173     return __wcscat_chk (__dest, __src, __bos (__dest) / sizeof (wchar_t));
174   return __wcscat_alias (__dest, __src);
175 }
176
177
178 extern wchar_t *__wcsncat_chk (wchar_t *__restrict __dest,
179                                __const wchar_t *__restrict __src,
180                                size_t __n, size_t __destlen) __THROW;
181 extern wchar_t *__REDIRECT_NTH (__wcsncat_alias,
182                                 (wchar_t *__restrict __dest,
183                                  __const wchar_t *__restrict __src,
184                                  size_t __n), wcsncat);
185
186 extern __always_inline wchar_t *
187 wcsncat (wchar_t *__dest, __const wchar_t *__src, size_t __n)
188 {
189   if (__bos (__dest) != (size_t) -1)
190     return __wcsncat_chk (__dest, __src, __n,
191                           __bos (__dest) / sizeof (wchar_t));
192   return __wcsncat_alias (__dest, __src, __n);
193 }
194
195
196 extern int __swprintf_chk (wchar_t *__restrict __s, size_t __n,
197                            int __flag, size_t __s_len,
198                            __const wchar_t *__restrict __format, ...)
199      __THROW /* __attribute__ ((__format__ (__wprintf__, 5, 6))) */;
200
201 /* XXX We might want to have support in gcc for swprintf.  */
202 #define swprintf(s, n, format, ...) \
203   (__bos (s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1                        \
204    ? __swprintf_chk (s, n, __USE_FORTIFY_LEVEL - 1, __bos (s), format,        \
205                      __VA_ARGS__)                                             \
206    : swprintf (s, n, format, __VA_ARGS__))
207
208
209 extern int __vswprintf_chk (wchar_t *__restrict __s, size_t __n,
210                             int __flag, size_t __s_len,
211                             __const wchar_t *__restrict __format,
212                             __gnuc_va_list __arg)
213      __THROW /* __attribute__ ((__format__ (__wprintf__, 5, 0))) */;
214 extern int __REDIRECT_NTH (__vswprintf_alias,
215                            (wchar_t *__restrict __s, size_t __n,
216                             __const wchar_t *__restrict __format,
217                             __gnuc_va_list __arg), vswprintf)
218      /* __attribute__ ((__format__ (__wprintf__, 3, 0))) */;
219
220
221 extern __always_inline int
222 vswprintf (wchar_t *__s, size_t __n, __const wchar_t *__format,
223            __gnuc_va_list __arg)
224 {
225   if (__bos (__s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1)
226     return __vswprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1, __bos (__s),
227                             __format, __arg);
228   return vswprintf (__s, __n, __format, __arg);
229 }
230
231
232 #if __USE_FORTIFY_LEVEL > 1
233
234 extern int __fwprintf_chk (FILE *__restrict __stream, int __flag,
235                            __const wchar_t *__restrict __format, ...);
236 extern int __wprintf_chk (int __flag, __const wchar_t *__restrict __format,
237                           ...);
238 extern int __vfwprintf_chk (FILE *__restrict __stream, int __flag,
239                             __const wchar_t *__restrict __format,
240                             _G_va_list __ap);
241 extern int __vwprintf_chk (int __flag, __const wchar_t *__restrict __format,
242                            _G_va_list __ap);
243
244 # define wprintf(...) \
245   __wprintf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
246 # define fwprintf(stream, ...) \
247   __fwprintf_chk (stream, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
248 # define vwprintf(format, ap) \
249   __vwprintf_chk (__USE_FORTIFY_LEVEL - 1, format, ap)
250 # define vfwprintf(stream, format, ap) \
251   __vfwprintf_chk (stream, __USE_FORTIFY_LEVEL - 1, format, ap)
252
253 #endif
254
255 extern wchar_t *__fgetws_chk (wchar_t *__restrict __s, size_t __size, int __n,
256                               FILE *__restrict __stream) __wur;
257 extern wchar_t *__REDIRECT (__fgetws_alias,
258                             (wchar_t *__restrict __s, int __n,
259                              FILE *__restrict __stream), fgetws) __wur;
260
261 extern __always_inline __wur wchar_t *
262 fgetws (wchar_t *__restrict __s, int __n, FILE *__restrict __stream)
263 {
264   if (__bos (__s) != (size_t) -1
265       && (!__builtin_constant_p (__n) || (size_t) __n > __bos (__s)))
266     return __fgetws_chk (__s, __bos (__s), __n, __stream);
267   return __fgetws_alias (__s, __n, __stream);
268 }
269
270 #ifdef __USE_GNU
271 extern wchar_t *__fgetws_unlocked_chk (wchar_t *__restrict __s, size_t __size,
272                                        int __n, FILE *__restrict __stream)
273   __wur;
274 extern wchar_t *__REDIRECT (__fgetws_unlocked_alias,
275                             (wchar_t *__restrict __s, int __n,
276                              FILE *__restrict __stream), fgetws_unlocked)
277   __wur;
278
279 extern __always_inline __wur wchar_t *
280 fgetws_unlocked (wchar_t *__restrict __s, int __n, FILE *__restrict __stream)
281 {
282   if (__bos (__s) != (size_t) -1
283       && (!__builtin_constant_p (__n) || (size_t) __n > __bos (__s)))
284     return __fgetws_unlocked_chk (__s, __bos (__s), __n, __stream);
285   return __fgetws_unlocked_alias (__s, __n, __stream);
286 }
287 #endif