Get FILE definition for XPG6.
[kopensolaris-gnu/glibc.git] / wcsmbs / wchar.h
1 /* Copyright (C) 1995-1999, 2000, 2001 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 C99 Standard: 7.24
21  *      Extended multibyte and wide character utilities <wchar.h>
22  */
23
24 #ifndef _WCHAR_H
25
26 #ifndef __need_mbstate_t
27 # define _WCHAR_H 1
28 # include <features.h>
29 #endif
30
31 #ifdef _WCHAR_H
32 /* Get FILE definition.  */
33 # define __need___FILE
34 # ifdef __USE_XOPEN2K
35 #  define __need_FILE
36 # endif
37 # include <stdio.h>
38 /* Get va_list definition.  */
39 # define __need___va_list
40 # include <stdarg.h>
41
42 /* Get size_t, wchar_t, wint_t and NULL from <stddef.h>.  */
43 # define __need_size_t
44 # define __need_wchar_t
45 # define __need_NULL
46 #endif
47 #define __need_wint_t
48 #include <stddef.h>
49
50 #include <bits/wchar.h>
51
52 /* We try to get wint_t from <stddef.h>, but not all GCC versions define it
53    there.  So define it ourselves if it remains undefined.  */
54 #ifndef _WINT_T
55 /* Integral type unchanged by default argument promotions that can
56    hold any value corresponding to members of the extended character
57    set, as well as at least one value that does not correspond to any
58    member of the extended character set.  */
59 # define _WINT_T
60 typedef unsigned int wint_t;
61 #endif
62
63
64 #ifndef __mbstate_t_defined
65 # define __mbstate_t_defined    1
66 /* Conversion state information.  */
67 typedef struct
68 {
69   int __count;
70   union
71   {
72     wint_t __wch;
73     char __wchb[4];
74   } __value;            /* Value so far.  */
75 } __mbstate_t;
76 #endif
77 #undef __need_mbstate_t
78
79
80 /* The rest of the file is only used if used if __need_mbstate_t is not
81    defined.  */
82 #ifdef _WCHAR_H
83
84 /* Public type.  */
85 typedef __mbstate_t mbstate_t;
86
87 #ifndef WCHAR_MIN
88 /* These constants might also be defined in <inttypes.h>.  */
89 # define WCHAR_MIN __WCHAR_MIN
90 # define WCHAR_MAX __WCHAR_MAX
91 #endif
92
93 #ifndef WEOF
94 # define WEOF (0xffffffffu)
95 #endif
96
97 /* For XPG4 compliance we have to define the stuff from <wctype.h> here
98    as well.  */
99 #if defined __USE_XOPEN && !defined __USE_UNIX98
100 # include <wctype.h>
101 #endif
102
103 /* This incomplete type is defined in <time.h> but needed here because
104    of `wcsftime'.  */
105 struct tm;
106
107
108 __BEGIN_DECLS
109
110 /* Copy SRC to DEST.  */
111 extern wchar_t *wcscpy (wchar_t *__restrict __dest,
112                         __const wchar_t *__restrict __src) __THROW;
113 /* Copy no more than N wide-characters of SRC to DEST.  */
114 extern wchar_t *wcsncpy (wchar_t *__restrict __dest,
115                          __const wchar_t *__restrict __src, size_t __n)
116      __THROW;
117
118 /* Append SRC onto DEST.  */
119 extern wchar_t *wcscat (wchar_t *__restrict __dest,
120                         __const wchar_t *__restrict __src) __THROW;
121 /* Append no more than N wide-characters of SRC onto DEST.  */
122 extern wchar_t *wcsncat (wchar_t *__restrict __dest,
123                          __const wchar_t *__restrict __src, size_t __n)
124      __THROW;
125
126 /* Compare S1 and S2.  */
127 extern int wcscmp (__const wchar_t *__s1, __const wchar_t *__s2)
128      __THROW __attribute_pure__;
129 /* Compare N wide-characters of S1 and S2.  */
130 extern int wcsncmp (__const wchar_t *__s1, __const wchar_t *__s2, size_t __n)
131      __THROW __attribute_pure__;
132
133 #ifdef __USE_GNU
134 /* Compare S1 and S2, ignoring case.  */
135 extern int wcscasecmp (__const wchar_t *__s1, __const wchar_t *__s2) __THROW;
136
137 /* Compare no more than N chars of S1 and S2, ignoring case.  */
138 extern int wcsncasecmp (__const wchar_t *__s1, __const wchar_t *__s2,
139                         size_t __n) __THROW;
140
141 /* Similar to the two functions above but take the information from
142    the provided locale and not the global locale.  */
143 # include <xlocale.h>
144
145 extern int __wcscasecmp_l (__const wchar_t *__s1, __const wchar_t *__s2,
146                            __locale_t __loc) __THROW;
147
148 extern int __wcsncasecmp_l (__const wchar_t *__s1, __const wchar_t *__s2,
149                             size_t __n, __locale_t __loc) __THROW;
150 #endif
151
152 /* Compare S1 and S2, both interpreted as appropriate to the
153    LC_COLLATE category of the current locale.  */
154 extern int wcscoll (__const wchar_t *__s1, __const wchar_t *__s2) __THROW;
155 /* Transform S2 into array pointed to by S1 such that if wcscmp is
156    applied to two transformed strings the result is the as applying
157    `wcscoll' to the original strings.  */
158 extern size_t wcsxfrm (wchar_t *__restrict __s1,
159                        __const wchar_t *__restrict __s2, size_t __n) __THROW;
160
161 #ifdef __USE_GNU
162 /* Similar to the two functions above but take the information from
163    the provided locale and not the global locale.  */
164
165 /* Compare S1 and S2, both interpreted as appropriate to the
166    LC_COLLATE category of the given locale.  */
167 extern int __wcscoll_l (__const wchar_t *__s1, __const wchar_t *__s2,
168                         __locale_t __loc) __THROW;
169 /* Transform S2 into array pointed to by S1 such that if wcscmp is
170    applied to two transformed strings the result is the as applying
171    `wcscoll' to the original strings.  */
172 extern size_t __wcsxfrm_l (wchar_t *__s1, __const wchar_t *__s2,
173                            size_t __n, __locale_t __loc) __THROW;
174
175 /* Duplicate S, returning an identical malloc'd string.  */
176 extern wchar_t *wcsdup (__const wchar_t *__s) __THROW __attribute_malloc__;
177 #endif
178
179 /* Find the first occurrence of WC in WCS.  */
180 extern wchar_t *wcschr (__const wchar_t *__wcs, wchar_t __wc)
181      __THROW __attribute_pure__;
182 /* Find the last occurrence of WC in WCS.  */
183 extern wchar_t *wcsrchr (__const wchar_t *__wcs, wchar_t __wc)
184      __THROW __attribute_pure__;
185
186 #ifdef __USE_GNU
187 /* This funciton is similar to `wcschr'.  But it returns a pointer to
188    the closing NUL wide character in case C is not found in S.  */
189 extern wchar_t *wcschrnul (__const wchar_t *__s, wchar_t __wc)
190      __THROW __attribute_pure__;
191 #endif
192
193 /* Return the length of the initial segmet of WCS which
194    consists entirely of wide characters not in REJECT.  */
195 extern size_t wcscspn (__const wchar_t *__wcs, __const wchar_t *__reject)
196      __THROW __attribute_pure__;
197 /* Return the length of the initial segmet of WCS which
198    consists entirely of wide characters in  ACCEPT.  */
199 extern size_t wcsspn (__const wchar_t *__wcs, __const wchar_t *__accept)
200      __THROW __attribute_pure__;
201 /* Find the first occurrence in WCS of any character in ACCEPT.  */
202 extern wchar_t *wcspbrk (__const wchar_t *__wcs, __const wchar_t *__accept)
203      __THROW __attribute_pure__;
204 /* Find the first occurrence of NEEDLE in HAYSTACK.  */
205 extern wchar_t *wcsstr (__const wchar_t *__haystack, __const wchar_t *__needle)
206      __THROW __attribute_pure__;
207
208 #ifdef __USE_XOPEN
209 /* Another name for `wcsstr' from XPG4.  */
210 extern wchar_t *wcswcs (__const wchar_t *__haystack, __const wchar_t *__needle)
211      __THROW __attribute_pure__;
212 #endif
213
214 /* Divide WCS into tokens separated by characters in DELIM.  */
215 extern wchar_t *wcstok (wchar_t *__restrict __s,
216                         __const wchar_t *__restrict __delim,
217                         wchar_t **__restrict __ptr) __THROW;
218
219 /* Return the number of wide characters in S.  */
220 extern size_t __wcslen (__const wchar_t *__s) __THROW __attribute_pure__;
221 extern size_t wcslen (__const wchar_t *__s) __THROW __attribute_pure__;
222
223 #ifdef __USE_GNU
224 /* Return the number of wide characters in S, but at most MAXLEN.  */
225 extern size_t wcsnlen (__const wchar_t *__s, size_t __maxlen)
226      __THROW __attribute_pure__;
227 #endif
228
229
230 /* Search N wide characters of S for C.  */
231 extern wchar_t *wmemchr (__const wchar_t *__s, wchar_t __c, size_t __n)
232      __THROW __attribute_pure__;
233
234 /* Compare N wide characters of S1 and S2.  */
235 extern int wmemcmp (__const wchar_t *__restrict __s1,
236                     __const wchar_t *__restrict __s2, size_t __n)
237      __THROW __attribute_pure__;
238
239 /* Copy N wide characters of SRC to DEST.  */
240 extern wchar_t *wmemcpy (wchar_t *__restrict __s1,
241                          __const wchar_t *__restrict __s2, size_t __n) __THROW;
242
243 /* Copy N wide characters of SRC to DEST, guaranteeing
244    correct behavior for overlapping strings.  */
245 extern wchar_t *wmemmove (wchar_t *__s1, __const wchar_t *__s2, size_t __n)
246      __THROW;
247
248 /* Set N wide characters of S to C.  */
249 extern wchar_t *wmemset (wchar_t *__s, wchar_t __c, size_t __n) __THROW;
250
251 #ifdef __USE_GNU
252 /* Copy N wide characters of SRC to DEST and return pointer to following
253    wide character.  */
254 extern wchar_t *wmempcpy (wchar_t *__restrict __s1,
255                           __const wchar_t *__restrict __s2, size_t __n)
256      __THROW;
257 #endif
258
259
260 /* Determine whether C constitutes a valid (one-byte) multibyte
261    character.  */
262 extern wint_t btowc (int __c) __THROW;
263
264 /* Determine whether C corresponds to a member of the extended
265    character set whose multibyte representation is a single byte.  */
266 extern int wctob (wint_t __c) __THROW;
267
268 /* Determine whether PS points to an object representing the initial
269    state.  */
270 extern int mbsinit (__const mbstate_t *__ps) __THROW;
271
272 /* Write wide character representation of multibyte character pointed
273    to by S to PWC.  */
274 extern size_t mbrtowc (wchar_t *__restrict __pwc,
275                        __const char *__restrict __s, size_t __n,
276                        mbstate_t *__p) __THROW;
277
278 /* Write multibyte representation of wide character WC to S.  */
279 extern size_t wcrtomb (char *__restrict __s, wchar_t __wc,
280                        mbstate_t *__restrict __ps) __THROW;
281
282 /* Return number of bytes in multibyte character pointed to by S.  */
283 extern size_t __mbrlen (__const char *__restrict __s, size_t __n,
284                         mbstate_t *__restrict __ps) __THROW;
285 extern size_t mbrlen (__const char *__restrict __s, size_t __n,
286                       mbstate_t *__restrict __ps) __THROW;
287
288 #if defined __OPTIMIZE__ && !defined __OPTIMIZE_SIZE__ \
289     && defined __USE_EXTERN_INLINES
290 /* Define inline function as optimization.  */
291 extern __inline size_t mbrlen (__const char *__restrict __s, size_t __n,
292                                mbstate_t *__restrict __ps) __THROW
293 { return (__ps != NULL
294           ? mbrtowc (NULL, __s, __n, __ps) : __mbrlen (__s, __n, NULL)); }
295 #endif
296
297 /* Write wide character representation of multibyte character string
298    SRC to DST.  */
299 extern size_t mbsrtowcs (wchar_t *__restrict __dst,
300                          __const char **__restrict __src, size_t __len,
301                          mbstate_t *__restrict __ps) __THROW;
302
303 /* Write multibyte character representation of wide character string
304    SRC to DST.  */
305 extern size_t wcsrtombs (char *__restrict __dst,
306                          __const wchar_t **__restrict __src, size_t __len,
307                          mbstate_t *__restrict __ps) __THROW;
308
309
310 #ifdef  __USE_GNU
311 /* Write wide character representation of at most NMC bytes of the
312    multibyte character string SRC to DST.  */
313 extern size_t mbsnrtowcs (wchar_t *__restrict __dst,
314                           __const char **__restrict __src, size_t __nmc,
315                           size_t __len, mbstate_t *__restrict __ps) __THROW;
316
317 /* Write multibyte character representation of at most NWC characters
318    from the wide character string SRC to DST.  */
319 extern size_t wcsnrtombs (char *__restrict __dst,
320                           __const wchar_t **__restrict __src,
321                           size_t __nwc, size_t __len,
322                           mbstate_t *__restrict __ps) __THROW;
323 #endif  /* use GNU */
324
325
326 /* The following functions are extensions found in X/Open CAE.  */
327 #ifdef __USE_XOPEN
328 /* Determine number of column positions required for C.  */
329 extern int wcwidth (wint_t __c) __THROW;
330
331 /* Determine number of column positions required for first N wide
332    characters (or fewer if S ends before this) in S.  */
333 extern int wcswidth (__const wchar_t *__s, size_t __n) __THROW;
334 #endif  /* Use X/Open.  */
335
336
337 /* Convert initial portion of the wide string NPTR to `double'
338    representation.  */
339 extern double wcstod (__const wchar_t *__restrict __nptr,
340                       wchar_t **__restrict __endptr) __THROW;
341
342 #ifdef __USE_ISOC99
343 /* Likewise for `float' and `long double' sizes of floating-point numbers.  */
344 extern float wcstof (__const wchar_t *__restrict __nptr,
345                      wchar_t **__restrict __endptr) __THROW;
346 extern long double wcstold (__const wchar_t *__restrict __nptr,
347                             wchar_t **__restrict __endptr) __THROW;
348 #endif /* C99 */
349
350
351 /* Convert initial portion of wide string NPTR to `long int'
352    representation.  */
353 extern long int wcstol (__const wchar_t *__restrict __nptr,
354                         wchar_t **__restrict __endptr, int __base) __THROW;
355
356 /* Convert initial portion of wide string NPTR to `unsigned long int'
357    representation.  */
358 extern unsigned long int wcstoul (__const wchar_t *__restrict __nptr,
359                                   wchar_t **__restrict __endptr, int __base)
360      __THROW;
361
362 #if defined __GNUC__ && defined __USE_GNU
363 /* Convert initial portion of wide string NPTR to `long int'
364    representation.  */
365 __extension__
366 extern long long int wcstoq (__const wchar_t *__restrict __nptr,
367                              wchar_t **__restrict __endptr, int __base)
368      __THROW;
369
370 /* Convert initial portion of wide string NPTR to `unsigned long long int'
371    representation.  */
372 __extension__
373 extern unsigned long long int wcstouq (__const wchar_t *__restrict __nptr,
374                                        wchar_t **__restrict __endptr,
375                                        int __base) __THROW;
376 #endif /* GCC and use GNU.  */
377
378 #if defined __USE_ISOC99 || (defined __GNUC__ && defined __USE_GNU)
379 /* Convert initial portion of wide string NPTR to `long int'
380    representation.  */
381 __extension__
382 extern long long int wcstoll (__const wchar_t *__restrict __nptr,
383                               wchar_t **__restrict __endptr, int __base)
384      __THROW;
385
386 /* Convert initial portion of wide string NPTR to `unsigned long long int'
387    representation.  */
388 __extension__
389 extern unsigned long long int wcstoull (__const wchar_t *__restrict __nptr,
390                                         wchar_t **__restrict __endptr,
391                                         int __base) __THROW;
392 #endif /* ISO C99 or GCC and GNU.  */
393
394 #ifdef __USE_GNU
395 /* The concept of one static locale per category is not very well
396    thought out.  Many applications will need to process its data using
397    information from several different locales.  Another application is
398    the implementation of the internationalization handling in the
399    upcoming ISO C++ standard library.  To support this another set of
400    the functions using locale data exist which have an additional
401    argument.
402
403    Attention: all these functions are *not* standardized in any form.
404    This is a proof-of-concept implementation.  */
405
406 /* Structure for reentrant locale using functions.  This is an
407    (almost) opaque type for the user level programs.  */
408 # include <xlocale.h>
409
410 /* Special versions of the functions above which take the locale to
411    use as an additional parameter.  */
412 extern long int __wcstol_l (__const wchar_t *__restrict __nptr,
413                             wchar_t **__restrict __endptr, int __base,
414                             __locale_t __loc) __THROW;
415
416 extern unsigned long int __wcstoul_l (__const wchar_t *__restrict __nptr,
417                                       wchar_t **__restrict __endptr,
418                                       int __base, __locale_t __loc) __THROW;
419
420 __extension__
421 extern long long int __wcstoll_l (__const wchar_t *__restrict __nptr,
422                                   wchar_t **__restrict __endptr,
423                                   int __base, __locale_t __loc) __THROW;
424
425 __extension__
426 extern unsigned long long int __wcstoull_l (__const wchar_t *__restrict __nptr,
427                                             wchar_t **__restrict __endptr,
428                                             int __base, __locale_t __loc)
429      __THROW;
430
431 extern double __wcstod_l (__const wchar_t *__restrict __nptr,
432                           wchar_t **__restrict __endptr, __locale_t __loc)
433      __THROW;
434
435 extern float __wcstof_l (__const wchar_t *__restrict __nptr,
436                          wchar_t **__restrict __endptr, __locale_t __loc)
437      __THROW;
438
439 extern long double __wcstold_l (__const wchar_t *__restrict __nptr,
440                                 wchar_t **__restrict __endptr,
441                                 __locale_t __loc) __THROW;
442 #endif /* GNU */
443
444
445 /* The internal entry points for `wcstoX' take an extra flag argument
446    saying whether or not to parse locale-dependent number grouping.  */
447 extern double __wcstod_internal (__const wchar_t *__restrict __nptr,
448                                  wchar_t **__restrict __endptr, int __group)
449      __THROW;
450 extern float __wcstof_internal (__const wchar_t *__restrict __nptr,
451                                 wchar_t **__restrict __endptr, int __group)
452      __THROW;
453 extern long double __wcstold_internal (__const wchar_t *__restrict __nptr,
454                                        wchar_t **__restrict __endptr,
455                                        int __group) __THROW;
456
457 #ifndef __wcstol_internal_defined
458 extern long int __wcstol_internal (__const wchar_t *__restrict __nptr,
459                                    wchar_t **__restrict __endptr,
460                                    int __base, int __group) __THROW;
461 # define __wcstol_internal_defined      1
462 #endif
463 #ifndef __wcstoul_internal_defined
464 extern unsigned long int __wcstoul_internal (__const wchar_t *__restrict __npt,
465                                              wchar_t **__restrict __endptr,
466                                              int __base, int __group) __THROW;
467 # define __wcstoul_internal_defined     1
468 #endif
469 #ifndef __wcstoll_internal_defined
470 __extension__
471 extern long long int __wcstoll_internal (__const wchar_t *__restrict __nptr,
472                                          wchar_t **__restrict __endptr,
473                                          int __base, int __group) __THROW;
474 # define __wcstoll_internal_defined     1
475 #endif
476 #ifndef __wcstoull_internal_defined
477 __extension__
478 extern unsigned long long int __wcstoull_internal (__const wchar_t *
479                                                    __restrict __nptr,
480                                                    wchar_t **
481                                                    __restrict __endptr,
482                                                    int __base,
483                                                    int __group) __THROW;
484 # define __wcstoull_internal_defined    1
485 #endif
486
487
488 #if defined __OPTIMIZE__ && __GNUC__ >= 2
489 /* Define inline functions which call the internal entry points.  */
490
491 extern __inline double wcstod (__const wchar_t *__restrict __nptr,
492                                wchar_t **__restrict __endptr) __THROW
493 { return __wcstod_internal (__nptr, __endptr, 0); }
494 extern __inline long int wcstol (__const wchar_t *__restrict __nptr,
495                                  wchar_t **__restrict __endptr,
496                                  int __base) __THROW
497 { return __wcstol_internal (__nptr, __endptr, __base, 0); }
498 extern __inline unsigned long int wcstoul (__const wchar_t *__restrict __nptr,
499                                            wchar_t **__restrict __endptr,
500                                            int __base) __THROW
501 { return __wcstoul_internal (__nptr, __endptr, __base, 0); }
502
503 # ifdef __USE_GNU
504 extern __inline float wcstof (__const wchar_t *__restrict __nptr,
505                               wchar_t **__restrict __endptr) __THROW
506 { return __wcstof_internal (__nptr, __endptr, 0); }
507 extern __inline long double wcstold (__const wchar_t *__restrict __nptr,
508                                      wchar_t **__restrict __endptr) __THROW
509 { return __wcstold_internal (__nptr, __endptr, 0); }
510
511
512 __extension__
513 extern __inline long long int wcstoq (__const wchar_t *__restrict __nptr,
514                                       wchar_t **__restrict __endptr,
515                                       int __base) __THROW
516 { return __wcstoll_internal (__nptr, __endptr, __base, 0); }
517 __extension__
518 extern __inline unsigned long long int wcstouq (__const wchar_t *
519                                                 __restrict __nptr,
520                                                 wchar_t **__restrict __endptr,
521                                                 int __base) __THROW
522 { return __wcstoull_internal (__nptr, __endptr, __base, 0); }
523 # endif /* Use GNU.  */
524 #endif /* Optimizing GCC >=2.  */
525
526
527 #ifdef  __USE_GNU
528 /* Copy SRC to DEST, returning the address of the terminating L'\0' in
529    DEST.  */
530 extern wchar_t *wcpcpy (wchar_t *__dest, __const wchar_t *__src) __THROW;
531
532 /* Copy no more than N characters of SRC to DEST, returning the address of
533    the last character written into DEST.  */
534 extern wchar_t *wcpncpy (wchar_t *__dest, __const wchar_t *__src, size_t __n)
535      __THROW;
536 #endif  /* use GNU */
537
538
539 /* Wide character I/O functions.  */
540 #if defined __USE_ISOC99 || defined __USE_UNIX98
541
542 /* Select orientation for stream.  */
543 extern int fwide (__FILE *__fp, int __mode) __THROW;
544
545
546 /* Write formatted output to STREAM.  */
547 extern int fwprintf (__FILE *__restrict __stream,
548                      __const wchar_t *__restrict __format, ...)
549      __THROW /* __attribute__ ((__format__ (__wprintf__, 2, 3))) */;
550 /* Write formatted output to stdout.  */
551 extern int wprintf (__const wchar_t *__restrict __format, ...)
552      __THROW /* __attribute__ ((__format__ (__wprintf__, 1, 2))) */;
553 /* Write formatted output of at most N characters to S.  */
554 extern int swprintf (wchar_t *__restrict __s, size_t __n,
555                      __const wchar_t *__restrict __format, ...)
556      __THROW /* __attribute__ ((__format__ (__wprintf__, 3, 4))) */;
557
558 /* Write formatted output to S from argument list ARG.  */
559 extern int vfwprintf (__FILE *__restrict __s,
560                       __const wchar_t *__restrict __format,
561                       __gnuc_va_list __arg)
562      __THROW /* __attribute__ ((__format__ (__wprintf__, 2, 0))) */;
563 /* Write formatted output to stdout from argument list ARG.  */
564 extern int vwprintf (__const wchar_t *__restrict __format,
565                      __gnuc_va_list __arg)
566      __THROW /* __attribute__ ((__format__ (__wprintf__, 1, 0))) */;
567 /* Write formatted output of at most N character to S from argument
568    list ARG.  */
569 extern int vswprintf (wchar_t *__restrict __s, size_t __n,
570                       __const wchar_t *__restrict __format,
571                       __gnuc_va_list __arg)
572      __THROW /* __attribute__ ((__format__ (__wprintf__, 3, 0))) */;
573
574
575 /* Read formatted input from STREAM.  */
576 extern int fwscanf (__FILE *__restrict __stream,
577                     __const wchar_t *__restrict __format, ...)
578      __THROW /* __attribute__ ((__format__ (__wscanf__, 2, 3))) */;
579 /* Read formatted input from stdin.  */
580 extern int wscanf (__const wchar_t *__restrict __format, ...)
581      __THROW /* __attribute__ ((__format__ (__wscanf__, 1, 2))) */;
582 /* Read formatted input from S.  */
583 extern int swscanf (__const wchar_t *__restrict __s,
584                     __const wchar_t *__restrict __format, ...)
585      __THROW /* __attribute__ ((__format__ (__wscanf__, 2, 3))) */;
586 #endif /* Use ISO C99 and Unix98. */
587
588 #ifdef __USE_ISOC99
589 /* Read formatted input from S into argument list ARG.  */
590 extern int vfwscanf (__FILE *__restrict __s,
591                      __const wchar_t *__restrict __format,
592                      __gnuc_va_list __arg)
593      __THROW /* __attribute__ ((__format__ (__wscanf__, 2, 0))) */;
594 /* Read formatted input from stdin into argument list ARG.  */
595 extern int vwscanf (__const wchar_t *__restrict __format,
596                     __gnuc_va_list __arg)
597      __THROW /* __attribute__ ((__format__ (__wscanf__, 1, 0))) */;
598 /* Read formatted input from S into argument list ARG.  */
599 extern int vswscanf (__const wchar_t *__restrict __s,
600                      __const wchar_t *__restrict __format,
601                      __gnuc_va_list __arg)
602      __THROW /* __attribute__ ((__format__ (__wscanf__, 2, 0))) */;
603 #endif /* Use ISO C99. */
604
605
606 /* Read a character from STREAM.  */
607 extern wint_t fgetwc (__FILE *__stream);
608 extern wint_t getwc (__FILE *__stream);
609
610 /* Read a character from stdin.  */
611 extern wint_t getwchar (void);
612
613
614 /* Write a character to STREAM.  */
615 extern wint_t fputwc (wchar_t __wc, __FILE *__stream);
616 extern wint_t putwc (wchar_t __wc, __FILE *__stream);
617
618 /* Write a character to stdout.  */
619 extern wint_t putwchar (wchar_t __wc);
620
621
622 /* Get a newline-terminated wide character string of finite length
623    from STREAM.  */
624 extern wchar_t *fgetws (wchar_t *__restrict __ws, int __n,
625                         __FILE *__restrict __stream);
626
627 /* Write a string to STREAM.  */
628 extern int fputws (__const wchar_t *__restrict __ws,
629                    __FILE *__restrict __stream);
630
631
632 /* Push a character back onto the input buffer of STREAM.  */
633 extern wint_t ungetwc (wint_t __wc, __FILE *__stream);
634
635
636 #ifdef __USE_GNU
637 /* These are defined to be equivalent to the `char' functions defined
638    in POSIX.1:1996.  */
639 extern wint_t getwc_unlocked (__FILE *__stream);
640 extern wint_t getwchar_unlocked (void);
641
642 /* This is the wide character version of a GNU extension.  */
643 extern wint_t fgetwc_unlocked (__FILE *__stream);
644
645 /* Faster version when locking is not necessary.  */
646 extern wint_t fputwc_unlocked (wchar_t __wc, __FILE *__stream);
647
648 /* These are defined to be equivalent to the `char' functions defined
649    in POSIX.1:1996.  */
650 extern wint_t putwc_unlocked (wchar_t __wc, __FILE *__stream);
651 extern wint_t putwchar_unlocked (wchar_t __wc);
652
653
654 /* This function does the same as `fgetws' but does not lock the stream.  */
655 extern wchar_t *fgetws_unlocked (wchar_t *__restrict __ws, int __n,
656                                  __FILE *__restrict __stream);
657
658 /* This function does the same as `fputws' but does not lock the stream.  */
659 extern int fputws_unlocked (__const wchar_t *__restrict __ws,
660                             __FILE *__restrict __stream);
661 #endif
662
663
664 /* Format TP into S according to FORMAT.
665    Write no more than MAXSIZE wide characters and return the number
666    of wide characters written, or 0 if it would exceed MAXSIZE.  */
667 extern size_t wcsftime (wchar_t *__restrict __s, size_t __maxsize,
668                         __const wchar_t *__restrict __format,
669                         __const struct tm *__restrict __tp);
670
671 /* The X/Open standard demands that most of the functions defined in
672    the <wctype.h> header must also appear here.  This is probably
673    because some X/Open members wrote their implementation before the
674    ISO C standard was published and introduced the better solution.
675    We have to provide these definitions for compliance reasons but we
676    do this nonsense only if really necessary.  */
677 #if defined __USE_UNIX98 && !defined __USE_GNU
678 # define __need_iswxxx
679 # include <wctype.h>
680 #endif
681
682 __END_DECLS
683
684 #endif  /* _WCHAR_H defined */
685
686 #endif /* wchar.h  */