Define WCHAR_{MIN,MAX} if not already defined.
[kopensolaris-gnu/glibc.git] / wcsmbs / wchar.h
1 /* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Library General Public License as
6    published by the Free Software Foundation; either version 2 of the
7    License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Library General Public License for more details.
13
14    You should have received a copy of the GNU Library General Public
15    License along with the GNU C Library; see the file COPYING.LIB.  If not,
16    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17    Boston, MA 02111-1307, USA.  */
18
19 /*
20  *      ISO C Standard, Amendment 1, 7.16.4
21  *      General wide-string utilities   <wchar.h>
22  */
23
24 #ifndef _WCHAR_H
25 #define _WCHAR_H 1
26
27 #include <features.h>
28
29 __BEGIN_DECLS
30
31 /* Get size_t, wchar_t, wint_t and NULL from <stddef.h>.  */
32 #define __need_size_t
33 #define __need_wchar_t
34 #define __need_wint_t
35 #define __need_NULL
36 #include <stddef.h>
37
38
39 /* We try to get wint_t from <stddef.h>, but not all GCC versions define it
40    there.  So define it ourselves if it remains undefined.  */
41 #ifndef _WINT_T
42 /* Integral type unchanged by default argument promotions that can
43    hold any value corresponding to members of the extended character
44    set, as well as at least one value that does not correspond to any
45    member of the extended character set.  */
46 # define _WINT_T
47 typedef unsigned int wint_t;
48 #endif
49
50
51 /* Conversion state information.  */
52 typedef struct
53 {
54   int count;            /* Number of bytes needed for the current character. */
55   wint_t value;         /* Value so far.  */
56 } mbstate_t;
57
58 #ifndef WCHAR_MIN
59 /* These constants might also be defined in <inttypes.h>.  */
60 # define WCHAR_MIN ((wchar_t) 0)
61 # define WCHAR_MAX (~WCHAR_MIN)
62 #endif
63
64 #ifndef WEOF
65 # define WEOF (0xffffffffu)
66 #endif
67
68
69 /* Copy SRC to DEST.  */
70 extern wchar_t *wcscpy __P ((wchar_t *__restrict __dest,
71                              __const wchar_t *__restrict __src));
72 /* Copy no more than N wide-characters of SRC to DEST.  */
73 extern wchar_t *wcsncpy __P ((wchar_t *__restrict __dest,
74                               __const wchar_t *__restrict __src, size_t __n));
75
76 /* Append SRC onto DEST.  */
77 extern wchar_t *wcscat __P ((wchar_t *__restrict __dest,
78                              __const wchar_t *__restrict __src));
79 /* Append no more than N wide-characters of SRC onto DEST.  */
80 extern wchar_t *wcsncat __P ((wchar_t *__restrict __dest,
81                               __const wchar_t *__restrict __src, size_t __n));
82
83 /* Compare S1 and S2.  */
84 extern int wcscmp __P ((__const wchar_t *__s1, __const wchar_t *__s2));
85 /* Compare N wide-characters of S1 and S2.  */
86 extern int wcsncmp __P ((__const wchar_t *__s1, __const wchar_t *__s2,
87                          size_t __n));
88
89 #ifdef __USE_GNU
90 /* Compare S1 and S2, ignoring case.  */
91 extern int __wcscasecmp __P ((__const wchar_t *__s1, __const wchar_t *__s2));
92 extern int wcscasecmp __P ((__const wchar_t *__s1, __const wchar_t *__s2));
93
94 /* Compare no more than N chars of S1 and S2, ignoring case.  */
95 extern int __wcsncasecmp __P ((__const wchar_t *__s1, __const wchar_t *__s2,
96                                size_t __n));
97 extern int wcsncasecmp __P ((__const wchar_t *__s1, __const wchar_t *__s2,
98                              size_t __n));
99
100 /* Similar to the two functions above but take the information from
101    the provided locale and not the global locale.  */
102 # include <xlocale.h>
103
104 extern int __wcscasecmp_l __P ((__const wchar_t *__s1, __const wchar_t *__s2,
105                                 __locale_t __loc));
106
107 extern int __wcsncasecmp_l __P ((__const wchar_t *__s1, __const wchar_t *__s2,
108                                  size_t __n, __locale_t __loc));
109 #endif
110
111 /* Compare S1 and S2, both interpreted as appropriate to the
112    LC_COLLATE category of the current locale.  */
113 extern int wcscoll __P ((__const wchar_t *__s1, __const wchar_t *__s2));
114 /* Transform S2 into array pointed to by S1 such that if wcscmp is
115    applied to two transformed strings the result is the as applying
116    `wcscoll' to the original strings.  */
117 extern size_t wcsxfrm __P ((wchar_t *__restrict __s1,
118                             __const wchar_t *__restrict __s2, size_t __n));
119
120 #ifdef __USE_GNU
121 /* Similar to the two functions above but take the information from
122    the provided locale and not the global locale.  */
123
124 /* Compare S1 and S2, both interpreted as appropriate to the
125    LC_COLLATE category of the given locale.  */
126 extern int __wcscoll_l __P ((__const wchar_t *__s1, __const wchar_t *__s2,
127                              __locale_t __loc));
128 /* Transform S2 into array pointed to by S1 such that if wcscmp is
129    applied to two transformed strings the result is the as applying
130    `wcscoll' to the original strings.  */
131 extern size_t __wcsxfrm_l __P ((wchar_t *__s1, __const wchar_t *__s2,
132                                 size_t __n, __locale_t __loc));
133
134 /* Duplicate S, returning an identical malloc'd string.  */
135 extern wchar_t *wcsdup __P ((__const wchar_t *__s));
136 #endif
137
138 /* Find the first occurrence of WC in WCS.  */
139 extern wchar_t *wcschr __P ((__const wchar_t *__wcs, wchar_t __wc));
140 /* Find the last occurrence of WC in WCS.  */
141 extern wchar_t *wcsrchr __P ((__const wchar_t *__wcs, wchar_t __wc));
142
143 /* Return the length of the initial segmet of WCS which
144    consists entirely of wide characters not in REJECT.  */
145 extern size_t wcscspn __P ((__const wchar_t *__wcs,
146                             __const wchar_t *__reject));
147 /* Return the length of the initial segmet of WCS which
148    consists entirely of wide characters in  ACCEPT.  */
149 extern size_t wcsspn __P ((__const wchar_t *__wcs, __const wchar_t *__accept));
150 /* Find the first occurrence in WCS of any character in ACCEPT.  */
151 extern wchar_t *wcspbrk __P ((__const wchar_t *__wcs,
152                               __const wchar_t *__accept));
153 /* Find the first occurrence of NEEDLE in HAYSTACK.  */
154 extern wchar_t *wcsstr __P ((__const wchar_t *__haystack,
155                              __const wchar_t *__needle));
156 /* Divide WCS into tokens separated by characters in DELIM.  */
157 extern wchar_t *wcstok __P ((wchar_t *__restrict __s,
158                              __const wchar_t *__restrict __delim,
159                              wchar_t **__restrict __ptr));
160
161 /* Return the number of wide characters in S.  */
162 extern size_t wcslen __P ((__const wchar_t *__s));
163
164
165 /* Search N wide characters of S for C.  */
166 extern wchar_t *wmemchr __P ((__const wchar_t *__s, wchar_t __c, size_t __n));
167
168 /* Compare N wide characters of S1 and S2.  */
169 extern int wmemcmp __P ((__const wchar_t *__restrict __s1,
170                          __const wchar_t *__restrict __s2, size_t __n));
171
172 /* Copy N wide characters of SRC to DEST.  */
173 extern wchar_t *wmemcpy __P ((wchar_t *__restrict __s1,
174                               __const wchar_t *__restrict __s2, size_t __n));
175
176 /* Copy N wide characters of SRC to DEST, guaranteeing
177    correct behavior for overlapping strings.  */
178 extern wchar_t *wmemmove __P ((wchar_t *__s1, __const wchar_t *__s2,
179                                size_t __n));
180
181 /* Set N wide characters of S to C.  */
182 extern wchar_t *wmemset __P ((wchar_t *__s, wchar_t __c, size_t __n));
183
184
185 /* Determine whether C constitutes a valid (one-byte) multibyte
186    character.  */
187 extern wint_t btowc __P ((int __c));
188
189 /* Determine whether C corresponds to a member of the extended
190    character set whose multibyte representation is a single byte.  */
191 extern int wctob __P ((wint_t __c));
192
193 /* Determine whether PS points to an object representing the initial
194    state.  */
195 extern int mbsinit __P ((__const mbstate_t *__ps));
196
197 /* Write wide character representation of multibyte character pointed
198    to by S to PWC.  */
199 extern size_t __mbrtowc __P ((wchar_t *__restrict __pwc,
200                               __const char *__restrict __s, size_t __n,
201                               mbstate_t *__restrict __p));
202 extern size_t mbrtowc __P ((wchar_t *__restrict __pwc,
203                             __const char *__restrict __s, size_t __n,
204                             mbstate_t *__p));
205
206 /* Write multibyte representation of wide character WC to S.  */
207 extern size_t __wcrtomb __P ((char *__restrict __s, wchar_t __wc,
208                               mbstate_t *__restrict __ps));
209 extern size_t wcrtomb __P ((char *__restrict __s, wchar_t __wc,
210                             mbstate_t *__restrict __ps));
211
212 /* Return number of bytes in multibyte character pointed to by S.  */
213 extern size_t __mbrlen __P ((__const char *__restrict __s, size_t __n,
214                              mbstate_t *__restrict __ps));
215 extern size_t mbrlen __P ((__const char *__restrict __s, size_t __n,
216                            mbstate_t *__restrict __ps));
217
218 #if defined __OPTIMIZE__ \
219     && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7))
220 /* Define inline function as optimization.  */
221 extern __inline size_t mbrlen (__const char *__restrict __s, size_t __n,
222                                mbstate_t *__restrict __ps)
223 { return (__ps != NULL
224           ? __mbrtowc (NULL, __s, __n, __ps) : __mbrlen (__s, __n, NULL)); }
225 #endif
226
227 /* Write wide character representation of multibyte character string
228    SRC to DST.  */
229 extern size_t __mbsrtowcs __P ((wchar_t *__restrict __dst,
230                                 __const char **__restrict __src,
231                                 size_t __len, mbstate_t *__restrict __ps));
232 extern size_t mbsrtowcs __P ((wchar_t *__restrict __dst,
233                               __const char **__restrict __src,
234                               size_t __len, mbstate_t *__restrict __ps));
235
236 /* Write multibyte character representation of wide character string
237    SRC to DST.  */
238 extern size_t __wcsrtombs __P ((char *__restrict __dst,
239                                 __const wchar_t **__restrict __src,
240                                 size_t __len, mbstate_t *__restrict __ps));
241 extern size_t wcsrtombs __P ((char *__restrict __dst,
242                               __const wchar_t **__restrict __src,
243                               size_t __len, mbstate_t *__restrict __ps));
244
245
246 #ifdef  __USE_GNU
247 /* Write wide character representation of at most NMC bytes of the
248    multibyte character string SRC to DST.  */
249 extern size_t __mbsnrtowcs __P ((wchar_t *__restrict __dst,
250                                  __const char **__restrict __src, size_t __nmc,
251                                  size_t __len, mbstate_t *__restrict __ps));
252 extern size_t mbsnrtowcs __P ((wchar_t *__restrict __dst,
253                                __const char **__restrict __src, size_t __nmc,
254                                size_t __len, mbstate_t *__restrict __ps));
255
256 /* Write multibyte character representation of at most NWC characters
257    from the wide character string SRC to DST.  */
258 extern size_t __wcsnrtombs __P ((char *__restrict __dst,
259                                  __const wchar_t **__restrict __src,
260                                  size_t __nwc, size_t __len,
261                                  mbstate_t *__restrict __ps));
262 extern size_t wcsnrtombs __P ((char *__restrict __dst,
263                                __const wchar_t **__restrict __src,
264                                size_t __nwc, size_t __len,
265                                mbstate_t *__restrict __ps));
266
267
268 /* The following functions are extensions found in X/Open CAE.  */
269
270 /* Determine number of column positions required for C.  */
271 extern int wcwidth __P ((wint_t __c));
272
273 /* Determine number of column positions required for first N wide
274    characters (or fewer if S ends before this) in S.  */
275 extern int wcswidth __P ((__const wchar_t *__s, size_t __n));
276 #endif  /* use GNU */
277
278
279 /* Convert initial portion of the wide string NPTR to `double'
280    representation.  */
281 extern double wcstod __P ((__const wchar_t *__restrict __nptr,
282                            wchar_t **__restrict __endptr));
283
284 #ifdef __USE_GNU
285 /* Likewise for `float' and `long double' sizes of floating-point numbers.  */
286 extern float wcstof __P ((__const wchar_t *__restrict __nptr,
287                           wchar_t **__restrict __endptr));
288 extern __long_double_t wcstold __P ((__const wchar_t *__restrict __nptr,
289                                      wchar_t **__restrict __endptr));
290 #endif /* GNU */
291
292
293 /* Convert initial portion of wide string NPTR to `long int'
294    representation.  */
295 extern long int wcstol __P ((__const wchar_t *__restrict __nptr,
296                              wchar_t **__restrict __endptr, int __base));
297
298 /* Convert initial portion of wide string NPTR to `unsigned long int'
299    representation.  */
300 extern unsigned long int wcstoul __P ((__const wchar_t *__restrict __nptr,
301                                        wchar_t **__restrict __endptr,
302                                        int __base));
303
304 #if defined __GNUC__ && defined __USE_GNU
305 /* Convert initial portion of wide string NPTR to `long int'
306    representation.  */
307 extern long long int wcstoq __P ((__const wchar_t *__restrict __nptr,
308                                   wchar_t **__restrict __endptr, int __base));
309
310 /* Convert initial portion of wide string NPTR to `unsigned long long int'
311    representation.  */
312 extern unsigned long long int wcstouq __P ((__const wchar_t *__restrict __nptr,
313                                             wchar_t **__restrict __endptr,
314                                             int __base));
315 #endif /* GCC and use GNU.  */
316
317 #if defined __USE_ISOC9X || (defined __GNUC__ && defined __USE_GNU)
318 /* Convert initial portion of wide string NPTR to `long int'
319    representation.  */
320 extern long long int wcstoll __P ((__const wchar_t *__restrict __nptr,
321                                    wchar_t **__restrict __endptr, int __base));
322
323 /* Convert initial portion of wide string NPTR to `unsigned long long int'
324    representation.  */
325 extern unsigned long long int wcstoull __P ((__const wchar_t *
326                                              __restrict __nptr,
327                                              wchar_t **__restrict __endptr,
328                                              int __base));
329 #endif /* ISO C 9X or GCC and GNU.  */
330
331 #ifdef __USE_GNU
332 /* The concept of one static locale per category is not very well
333    thought out.  Many applications will need to process its data using
334    information from several different locales.  Another application is
335    the implementation of the internationalization handling in the
336    upcoming ISO C++ standard library.  To support this another set of
337    the functions using locale data exist which have an additional
338    argument.
339
340    Attention: all these functions are *not* standardized in any form.
341    This is a proof-of-concept implementation.  */
342
343 /* Structure for reentrant locale using functions.  This is an
344    (almost) opaque type for the user level programs.  */
345 # include <xlocale.h>
346
347 /* Special versions of the functions above which take the locale to
348    use as an additional parameter.  */
349 extern long int __wcstol_l __P ((__const wchar_t *__restrict __nptr,
350                                  wchar_t **__restrict __endptr, int __base,
351                                  __locale_t __loc));
352
353 extern unsigned long int __wcstoul_l __P ((__const wchar_t *__restrict __nptr,
354                                            wchar_t **__restrict __endptr,
355                                            int __base, __locale_t __loc));
356
357 extern long long int __wcstoll_l __P ((__const wchar_t *__restrict __nptr,
358                                        wchar_t **__restrict __endptr,
359                                        int __base, __locale_t __loc));
360
361 extern unsigned long long int __wcstoull_l __P ((__const wchar_t *__restrict
362                                                  __nptr,
363                                                  wchar_t **__restrict __endptr,
364                                                  int __base,
365                                                  __locale_t __loc));
366
367 extern double __wcstod_l __P ((__const wchar_t *__restrict __nptr,
368                                wchar_t **__restrict __endptr,
369                                __locale_t __loc));
370
371 extern float __wcstof_l __P ((__const wchar_t *__restrict __nptr,
372                               wchar_t **__restrict __endptr,
373                               __locale_t __loc));
374
375 extern __long_double_t __wcstold_l __P ((__const wchar_t *__restrict __nptr,
376                                          wchar_t **__restrict __endptr,
377                                          __locale_t __loc));
378 #endif /* GNU */
379
380
381 /* The internal entry points for `wcstoX' take an extra flag argument
382    saying whether or not to parse locale-dependent number grouping.  */
383 extern double __wcstod_internal __P ((__const wchar_t *__restrict __nptr,
384                                       wchar_t **__restrict __endptr,
385                                       int __group));
386 extern float __wcstof_internal __P ((__const wchar_t *__restrict __nptr,
387                                      wchar_t **__restrict __endptr,
388                                      int __group));
389 extern __long_double_t __wcstold_internal __P ((__const wchar_t *
390                                                 __restrict __nptr,
391                                                 wchar_t **__restrict __endptr,
392                                                 int __group));
393
394 #ifndef __wcstol_internal_defined
395 extern long int __wcstol_internal __P ((__const wchar_t *__restrict __nptr,
396                                         wchar_t **__restrict __endptr,
397                                         int __base, int __group));
398 # define __wcstol_internal_defined      1
399 #endif
400 #ifndef __wcstoul_internal_defined
401 extern unsigned long int __wcstoul_internal __P ((__const wchar_t *
402                                                   __restrict __nptr,
403                                                   wchar_t **
404                                                   __restrict __endptr,
405                                                   int __base, int __group));
406 # define __wcstoul_internal_defined     1
407 #endif
408 #ifndef __wcstoll_internal_defined
409 extern long long int __wcstoll_internal __P ((__const wchar_t *
410                                               __restrict __nptr,
411                                               wchar_t **__restrict __endptr,
412                                               int __base, int __group));
413 # define __wcstoll_internal_defined     1
414 #endif
415 #ifndef __wcstoull_internal_defined
416 extern unsigned long long int __wcstoull_internal __P ((__const wchar_t *
417                                                         __restrict __nptr,
418                                                         wchar_t **
419                                                         __restrict __endptr,
420                                                         int __base,
421                                                         int __group));
422 # define __wcstoull_internal_defined    1
423 #endif
424
425
426 #if defined __OPTIMIZE__ && __GNUC__ >= 2
427 /* Define inline functions which call the internal entry points.  */
428
429 extern __inline double wcstod (__const wchar_t *__restrict __nptr,
430                                wchar_t **__restrict __endptr)
431 { return __wcstod_internal (__nptr, __endptr, 0); }
432 extern __inline long int wcstol (__const wchar_t *__restrict __nptr,
433                                  wchar_t **__restrict __endptr, int __base)
434 { return __wcstol_internal (__nptr, __endptr, __base, 0); }
435 extern __inline unsigned long int wcstoul (__const wchar_t *__restrict __nptr,
436                                            wchar_t **__restrict __endptr,
437                                            int __base)
438 { return __wcstoul_internal (__nptr, __endptr, __base, 0); }
439
440 # ifdef __USE_GNU
441 extern __inline float wcstof (__const wchar_t *__restrict __nptr,
442                               wchar_t **__restrict __endptr)
443 { return __wcstof_internal (__nptr, __endptr, 0); }
444 extern __inline __long_double_t wcstold (__const wchar_t *__restrict __nptr,
445                                          wchar_t **__restrict __endptr)
446 { return __wcstold_internal (__nptr, __endptr, 0); }
447
448
449 extern __inline long long int wcstoq (__const wchar_t *__restrict __nptr,
450                                       wchar_t **__restrict __endptr,
451                                       int __base)
452 { return __wcstoll_internal (__nptr, __endptr, __base, 0); }
453 extern __inline unsigned long long int wcstouq (__const wchar_t *
454                                                 __restrict __nptr,
455                                                 wchar_t **__restrict __endptr,
456                                                 int __base)
457 { return __wcstoull_internal (__nptr, __endptr, __base, 0); }
458 # endif /* Use GNU.  */
459 #endif /* Optimizing GCC >=2.  */
460
461
462 #ifdef  __USE_GNU
463 /* Copy SRC to DEST, returning the address of the terminating L'\0' in
464    DEST.  */
465 extern wchar_t *__wcpcpy __P ((wchar_t *__dest, __const wchar_t *__src));
466 extern wchar_t *wcpcpy __P ((wchar_t *__dest, __const wchar_t *__src));
467
468 /* Copy no more than N characters of SRC to DEST, returning the address of
469    the last character written into DEST.  */
470 extern wchar_t *__wcpncpy __P ((wchar_t *__dest, __const wchar_t *__src,
471                                 size_t __n));
472 extern wchar_t *wcpncpy __P ((wchar_t *__dest, __const wchar_t *__src,
473                               size_t __n));
474 #endif  /* use GNU */
475
476
477 __END_DECLS
478
479 #endif /* wchar.h  */