Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/waterbox/libc/includes/stdio.h
2 views
1
/* Input/output <stdio.h>
2
3
This file is part of the Public Domain C Library (PDCLib).
4
Permission is granted to use, modify, and / or redistribute at will.
5
*/
6
7
#ifndef _PDCLIB_STDIO_H
8
#define _PDCLIB_STDIO_H _PDCLIB_STDIO_H
9
#include "_PDCLIB_int.h"
10
11
#ifdef __cplusplus
12
extern "C" {
13
#endif
14
15
#ifndef _PDCLIB_SIZE_T_DEFINED
16
#define _PDCLIB_SIZE_T_DEFINED _PDCLIB_SIZE_T_DEFINED
17
typedef _PDCLIB_size_t size_t;
18
#endif
19
20
#ifndef _PDCLIB_NULL_DEFINED
21
#define _PDCLIB_NULL_DEFINED _PDCLIB_NULL_DEFINED
22
#define NULL _PDCLIB_NULL
23
#endif
24
25
/* See setvbuf(), third argument */
26
#define _IOFBF 1
27
#define _IOLBF 2
28
#define _IONBF 4
29
30
/* The following are platform-dependant, and defined in _PDCLIB_config.h. */
31
typedef _PDCLIB_fpos_t fpos_t;
32
typedef _PDCLIB_file_t FILE;
33
#define EOF -1
34
#define BUFSIZ _PDCLIB_BUFSIZ
35
#define FOPEN_MAX _PDCLIB_FOPEN_MAX
36
#define FILENAME_MAX _PDCLIB_FILENAME_MAX
37
#define L_tmpnam _PDCLIB_L_tmpnam
38
#define TMP_MAX _PDCLIB_TMP_MAX
39
40
/* See fseek(), third argument
41
*
42
* Some system headers (e.g. windows) also define the SEEK_* values. Check for
43
* this and validate that they're the same value
44
*/
45
#if !defined(SEEK_CUR)
46
#define SEEK_CUR _PDCLIB_SEEK_CUR
47
#elif SEEK_CUR != _PDCLIB_SEEK_CUR
48
#error SEEK_CUR != _PDCLIB_SEEK_CUR
49
#endif
50
51
#if !defined(SEEK_END)
52
#define SEEK_END _PDCLIB_SEEK_END
53
#elif SEEK_END != _PDCLIB_SEEK_END
54
#error SEEK_END != _PDCLIB_SEEK_END
55
#endif
56
57
#if !defined(SEEK_SET)
58
#define SEEK_SET _PDCLIB_SEEK_SET
59
#elif SEEK_SET != _PDCLIB_SEEK_SET
60
#error SEEK_SET != _PDCLIB_SEEK_SET
61
#endif
62
63
extern FILE * stdin;
64
extern FILE * stdout;
65
extern FILE * stderr;
66
67
/* Operations on files */
68
69
/* Remove the given file.
70
Returns zero if successful, non-zero otherwise.
71
This implementation does detect if a file of that name is currently open,
72
and fails the remove in this case. This does not detect two distinct names
73
that merely result in the same file (e.g. "/home/user/foo" vs. "~/foo").
74
*/
75
int remove( const char * filename ) _PDCLIB_nothrow;
76
77
/* Rename the given old file to the given new name.
78
Returns zero if successful, non-zero otherwise.
79
This implementation does detect if the old filename corresponds to an open
80
file, and fails the rename in this case.
81
If there already is a file with the new filename, behaviour is defined by
82
the glue code (see functions/_PDCLIB/rename.c).
83
*/
84
int rename( const char * old, const char * newn ) _PDCLIB_nothrow;
85
86
/* Open a temporary file with mode "wb+", i.e. binary-update. Remove the file
87
automatically if it is closed or the program exits normally (by returning
88
from main() or calling exit()).
89
Returns a pointer to a FILE handle for this file.
90
This implementation does not remove temporary files if the process aborts
91
abnormally (e.g. abort()).
92
*/
93
FILE * tmpfile( void ) _PDCLIB_nothrow;
94
95
/* Generate a file name that is not equal to any existing filename AT THE TIME
96
OF GENERATION. Generate a different name each time it is called.
97
Returns a pointer to an internal static buffer containing the filename if s
98
is a NULL pointer. (This is not thread-safe!)
99
Returns s if it is not a NULL pointer (s is then assumed to point to an array
100
of at least L_tmpnam characters).
101
Returns NULL if unable to generate a suitable name (because all possible
102
names already exist, or the function has been called TMP_MAX times already).
103
Note that this implementation cannot guarantee a file of the name generated
104
is not generated between the call to this function and a subsequent fopen().
105
*/
106
char * tmpnam( char * s ) _PDCLIB_nothrow;
107
108
/* File access functions */
109
110
/* Close the file associated with the given stream (after flushing its buffers).
111
Returns zero if successful, EOF if any errors occur.
112
*/
113
int fclose( FILE * stream ) _PDCLIB_nothrow;
114
115
/* Flush the buffers of the given output stream. If the stream is an input
116
stream, or an update stream with the last operation being an input operation,
117
behaviour is undefined.
118
If stream is a NULL pointer, perform the buffer flushing for all applicable
119
streams.
120
Returns zero if successful, EOF if a write error occurs.
121
Sets the error indicator of the stream if a write error occurs.
122
*/
123
int fflush( FILE * stream ) _PDCLIB_nothrow;
124
125
/* Open the file with the given filename in the given mode, and return a stream
126
handle for it in which error and end-of-file indicator are cleared. Defined
127
values for mode are:
128
129
READ MODES
130
text files binary files
131
without update "r" "rb"
132
with update "r+" "rb+" or "r+b"
133
134
Opening in read mode fails if no file with the given filename exists, or if
135
cannot be read.
136
137
WRITE MODES
138
text files binary files
139
without update "w" "wb"
140
with update "w+" "wb+" or "w+b"
141
142
With write modes, if a file with the given filename already exists, it is
143
truncated to zero length.
144
145
APPEND MODES
146
text files binary files
147
without update "a" "ab"
148
with update "a+" "ab+" or "a+b"
149
150
With update modes, if a file with the given filename already exists, it is
151
not truncated to zero length, but all writes are forced to end-of-file (this
152
regardless to fseek() calls). Note that binary files opened in append mode
153
might have their end-of-file padded with '\0' characters.
154
155
Update modes mean that both input and output functions can be performed on
156
the stream, but output must be terminated with a call to either fflush(),
157
fseek(), fsetpos(), or rewind() before input is performed, and input must
158
be terminated with a call to either fseek(), fsetpos(), or rewind() before
159
output is performed, unless input encountered end-of-file.
160
161
If a text file is opened with update mode, the implementation is at liberty
162
to open a binary stream instead. This implementation honors the exact mode
163
given.
164
165
The stream is fully buffered if and only if it can be determined not to
166
refer to an interactive device.
167
168
If the mode string begins with but is longer than one of the above sequences
169
the implementation is at liberty to ignore the additional characters, or do
170
implementation-defined things. This implementation only accepts the exact
171
modes above.
172
173
Returns a pointer to the stream handle if successfull, NULL otherwise.
174
*/
175
FILE * fopen( const char * _PDCLIB_restrict filename,
176
const char * _PDCLIB_restrict mode ) _PDCLIB_nothrow;
177
178
/* Creates a stream connected to the file descriptor \p fd with mode \p mode.
179
Mode must match the mode with which the file descriptor was opened.
180
*/
181
FILE * _PDCLIB_fvopen( _PDCLIB_fd_t fd, const _PDCLIB_fileops_t * ops,
182
int mode, const char * filename ) _PDCLIB_nothrow;
183
184
/* Close any file currently associated with the given stream. Open the file
185
identified by the given filename with the given mode (equivalent to fopen()),
186
and associate it with the given stream. If filename is a NULL pointer,
187
attempt to change the mode of the given stream.
188
This implementation allows any mode changes on "real" files, and associating
189
of the standard streams with files. It does *not* support mode changes on
190
standard streams.
191
(Primary use of this function is to redirect stdin, stdout, and stderr.)
192
*/
193
FILE * freopen( const char * _PDCLIB_restrict filename, const char * _PDCLIB_restrict mode, FILE * _PDCLIB_restrict stream ) _PDCLIB_nothrow;
194
195
/* If buf is a NULL pointer, call setvbuf( stream, NULL, _IONBF, BUFSIZ ).
196
If buf is not a NULL pointer, call setvbuf( stream, buf, _IOFBF, BUFSIZ ).
197
*/
198
void setbuf( FILE * _PDCLIB_restrict stream, char * _PDCLIB_restrict buf ) _PDCLIB_nothrow;
199
200
/* Set the given stream to the given buffering mode. If buf is not a NULL
201
pointer, use buf as file buffer (of given size). If buf is a NULL pointer,
202
use a buffer of given size allocated internally. _IONBF causes unbuffered
203
behaviour, _IOLBF causes line-buffered behaviour, _IOFBF causes fully
204
buffered behaviour. Calling this function is only valid right after a file is
205
opened, and before any other operation (except for any unsuccessful calls to
206
setvbuf()) has been performed.
207
Returns zero if successful, nonzero otherwise.
208
*/
209
int setvbuf( FILE * _PDCLIB_restrict stream, char * _PDCLIB_restrict buf, int mode, size_t size ) _PDCLIB_nothrow;
210
211
/* Formatted input/output functions */
212
213
/*
214
Write output to the given stream, as defined by the given format string and
215
0..n subsequent arguments (the argument stack).
216
217
The format string is written to the given stream verbatim, except for any
218
conversion specifiers included, which start with the letter '%' and are
219
documented below. If the given conversion specifiers require more arguments
220
from the argument stack than provided, behaviour is undefined. Additional
221
arguments not required by conversion specifiers are evaluated but otherwise
222
ignored.
223
224
(The standard specifies the format string is allowed to contain multibyte
225
character sequences as long as it starts and ends in initial shift state,
226
but this is not yet supported by this implementation, which interprets the
227
format string as sequence of char.)
228
TODO: Add multibyte support to printf() functions.
229
230
A conversion specifier consists of:
231
- Zero or more flags (one of the characters "-+ #0").
232
- Optional minimum field width as decimal integer. Default is padding to the
233
left, using spaces. Note that 0 is taken as a flag, not the beginning of a
234
field width. Note also that a small field width will not result in the
235
truncation of a value.
236
- Optional precision (given as ".#" with # being a decimal integer),
237
specifying:
238
- the min. number of digits to appear (diouxX),
239
- the max. number of digits after the decimal point (aAeEfF),
240
- the max. number of significant digits (gG),
241
- the max. number of bytes to be written (s).
242
- behaviour with other conversion specifiers is undefined.
243
- Optional length modifier specifying the size of the argument (one of "hh",
244
"ll", or one of the characters "hljztL").
245
- Conversion specifier character specifying the type of conversion to be
246
applied (and the type of the next argument from the argument stack). One
247
of the characters "diouxXfFeEgGaAcspn%".
248
249
Minimum field width and/or precision may be given as asterisk ('*') instead
250
of a decimal integer. In this case, the next argument from the argument
251
stack is assumed to be an int value specifying the width / precision. A
252
negative field width is interpreted as flag '-' followed by a positive field
253
width. A negative precision is interpreted as if no precision was given.
254
255
FLAGS
256
- Left-justify the conversion result within its field width.
257
+ Prefix a '+' on positive signed conversion results. Prefix a '-' on
258
floating conversions resulting in negative zero, or negative values
259
rounding to zero.
260
space Prefix a space on positive signed conversion results, or if a signed
261
conversion results in no characters. If both '+' and ' ' are given,
262
' ' is ignored.
263
# Use an "alternative form" for
264
- 'o' conversion, increasing precision until the first digit of the
265
result is a zero;
266
- 'x' or 'X' conversion, prefixing "0x" or "0X" to nonzero results;
267
- "aAeEfF" conversions, always printing a decimal point even if no
268
digits are following;
269
- 'g' or 'G' conversions, always printing a decimal point even if no
270
digits are following, and not removing trailing zeroes.
271
- behaviour for other conversions is unspecified.
272
0 Use leading zeroes instead of spaces for field width padding. If both
273
'-' and '0' are given, '0' is ignored. If a precision is specified for
274
any of the "diouxX" conversions, '0' is ignored. Behaviour is only
275
defined for "diouxXaAeEfFgG".
276
277
LENGTH MODIFIERS
278
hh For "diouxX" conversions, the argument from the argument stack is
279
assumed to be of char width. (It will have been subject to integer
280
promotion but will be converted back.) For 'n' conversions, the argument
281
is assumed to be a pointer to signed char.
282
h For "diouxX" conversions, the argument from the argument stack is
283
assumed to be of short int width. (It will have been subject to integer
284
promotion but will be converted back.) For 'n' conversions, the argument
285
is assumed to be a pointer to short int.
286
l For "diouxX" conversions, the argument from the argument stack is
287
assumed to be of long int width. For 'n' conversions, the argument is
288
assumed to be a pointer to short int. For 'c' conversions, the argument
289
is assumed to be a wint_t. For 's' conversions, the argument is assumed
290
to be a pointer to wchar_t. No effect on "aAeEfFgG" conversions.
291
ll For "diouxX" conversions, the argument from the argument stack is
292
assumed to be of long long int width. For 'n' conversions, the argument
293
is assumed to be a pointer to long long int.
294
j For "diouxX" conversions, the argument from the argument stack is
295
assumed to be of intmax_t width. For 'n' conversions, the argument is
296
assumed to be a pointer to intmax_t.
297
z For "diouxX" conversions, the argument from the argument stack is
298
assumed to be of size_t width. For 'n' conversions, the argument is
299
assumed to be a pointer to size_t.
300
t For "diouxX" conversions, the argument from the argument stack is
301
assumed to be of ptrdiff_t width. For 'n' conversions, the argument is
302
assumed to be a pointer to ptrdiff_t.
303
L For "aAeEfFgG" conversions, the argument from the argument stack is
304
assumed to be a long double.
305
Length modifiers appearing for any conversions not mentioned above will have
306
undefined behaviour.
307
If a length modifier appears with any conversion specifier other than as
308
specified above, the behavior is undefined.
309
310
CONVERSION SPECIFIERS
311
d,i The argument from the argument stack is assumed to be of type int, and
312
is converted to a signed decimal value with a minimum number of digits
313
as specified by the precision (default 1), padded with leading zeroes.
314
A zero value converted with precision zero yields no output.
315
o The argument from the argument stack is assumed to be of type unsigned
316
int, and is converted to an unsigned octal value, other behaviour being
317
as above.
318
u The argument from the argument stack is assumed to be of type unsigned
319
int, and converted to an unsigned decimal value, other behaviour being
320
as above.
321
x,X The argument from the argument stack is assumed to be of type unsigned
322
int, and converted to an unsigned hexadecimal value, using lowercase
323
"abcdef" for 'x' and uppercase "ABCDEF" for 'X' conversion, other
324
behaviour being as above.
325
f,F The argument from the argument stack is assumed to be of type double,
326
and converted to a decimal floating point in decimal-point notation,
327
with the number of digits after the decimal point as specified by the
328
precision (default 6) and the value being rounded appropriately. If
329
precision is zero (and the '#' flag is not given), no decimal point is
330
printed. At least one digit is always printed before the decimal point.
331
For 'f' conversions, an infinity value is printed as either [-]inf or
332
[-]infinity (, depending on the configuration of this implementation. A
333
NaN value is printed as [-]nan. For 'F' conversions uppercase characters
334
are used for these special values. The flags '-', '+' and ' ' apply as
335
usual to these special values, '#' and '0' have no effect.
336
e,E The argument from the argument stack is assumed to be of type double,
337
and converted to a decimal floating point in normalized exponential
338
notation ([?]d.ddd edd). "Normalized" means one nonzero digit before
339
the decimal point, unless the value is zero. The number of digits after
340
the decimal point is specified by the precision (default 6), the value
341
being rounded appropriately. If precision is zero (and the '#' flag is
342
not given), no decimal point is printed. The exponent has at least two
343
digits, and not more than necessary to represent the exponent. If the
344
value is zero, the exponent is zero. The 'e' written to indicate the
345
exponend is uppercase for 'E' conversions.
346
Infinity or NaN values are represented as for 'f' and 'F' conversions,
347
respectively.
348
g,G The argument from the argument stack is assumed to be of type double,
349
and converted according to either 'f' or 'e' format for 'g' conversions,
350
or 'F' or 'E' format for 'G' conversions, respectively, with the actual
351
conversion chosen depending on the value. 'e' / 'E' conversion is chosen
352
if the resulting exponent is < -4 or >= the precision (default 1).
353
Trailing zeroes are removed (unless the '#' flag is given). A decimal
354
point appears only if followed by a digit.
355
Infinity or NaN values are represented as for 'f' and 'F' conversions,
356
respectively.
357
a,A The argument from the argument stack is assumed to be of type double,
358
and converted to a floating point hexadecimal notation ([?]0xh.hhhh pd)
359
with one hexadecimal digit (being nonzero if the value is normalized,
360
and otherwise unspecified) before the decimal point, and the number of
361
digits after the decimal point being specified by the precision. If no
362
precision is given, the default is to print as many digits as nevessary
363
to give an exact representation of the value (if FLT_RADIX is a power of
364
2). If no precision is given and FLT_RADIX is not a power of 2, the
365
default is to print as many digits to distinguish values of type double
366
(possibly omitting trailing zeroes). (A precision p is sufficient to
367
distinguish values of the source type if 16^p-1 > b^n where b is
368
FLT_RADIX and n is the number of digits in the significand (to base b)
369
of the source type. A smaller p might suffice depending on the
370
implementation's scheme for determining the digit to the left of the
371
decimal point.) The error has the correct sign for the current rounding
372
direction.
373
Unless the '#' flag is given, no decimal-point is given for zero
374
precision.
375
The 'a' conversion uses lowercase "abcdef", "0x" and 'p', the 'A'
376
conversion uppercase "ABCDEF", "0X" and 'P'.
377
The exponent always has at least one digit, and not more than necessary
378
to represent the decimal exponent of 2. If the value is zero, the
379
exponent is zero.
380
Infinity or NaN values are represented as for 'f' and 'F' conversions,
381
respectively.
382
Binary implementations are at liberty to chose the hexadecimal digit to
383
the left of the decimal point so that subsequent digits align to nibble
384
boundaries.
385
c The argument from the argument stack is assumed to be of type int, and
386
converted to a character after the value has been cast to unsigned char.
387
If the 'l' length modifier is given, the argument is assumed to be of
388
type wint_t, and converted as by a "%ls" conversion with no precision
389
and a pointer to a two-element wchar_t array, with the first element
390
being the wint_t argument and the second a '\0' wide character.
391
s The argument from the argument stack is assumed to be a char array (i.e.
392
pointer to char). Characters from that array are printed until a zero
393
byte is encountered or as many bytes as specified by a given precision
394
have been written.
395
If the l length modifier is given, the argument from the argument stack
396
is assumed to be a wchar_t array (i.e. pointer to wchar_t). Wide
397
characters from that array are converted to multibyte characters as by
398
calls to wcrtomb() (using a mbstate_t object initialized to zero prior
399
to the first conversion), up to and including the terminating null wide
400
character. The resulting multibyte character sequence is then printed up
401
to but not including the terminating null character. If a precision is
402
given, it specifies the maximum number of bytes to be written (including
403
shift sequences). If the given precision would require access to a wide
404
character one past the end of the array, the array shall contain a '\0'
405
wide character. In no case is a partial multibyte character written.
406
Redundant shift sequences may result if the multibyte characters have a
407
state-dependent encoding.
408
TODO: Clarify these statements regarding %ls.
409
p The argument from the argument stack is assumed to be a void pointer,
410
and converted to a sequence of printing characters in an implementation-
411
defined manner.
412
This implementation casts the pointer to type intptr_t, and prints the
413
value as if a %#x conversion specifier was given.
414
n The argument from the argument stack is assumed to be a pointer to a
415
signed integer, into which the number of characters written so far by
416
this call to fprintf is stored. The behaviour, should any flags, field
417
widths, or precisions be given is undefined.
418
% A verbatim '%' character is written. No argument is taken from the
419
argument stack.
420
421
Returns the number of characters written if successful, a negative value
422
otherwise.
423
*/
424
int fprintf( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow;
425
426
/* TODO: fscanf() documentation */
427
/*
428
Read input from a given stream, as defined by the given format string, and
429
store converted input in the objects pointed to by 0..n subsequent arguments
430
(the argument stack).
431
432
The format string contains a sequence of directives that are expected to
433
match the input. If such a directive fails to match, the function returns
434
(matching error). It also returns if an input error occurs (input error).
435
436
Directives can be:
437
- one or more whitespaces, matching any number of whitespaces in the input;
438
- printing characters, matching the input verbatim;
439
- conversion specifications, which convert an input sequence into a value as
440
defined by the individual specifier, and store that value in a memory
441
location pointed to by the next pointer on the argument stack. Details are
442
documented below. If there is an insufficient number of pointers on the
443
argument stack, behaviour is undefined. Additional arguments not required
444
by any conversion specifications are evaluated, but otherwise ignored.
445
446
(The standard specifies the format string is allowed to contain multibyte
447
character sequences as long as it starts and ends in initial shift state,
448
but this is not yet supported by this implementation, which interprets the
449
format string as sequence of char.)
450
TODO: Add multibyte support to scanf() functions.
451
452
A conversion specifier consists of:
453
- Optional assignment-suppressing character ('*') that makes the conversion
454
read input as usual, but does not assign the conversion result.
455
- Optional maximum field width as decimal integer.
456
- Optional length modifier specifying the size of the argument (one of "hh",
457
"ll", or one of the characters "hljztL").
458
- Conversion specifier character specifying the type of conversion to be
459
applied (and the type of the next argument from the argument stack). One
460
of the characters "diouxXaAeEfFgGcs[pn%".
461
462
LENGTH MODIFIERS
463
hh For "diouxXn" conversions, the next pointer from the argument stack is
464
assumed to point to a variable of of char width.
465
h For "diouxXn" conversions, the next pointer from the argument stack is
466
assumed to point to a variable of short int width.
467
l For "diouxXn" conversions, the next pointer from the argument stack is
468
assumed to point to a variable of long int width.
469
For "aAeEfFgG" conversions, it is assumed to point to a variable of type
470
double.
471
For "cs[" conversions, it is assumed to point to a variable of type
472
wchar_t.
473
ll For "diouxXn" conversions, the next pointer from the argument stack is
474
assumed to point to a variable of long long int width.
475
j For "diouxXn" conversions, the next pointer from the argument stack is
476
assumed to point to a variable of intmax_t width.
477
z For "diouxXn" conversions, the next pointer from the argument stack is
478
assumed to point to a variable of size_t width.
479
t For "diouxXn" conversions, the next pointer from the argument stack is
480
assumed to point to a variable of ptrdiff_t width.
481
L For "aAeEfFgG" conversions, the next pointer from the argument stack is
482
assumed to point to a variable of type long double.
483
Length modifiers appearing for any conversions not mentioned above will have
484
undefined behaviour.
485
If a length modifier appears with any conversion specifier other than as
486
specified above, the behavior is undefined.
487
488
CONVERSION SPECIFIERS
489
d Matches an (optionally signed) decimal integer of the format expected
490
by strtol() with base 10. The next pointer from the argument stack is
491
assumed to point to a signed integer.
492
i Matches an (optionally signed) integer of the format expected by
493
strtol() with base 0. The next pointer from the argument stack is
494
assumed to point to a signed integer.
495
o Matches an (optionally signed) octal integer of the format expected by
496
strtoul() with base 8. The next pointer from the argument stack is
497
assumed to point to an unsigned integer.
498
u Matches an (optionally signed) decimal integer of the format expected
499
by strtoul() with base 10. The next pointer from the argument stack is
500
assumed to point to an unsigned integer.
501
x Matches an (optionally signed) hexadecimal integer of the format
502
expected by strtoul() with base 16. The next pointer from the argument
503
stack is assumed to point to an unsigned integer.
504
aefg Matches an (optionally signed) floating point number, infinity, or not-
505
a-number-value of the format expected by strtod(). The next pointer
506
from the argument stack is assumed to point to a float.
507
c Matches a number of characters as specified by the field width (default
508
1). The next pointer from the argument stack is assumed to point to a
509
character array large enough to hold that many characters.
510
If the 'l' length modifier is given, the input is assumed to match a
511
sequence of multibyte characters (starting in the initial shift state),
512
which will be converted to a wide character sequence as by successive
513
calls to mbrtowc() with a mbstate_t object initialized to zero prior to
514
the first conversion. The next pointer from the argument stack is
515
assumed to point to a wchar_t array large enough to hold that many
516
characters.
517
In either case, note that no '\0' character is added to terminate the
518
sequence.
519
s Matches a sequence of non-white-space characters. The next pointer from
520
the argument stack is assumed to point to a character array large
521
enough to hold the sequence including terminating '\0' character.
522
If the 'l' length modifier is given, the input is assumed to match a
523
sequence of multibyte characters (starting in the initial shift state),
524
which will be converted to a wide character sequence as by a call to
525
mbrtowc() with a mbstate_t object initialized to zero prior to the
526
first conversion. The next pointer from the argument stack is assumed
527
to point to a wchar_t array large enough to hold the sequence including
528
terminating '\0' character.
529
[ Matches a nonempty sequence consisting of any of those characters
530
specified between itself and a corresponding closing bracket (']').
531
If the first character in the list is a circumflex ('^'), this matches
532
a nonempty sequence consisting of any characters NOT specified. If the
533
closing bracket appears as the first character in the scanset ("[]" or
534
"[^]", it is assumed to belong to the scanset, which then ends with the
535
NEXT closing bracket.
536
If there is a '-' character in the scanset which is not the first after
537
the opening bracket (or the circumflex, see above) or the last in the
538
scanset, behaviour is implementation-defined. This implementation
539
handles this character like any other.
540
541
The extend of the input field is determined byte-by-byte for the above
542
conversions ('c', 's', '['), with no special provisions being made for
543
multibyte characters. The resulting field is nevertheless a multibyte
544
sequence begining in intial shift state.
545
546
p Matches a sequence of characters as produced by the printf() "%p"
547
conversion. The next pointer from the argument stack is assumed to
548
point to a void pointer, which will be filled with the same location
549
as the pointer used in the printf() statement. Note that behaviour is
550
undefined if the input value is not the result of an earlier printf()
551
call.
552
n Does not read input. The next pointer from the argument stack is
553
assumed to point to a signed integer, into which the number of
554
characters read from input so far by this call to fscanf() is stored.
555
This does not affect the return value of fscanf(). The behaviour,
556
should an assignment-supressing character of field width be given,
557
is undefined.
558
This can be used to test the success of literal matches and suppressed
559
assignments.
560
% Matches a single, verbatim '%' character.
561
562
A, E, F, G and X are valid, and equivalent to their lowercase counterparts.
563
564
All conversions except [, c, or n imply that whitespace characters from the
565
input stream are consumed until a non-whitespace character is encountered.
566
Such whitespaces do not count against a maximum field width.
567
568
Conversions push at most one character back into the input stream. That
569
implies that some character sequences converted by the strtol() and strtod()
570
function families are not converted identically by the scnaf() function
571
family.
572
573
Returns the number of input items successfully assigned. This can be zero if
574
an early mismatch occurs. Returns EOF if an input failure occurs before the
575
first conversion.
576
*/
577
int fscanf( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow;
578
579
/* Equivalent to fprintf( stdout, format, ... ). */
580
int printf( const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow;
581
582
/* Equivalent to fscanf( stdin, format, ... ). */
583
int scanf( const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow;
584
585
/* Equivalent to fprintf( stdout, format, ... ), except that the result is
586
written into the buffer pointed to by s, instead of stdout, and that any
587
characters beyond the (n-1)th are discarded. The (n)th character is
588
replaced by a '\0' character in this case.
589
Returns the number of characters that would have been written (not counting
590
the terminating '\0' character) if n had been sufficiently large, if
591
successful, and a negative number if an encoding error ocurred.
592
*/
593
int snprintf( char * _PDCLIB_restrict s, size_t n, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow;
594
595
/* Equivalent to fprintf( stdout, format, ... ), except that the result is
596
written into the buffer pointed to by s, instead of stdout.
597
*/
598
int sprintf( char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow;
599
600
/* Equivalent to fscanf( stdin, format, ... ), except that the input is read
601
from the buffer pointed to by s, instead of stdin.
602
*/
603
int sscanf( const char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow;
604
605
/* Equivalent to fprintf( stream, format, ... ), except that the argument stack
606
is passed as va_list parameter. Note that va_list is not declared by
607
<stdio.h>.
608
*/
609
int vfprintf( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow;
610
611
/* Equivalent to fscanf( stream, format, ... ), except that the argument stack
612
is passed as va_list parameter. Note that va_list is not declared by
613
<stdio.h>.
614
*/
615
int vfscanf( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow;
616
617
/* Equivalent to fprintf( stdout, format, ... ), except that the argument stack
618
is passed as va_list parameter. Note that va_list is not declared by
619
<stdio.h>.
620
*/
621
int vprintf( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow;
622
623
/* Equivalent to fscanf( stdin, format, ... ), except that the argument stack
624
is passed as va_list parameter. Note that va_list is not declared by
625
<stdio.h>.
626
*/
627
int vscanf( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow;
628
629
/* Equivalent to snprintf( s, n, format, ... ), except that the argument stack
630
is passed as va_list parameter. Note that va_list is not declared by
631
<stdio.h>.
632
*/
633
int vsnprintf( char * _PDCLIB_restrict s, size_t n, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow;
634
635
/* Equivalent to fprintf( stdout, format, ... ), except that the argument stack
636
is passed as va_list parameter, and the result is written to the buffer
637
pointed to by s, instead of stdout. Note that va_list is not declared by
638
<stdio.h>.
639
*/
640
int vsprintf( char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow;
641
642
/* Equivalent to fscanf( stdin, format, ... ), except that the argument stack
643
is passed as va_list parameter, and the input is read from the buffer
644
pointed to by s, instead of stdin. Note that va_list is not declared by
645
<stdio.h>.
646
*/
647
int vsscanf( const char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow;
648
649
int asprintf(char **strp, const char * _PDCLIB_restrict fmt, ...) _PDCLIB_nothrow;
650
int vasprintf(char **strp, const char * _PDCLIB_restrict fmt, _PDCLIB_va_list arg) _PDCLIB_nothrow;
651
652
/* Character input/output functions */
653
654
/* Retrieve the next character from given stream.
655
Returns the character, EOF otherwise.
656
If end-of-file is reached, the EOF indicator of the stream is set.
657
If a read error occurs, the error indicator of the stream is set.
658
*/
659
int fgetc( FILE * stream ) _PDCLIB_nothrow;
660
661
/* Read at most n-1 characters from given stream into the array s, stopping at
662
\n or EOF. Terminate the read string with \n. If EOF is encountered before
663
any characters are read, leave the contents of s unchanged.
664
Returns s if successful, NULL otherwise.
665
If a read error occurs, the error indicator of the stream is set. In this
666
case, the contents of s are indeterminate.
667
*/
668
char * fgets( char * _PDCLIB_restrict s, int n, FILE * _PDCLIB_restrict stream ) _PDCLIB_nothrow;
669
670
/* Write the value c (cast to unsigned char) to the given stream.
671
Returns c if successful, EOF otherwise.
672
If a write error occurs, sets the error indicator of the stream is set.
673
*/
674
int fputc( int c, FILE * stream ) _PDCLIB_nothrow;
675
676
/* Write the string s (not including the terminating \0) to the given stream.
677
Returns a value >=0 if successful, EOF otherwise.
678
This implementation does set the error indicator of the stream if a write
679
error occurs.
680
*/
681
int fputs( const char * _PDCLIB_restrict s, FILE * _PDCLIB_restrict stream ) _PDCLIB_nothrow;
682
683
/* Equivalent to fgetc( stream ), but may be overloaded by a macro that
684
evaluates its parameter more than once.
685
*/
686
int getc( FILE * stream ) _PDCLIB_nothrow;
687
688
/* Equivalent to fgetc( stdin ). */
689
int getchar( void ) _PDCLIB_nothrow;
690
691
#if _PDCLIB_C_MAX(1999)
692
/* Read characters from given stream into the array s, stopping at \n or EOF.
693
The string read is terminated with \0. Returns s if successful. If EOF is
694
encountered before any characters are read, the contents of s are unchanged,
695
and NULL is returned. If a read error occurs, the contents of s are indeter-
696
minate, and NULL is returned.
697
698
This function is dangerous and has been a great source of security
699
vulnerabilities. Do not use it. It was removed by C11.
700
*/
701
char * gets( char * s ) _PDCLIB_DEPRECATED _PDCLIB_nothrow;
702
#endif
703
704
/* Equivalent to fputc( c, stream ), but may be overloaded by a macro that
705
evaluates its parameter more than once.
706
*/
707
int putc( int c, FILE * stream ) _PDCLIB_nothrow;
708
709
/* Equivalent to fputc( c, stdout ), but may be overloaded by a macro that
710
evaluates its parameter more than once.
711
*/
712
int putchar( int c ) _PDCLIB_nothrow;
713
714
/* Write the string s (not including the terminating \0) to stdout, and append
715
a newline to the output. Returns a value >= 0 when successful, EOF if a
716
write error occurred.
717
*/
718
int puts( const char * s ) _PDCLIB_nothrow;
719
720
/* Push the value c (cast to unsigned char) back onto the given (input) stream.
721
A character pushed back in this way will be delivered by subsequent read
722
operations (and skipped by subsequent file positioning operations) as if it
723
has not been read. The external representation of the stream is unaffected
724
by this pushback (it is a buffer operation). One character of pushback is
725
guaranteed, further pushbacks may fail. EOF as value for c does not change
726
the input stream and results in failure of the function.
727
For text files, the file position indicator is indeterminate until all
728
pushed-back characters are read. For binary files, the file position
729
indicator is decremented by each successful call of ungetc(). If the file
730
position indicator for a binary file was zero before the call of ungetc(),
731
behaviour is undefined. (Older versions of the library allowed such a call.)
732
Returns the pushed-back character if successful, EOF if it fails.
733
*/
734
int ungetc( int c, FILE * stream ) _PDCLIB_nothrow;
735
736
/* Direct input/output functions */
737
738
/* Read up to nmemb elements of given size from given stream into the buffer
739
pointed to by ptr. Returns the number of elements successfully read, which
740
may be less than nmemb if a read error or EOF is encountered. If a read
741
error is encountered, the value of the file position indicator is
742
indeterminate. If a partial element is read, its value is indeterminate.
743
If size or nmemb are zero, the function does nothing and returns zero.
744
*/
745
size_t fread( void * _PDCLIB_restrict ptr, size_t size, size_t nmemb, FILE * _PDCLIB_restrict stream ) _PDCLIB_nothrow;
746
747
/* Write up to nmemb elements of given size from buffer pointed to by ptr to
748
the given stream. Returns the number of elements successfully written, which
749
will be less than nmemb only if a write error is encountered. If a write
750
error is encountered, the value of the file position indicator is
751
indeterminate. If size or nmemb are zero, the function does nothing and
752
returns zero.
753
*/
754
size_t fwrite( const void * _PDCLIB_restrict ptr, size_t size, size_t nmemb, FILE * _PDCLIB_restrict stream ) _PDCLIB_nothrow;
755
756
/* File positioning functions */
757
758
/* Store the current position indicator (and, where appropriate, the current
759
mbstate_t status object) for the given stream into the given pos object. The
760
actual contents of the object are unspecified, but it can be used as second
761
parameter to fsetpos() to reposition the stream to the exact position and
762
parse state at the time fgetpos() was called.
763
Returns zero if successful, nonzero otherwise.
764
TODO: Implementation-defined errno setting for fgetpos().
765
*/
766
int fgetpos( FILE * _PDCLIB_restrict stream, fpos_t * _PDCLIB_restrict pos ) _PDCLIB_nothrow;
767
768
/* Set the position indicator for the given stream to the given offset from:
769
- the beginning of the file if whence is SEEK_SET,
770
- the current value of the position indicator if whence is SEEK_CUR,
771
- end-of-file if whence is SEEK_END.
772
On text streams, non-zero offsets are only allowed with SEEK_SET, and must
773
have been returned by ftell() for the same file.
774
Any characters buffered by ungetc() are dropped, the end-of-file indicator
775
for the stream is cleared. If the given stream is an update stream, the next
776
operation after a successful fseek() may be either input or output.
777
Returns zero if successful, nonzero otherwise. If a read/write error occurs,
778
the error indicator for the given stream is set.
779
*/
780
int fseek( FILE * stream, long int offset, int whence ) _PDCLIB_nothrow;
781
782
/* Set the position indicator (and, where appropriate the mbstate_t status
783
object) for the given stream to the given pos object (created by an earlier
784
call to fgetpos() on the same file).
785
Any characters buffered by ungetc() are dropped, the end-of-file indicator
786
for the stream is cleared. If the given stream is an update stream, the next
787
operation after a successful fsetpos() may be either input or output.
788
Returns zero if successful, nonzero otherwise. If a read/write error occurs,
789
the error indicator for the given stream is set.
790
TODO: Implementation-defined errno setting for fsetpos().
791
*/
792
int fsetpos( FILE * stream, const fpos_t * pos ) _PDCLIB_nothrow;
793
794
/* Return the current offset of the given stream from the beginning of the
795
associated file. For text streams, the exact value returned is unspecified
796
(and may not be equal to the number of characters), but may be used in
797
subsequent calls to fseek().
798
Returns -1L if unsuccessful.
799
TODO: Implementation-defined errno setting for ftell().
800
*/
801
long int ftell( FILE * stream ) _PDCLIB_nothrow;
802
803
/* Equivalent to (void)fseek( stream, 0L, SEEK_SET ), except that the error
804
indicator for the stream is also cleared.
805
*/
806
void rewind( FILE * stream ) _PDCLIB_nothrow;
807
808
/* Error-handling functions */
809
810
/* Clear the end-of-file and error indicators for the given stream. */
811
void clearerr( FILE * stream ) _PDCLIB_nothrow;
812
813
/* Return zero if the end-of-file indicator for the given stream is not set,
814
nonzero otherwise.
815
*/
816
int feof( FILE * stream ) _PDCLIB_nothrow;
817
818
/* Return zero if the error indicator for the given stream is not set, nonzero
819
otherwise.
820
*/
821
int ferror( FILE * stream ) _PDCLIB_nothrow;
822
823
/* If s is neither a NULL pointer nor an empty string, print the string to
824
stderr (with appended colon (':') and a space) first. In any case, print an
825
error message depending on the current value of errno (being the same as if
826
strerror( errno ) had been called).
827
*/
828
void perror( const char * s ) _PDCLIB_nothrow;
829
830
/* Unlocked I/O
831
*
832
* Since threading was introduced in C11, FILE objects have had implicit locks
833
* to prevent data races and inconsistent output.
834
*
835
* PDCLib provides these functions from POSIX as an extension in order to enable
836
* users to access the underlying unlocked functions.
837
*
838
* For each function defined in C11 where an _unlocked variant is defined below,
839
* the behaviour of the _unlocked variant is the same except that it will not
840
* take the lock associated with the stream.
841
*
842
* flockfile, ftrylockfile and funlockfile can be used to manually manipulate
843
* the stream locks. The behaviour of the _unlocked functions if called when the
844
* stream isn't locked by the calling thread is implementation defined.
845
*/
846
#if _PDCLIB_POSIX_MIN(200112L) || _PDCLIB_BSD_SOURCE || _PDCLIB_SVID_SOURCE
847
void flockfile(FILE *file) _PDCLIB_nothrow;
848
int ftrylockfile(FILE *file) _PDCLIB_nothrow;
849
void funlockfile(FILE *file) _PDCLIB_nothrow;
850
851
int getc_unlocked(FILE *stream) _PDCLIB_nothrow;
852
int getchar_unlocked(void) _PDCLIB_nothrow;
853
int putc_unlocked(int c, FILE *stream) _PDCLIB_nothrow;
854
int putchar_unlocked(int c) _PDCLIB_nothrow;
855
#endif
856
857
#if _PDCLIB_BSD_SOURCE || _PDCLIB_SVID_SOURCE
858
void clearerr_unlocked(FILE *stream) _PDCLIB_nothrow;
859
int feof_unlocked(FILE *stream) _PDCLIB_nothrow;
860
int ferror_unlocked(FILE *stream) _PDCLIB_nothrow;
861
int fflush_unlocked(FILE *stream) _PDCLIB_nothrow;
862
int fgetc_unlocked(FILE *stream) _PDCLIB_nothrow;
863
int fputc_unlocked(int c, FILE *stream) _PDCLIB_nothrow;
864
size_t fread_unlocked(void *ptr, size_t size, size_t n, FILE *stream) _PDCLIB_nothrow;
865
size_t fwrite_unlocked(const void *ptr, size_t size, size_t n, FILE *stream) _PDCLIB_nothrow;
866
#endif
867
868
#if _PDCLIB_GNU_SOURCE
869
char *fgets_unlocked(char *s, int n, FILE *stream) _PDCLIB_nothrow;
870
int fputs_unlocked(const char *s, FILE *stream) _PDCLIB_nothrow;
871
#endif
872
873
#if _PDCLIB_EXTENSIONS
874
int _vcbprintf(
875
void *p,
876
_PDCLIB_size_t ( *cb ) ( void *p, const char *buf, _PDCLIB_size_t size ),
877
const char *format,
878
_PDCLIB_va_list arg );
879
880
int _cbprintf(
881
void *p,
882
size_t ( *cb ) ( void *p, const char *buf, size_t size ),
883
const char *format,
884
... );
885
886
int fgetpos_unlocked( FILE * _PDCLIB_restrict stream, fpos_t * _PDCLIB_restrict pos ) _PDCLIB_nothrow;
887
int fsetpos_unlocked( FILE * stream, const fpos_t * pos ) _PDCLIB_nothrow;
888
long int ftell_unlocked( FILE * stream ) _PDCLIB_nothrow;
889
int fseek_unlocked( FILE * stream, long int offset, int whence ) _PDCLIB_nothrow;
890
void rewind_unlocked( FILE * stream ) _PDCLIB_nothrow;
891
892
int puts_unlocked( const char * s ) _PDCLIB_nothrow;
893
int ungetc_unlocked( int c, FILE * stream ) _PDCLIB_nothrow;
894
895
int printf_unlocked( const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow;
896
int vprintf_unlocked( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow;
897
int fprintf_unlocked( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow;
898
int vfprintf_unlocked( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow;
899
int scanf_unlocked( const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow;
900
int vscanf_unlocked( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow;
901
int fscanf_unlocked( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow;
902
int vfscanf_unlocked( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow;
903
904
// Todo: remove prefix?
905
_PDCLIB_uint_fast64_t _PDCLIB_ftell64( FILE * stream ) _PDCLIB_nothrow;
906
_PDCLIB_uint_fast64_t _PDCLIB_ftell64_unlocked( FILE * stream ) _PDCLIB_nothrow;
907
#endif
908
909
#ifdef __cplusplus
910
}
911
#endif
912
913
#endif
914
915