]> pd.if.org Git - pdclib/blob - includes/stdio.h
Temporary proof-of-concept for printf() output conversions.
[pdclib] / includes / stdio.h
1 /* $Id$ */
2
3 /* Input/output <stdio.h>
4
5    This file is part of the Public Domain C Library (PDCLib).
6    Permission is granted to use, modify, and / or redistribute at will.
7 */
8
9 #ifndef _PDCLIB_STDIO_H
10 #define _PDCLIB_STDIO_H _PDCLIB_STDIO_H
11
12 #ifndef _PDCLIB_INT_H
13 #define _PDCLIB_INT_H _PDCLIB_INT_H
14 #include <_PDCLIB_int.h>
15 #endif
16
17 #ifndef _PDCLIB_SIZE_T_DEFINED
18 #define _PDCLIB_SIZE_T_DEFINED _PDCLIB_SIZE_T_DEFINED
19 typedef _PDCLIB_size_t size_t;
20 #endif
21
22 #ifndef _PDCLIB_NULL_DEFINED
23 #define _PDCLIB_NULL_DEFINED _PDCLIB_NULL_DEFINED
24 #define NULL _PDCLIB_NULL
25 #endif
26
27 /* See setvbuf(), third argument */
28 #define _IOFBF 2
29 #define _IOLBF 1
30 #define _IONBF 0
31
32 /* The following are platform-dependant, and defined in _PDCLIB_config.h. */
33 typedef _PDCLIB_fpos_t        fpos_t;
34 typedef struct _PDCLIB_file_t FILE;
35 #define EOF -1
36 #define BUFSIZ _PDCLIB_BUFSIZ
37 #define FOPEN_MAX _PDCLIB_FOPEN_MAX
38 #define FILENAME_MAX _PDCLIB_FILENAME_MAX
39 #define L_tmpnam _PDCLIB_L_tmpnam
40 #define TMP_MAX _PDCLIB_TMP_MAX
41
42 /* See fseek(), third argument */
43 #define SEEK_CUR 1
44 #define SEEK_END 2
45 #define SEEK_SET 4
46
47 /* Operations on files */
48
49 /* Remove the given file.
50    Returns zero if successful, non-zero otherwise.
51    This implementation does detect if the filename corresponds to an open file,
52    and closes it before attempting the rename.
53 */
54 int remove( const char * filename );
55
56 /* Rename the given old file to the given new name.
57    Returns zero if successful, non-zero otherwise. 
58    This implementation does detect if the old filename corresponds to an open
59    file, and closes it before attempting the rename.
60    If the already is a file with the new filename, behaviour is defined by the
61    OS.
62 */
63 int rename( const char * old, const char * new );
64
65 /* Open a temporary file with mode "wb+", i.e. binary-update. Remove the file
66    automatically if it is closed or the program exits normally (by returning
67    from main() or calling exit()).
68    Returns a pointer to a FILE handle for this file.
69    This implementation does not remove temporary files if the process aborts
70    abnormally (e.g. abort()).
71 */
72 FILE * tmpfile( void );
73
74 /* Generate a file name that is not equal to any existing filename AT THE TIME
75    OF GENERATION. Generate a different name each time it is called.
76    Returns a pointer to an internal static buffer containing the filename if s
77    is a NULL pointer. (This is not thread-safe!)
78    Returns s if it is not a NULL pointer (s is then assumed to point to an array
79    of at least L_tmpnam characters).
80    Returns NULL if unable to generate a suitable name (because all possible
81    names already exist, or the function has been called TMP_MAX times already).
82    Note that this implementation cannot guarantee a file of the name generated
83    is not generated between the call to this function and a subsequent fopen().
84 */
85 char * tmpnam( char * s );
86
87 /* File access functions */
88
89 /* Close the file associated with the given stream (after flushing its buffers).
90    Returns zero if successful, EOF if any errors occur.
91 */
92 int fclose( FILE * stream );
93
94 /* Flush the buffers of the given output stream. If the stream is an input
95    stream, or an update stream with the last operation being an input operation,
96    behaviour is undefined.
97    If stream is a NULL pointer, perform the buffer flushing for all applicable
98    streams.
99    Returns zero if successful, EOF if a write error occurs.
100    Sets the error indicator of the stream if a write error occurs.
101 */
102 int fflush( FILE * stream );
103
104 /* Open the file with the given filename in the given mode, and return a stream
105    handle for it in which error and end-of-file indicator are cleared. Defined
106    values for mode are:
107
108    READ MODES
109                       text files        binary files
110    without update     "r"               "rb"
111    with update        "r+"              "rb+" or "r+b"
112
113    Opening in read mode fails if no file with the given filename exists, or if
114    cannot be read.
115
116    WRITE MODES
117                       text files        binary files
118    without update     "w"               "wb"
119    with update        "w+"              "wb+" or "w+b"
120
121    With write modes, if a file with the given filename already exists, it is
122    truncated to zero length.
123
124    APPEND MODES
125                       text files        binary files
126    without update     "a"               "ab"
127    with update        "a+"              "ab+" or "a+b"
128
129    With update modes, if a file with the given filename already exists, it is
130    not truncated to zero length, but all writes are forced to end-of-file (this
131    regardless to fseek() calls). Note that binary files opened in append mode
132    might have their end-of-file padded with '\0' characters.
133
134    Update modes mean that both input and output functions can be performed on
135    the stream, but output must be terminated with a call to either fflush(),
136    fseek(), fsetpos(), or rewind() before input is performed, and input must
137    be terminated with a call to either fseek(), fsetpos(), or rewind() before
138    output is performed, unless input encountered end-of-file.
139
140    If a text file is opened with update mode, the implementation is at liberty
141    to open a binary stream instead. This implementation honors the exact mode
142    given.
143
144    The stream is fully buffered if and only if it can be determined not to
145    refer to an interactive device. As the generic code of this implementation
146    cannot determine this, _IOLBF (line buffering) is used for all streams.
147
148    If the mode string begins with but is longer than one of the above sequences
149    the implementation is at liberty to ignore the additional characters, or do
150    implementation-defined things. This implementation only accepts the exact
151    modes above.
152
153    Returns a pointer to the stream handle if successfull, NULL otherwise.
154 */
155 FILE * fopen( const char * _PDCLIB_restrict filename, const char * _PDCLIB_restrict mode );
156
157 /* Close any file currently associated with the given stream. Open the file
158    identified by the given filename with the given mode (equivalent to fopen()),
159    and associate it with the given stream. If filename is a NULL pointer,
160    attempt to change the mode of the given stream.
161    This implementation allows the following mode changes: TODO
162    (Primary use of this function is to redirect stdin, stdout, and stderr.)
163 */
164 FILE * freopen( const char * _PDCLIB_restrict filename, const char * _PDCLIB_restrict mode, FILE * _PDCLIB_restrict stream );
165
166 /* If buf is a NULL pointer, call setvbuf( stream, NULL, _IONBF, BUFSIZ ).
167    If buf is not a NULL pointer, call setvbuf( stream, buf, _IOFBF, BUFSIZ ).
168 */
169 void setbuf( FILE * _PDCLIB_restrict stream, char * _PDCLIB_restrict buf );
170
171 /* Set the given stream to the given buffering mode. If buf is not a NULL
172    pointer, use buf as file buffer (of given size). If buf is a NULL pointer,
173    use a buffer of given size allocated internally. _IONBF causes unbuffered
174    behaviour, _IOLBF causes line-buffered behaviour, _IOFBF causes fully
175    buffered behaviour. Calling this function is only valid right after a file is
176    opened, and before any other operation (except for any unsuccessful calls to
177    setvbuf()) has been performed.
178    Returns zero if successful, nonzero otherwise.
179 */
180 int setvbuf( FILE * _PDCLIB_restrict stream, char * _PDCLIB_restrict buf, int mode, size_t size );
181
182 /* Formatted input/output functions */
183
184 /*
185    Write output to the given stream, as defined by the given format string and
186    0..n subsequent arguments (the argument stack).
187
188    The format string is written to the given stream verbatim, except for any
189    conversion specifiers included, which start with the letter '%' and are
190    documented below. If the given conversion specifiers require more arguments
191    from the argument stack than provided, behaviour is undefined. Additional
192    arguments not required by conversion specifiers are evaluated but otherwise
193    ignored.
194
195    (The standard specifies the format string is allowed to contain multibyte
196    character sequences as long as it starts and ends in initial shift state,
197    but this is not yet supported by this implementation, which interprets the
198    format string as sequence of char.)
199    TODO: Add multibyte support to printf() functions.
200
201    A conversion specifier consists of:
202    - Zero or more flags (one of the characters "-+ #0").
203    - Optional minimum field width as decimal integer. Default is padding to the
204      left, using spaces. Note that 0 is taken as a flag, not the beginning of a
205      field width. Note also that a small field width will not result in the
206      truncation of a value.
207    - Optional precision (given as ".#" with # being a decimal integer),
208      specifying:
209      - the min. number of digits to appear (diouxX),
210      - the max. number of digits after the decimal point (aAeEfF),
211      - the max. number of significant digits (gG),
212      - the max. number of bytes to be written (s).
213      - behaviour with other conversion specifiers is undefined.
214    - Optional length modifier specifying the size of the argument (one of "hh",
215      "ll", or one of the characters "hljztL").
216    - Conversion specifier character specifying the type of conversion to be
217      applied (and the type of the next argument from the argument stack). One
218      of the characters "diouxXfFeEgGaAcspn%".
219
220    Minimum field width and/or precision may be given as asterisk ('*') instead
221    of a decimal integer. In this case, the next argument from the argument
222    stack is assumed to be an int value specifying the width / precision. A
223    negative field width is interpreted as flag '-' followed by a positive field
224    width. A negative precision is interpreted as if no precision was given.
225
226    FLAGS
227    -     Left-justify the conversion result within its field width.
228    +     Prefix a '+' on positive signed conversion results. Prefix a '-' on
229          floating conversions resulting in negative zero, or negative values
230          rounding to zero.
231    space Prefix a space on positive signed conversion results, or if a signed
232          conversion results in no characters. If both '+' and ' ' are given,
233          ' ' is ignored.
234    #     Use an "alternative form" for
235          - 'o' conversion, increasing precision until the first digit of the
236            result is a zero;
237          - 'x' or 'X' conversion, prefixing "0x" or "0X" to nonzero results;
238          - "aAeEfF" conversions, always printing a decimal point even if no
239            digits are following;
240          - 'g' or 'G' conversions, always printing a decimal point even if no
241            digits are following, and not removing trailing zeroes.
242          - behaviour for other conversions is unspecified.
243    0     Use leading zeroes instead of spaces for field width padding. If both
244          '-' and '0' are given, '0' is ignored. If a precision is specified for
245          any of the "diouxX" conversions, '0' is ignored. Behaviour is only
246          defined for "diouxXaAeEfFgG".
247
248    LENGTH MODIFIERS
249    hh  For "diouxX" conversions, the argument from the argument stack is
250        assumed to be of char width. (It will have been subject to integer
251        promotion but will be converted back.) For 'n' conversions, the argument
252        is assumed to be a pointer to signed char.
253    h   For "diouxX" conversions, the argument from the argument stack is
254        assumed to be of short int width. (It will have been subject to integer
255        promotion but will be converted back.) For 'n' conversions, the argument
256        is assumed to be a pointer to short int.
257    l   For "diouxX" conversions, the argument from the argument stack is
258        assumed to be of long int width. For 'n' conversions, the argument is
259        assumed to be a pointer to short int. For 'c' conversions, the argument
260        is assumed to be a wint_t. For 's' conversions, the argument is assumed
261        to be a pointer to wchar_t. No effect on "aAeEfFgG" conversions.
262    ll  For "diouxX" conversions, the argument from the argument stack is
263        assumed to be of long long int width. For 'n' conversions, the argument
264        is assumed to be a pointer to long long int.
265    j   For "diouxX" conversions, the argument from the argument stack is
266        assumed to be of intmax_t width. For 'n' conversions, the argument is
267        assumed to be a pointer to intmax_t.
268    z   For "diouxX" conversions, the argument from the argument stack is
269        assumed to be of size_t width. For 'n' conversions, the argument is
270        assumed to be a pointer to size_t.
271    t   For "diouxX" conversions, the argument from the argument stack is
272        assumed to be of ptrdiff_t width. For 'n' conversions, the argument is
273        assumed to be a pointer to ptrdiff_t.
274    L   For "aAeEfFgG" conversions, the argument from the argument stack is
275        assumed to be a long double.
276    Length modifiers appearing for any conversions not mentioned above will have
277    undefined behaviour.
278    If a length modifier appears with any conversion specifier other than as
279    specified above, the behavior is undefined.
280
281    CONVERSION SPECIFIERS
282    d,i The argument from the argument stack is assumed to be of type int, and
283        is converted to a signed decimal value with a minimum number of digits
284        as specified by the precision (default 1), padded with leading zeroes.
285        A zero value converted with precision zero yields no output.
286    o   The argument from the argument stack is assumed to be of type unsigned
287        int, and is converted to an unsigned octal value, other behaviour being
288        as above.
289    u   The argument from the argument stack is assumed to be of type unsigned
290        int, and converted to an unsigned decimal value, other behaviour being
291        as above.
292    x,X The argument from the argument stack is assumed to be of type unsigned
293        int, and converted to an unsigned hexadecimal value, using lowercase
294        "abcdef" for 'x' and uppercase "ABCDEF" for 'X' conversion, other
295        behaviour being as above.
296    f,F The argument from the argument stack is assumed to be of type double,
297        and converted to a decimal floating point in decimal-point notation,
298        with the number of digits after the decimal point as specified by the
299        precision (default 6) and the value being rounded appropriately. If
300        precision is zero (and the '#' flag is not given), no decimal point is
301        printed. At least one digit is always printed before the decimal point.
302        For 'f' conversions, an infinity value is printed as either [-]inf or
303        [-]infinity (, depending on the configuration of this implementation. A
304        NaN value is printed as [-]nan. For 'F' conversions uppercase characters
305        are used for these special values. The flags '-', '+' and ' ' apply as
306        usual to these special values, '#' and '0' have no effect.
307    e,E The argument from the argument stack is assumed to be of type double,
308        and converted to a decimal floating point in normalized exponential
309        notation ([?]d.ddd e±dd). "Normalized" means one nonzero digit before
310        the decimal point, unless the value is zero. The number of digits after
311        the decimal point is specified by the precision (default 6), the value
312        being rounded appropriately. If precision is zero (and the '#' flag is
313        not given), no decimal point is printed. The exponent has at least two
314        digits, and not more than necessary to represent the exponent. If the
315        value is zero, the exponent is zero. The 'e' written to indicate the
316        exponend is uppercase for 'E' conversions.
317        Infinity or NaN values are represented as for 'f' and 'F' conversions,
318        respectively.
319    g,G The argument from the argument stack is assumed to be of type double,
320        and converted according to either 'f' or 'e' format for 'g' conversions,
321        or 'F' or 'E' format for 'G' conversions, respectively, with the actual
322        conversion chosen depending on the value. 'e' / 'E' conversion is chosen
323        if the resulting exponent is < -4 or >= the precision (default 1).
324        Trailing zeroes are removed (unless the '#' flag is given). A decimal
325        point appears only if followed by a digit.
326        Infinity or NaN values are represented as for 'f' and 'F' conversions,
327        respectively.
328    a,A The argument from the argument stack is assumed to be of type double,
329        and converted to a floating point hexadecimal notation ([?]0xh.hhhh p±d)
330        with one hexadecimal digit (being nonzero if the value is normalized,
331        and otherwise unspecified) before the decimal point, and the number of
332        digits after the decimal point being specified by the precision. If no
333        precision is given, the default is to print as many digits as nevessary
334        to give an exact representation of the value (if FLT_RADIX is a power of
335        2). If no precision is given and FLT_RADIX is not a power of 2, the
336        default is to print as many digits to distinguish values of type double
337        (possibly omitting trailing zeroes). (A precision p is sufficient to
338        distinguish values of the source type if 16^p-1 > b^n where b is
339        FLT_RADIX and n is the number of digits in the significand (to base b)
340        of the source type. A smaller p might suffice depending on the
341        implementation's scheme for determining the digit to the left of the
342        decimal point.) The error has the correct sign for the current rounding
343        direction.
344        Unless the '#' flag is given, no decimal-point is given for zero
345        precision.
346        The 'a' conversion uses lowercase "abcdef", "0x" and 'p', the 'A'
347        conversion uppercase "ABCDEF", "0X" and 'P'.
348        The exponent always has at least one digit, and not more than necessary
349        to represent the decimal exponent of 2. If the value is zero, the
350        exponent is zero.
351        Infinity or NaN values are represented as for 'f' and 'F' conversions,
352        respectively.
353        Binary implementations are at liberty to chose the hexadecimal digit to
354        the left of the decimal point so that subsequent digits align to nibble
355        boundaries.
356    c   The argument from the argument stack is assumed to be of type int, and
357        converted to a character after the value has been cast to unsigned char.
358        If the 'l' length modifier is given, the argument is assumed to be of
359        type wint_t, and converted as by a "%ls" conversion with no precision
360        and a pointer to a two-element wchar_t array, with the first element
361        being the wint_t argument and the second a '\0' wide character.
362    s   The argument from the argument stack is assumed to be a char array (i.e.
363        pointer to char). Characters from that array are printed until a zero
364        byte is encountered or as many bytes as specified by a given precision
365        have been written.
366        If the l length modifier is given, the argument from the argument stack
367        is assumed to be a wchar_t array (i.e. pointer to wchar_t). Wide
368        characters from that array are converted to multibyte characters as by
369        calls to wcrtomb() (using a mbstate_t object initialized to zero prior
370        to the first conversion), up to and including the terminating null wide
371        character. The resulting multibyte character sequence is then printed up
372        to but not including the terminating null character. If a precision is
373        given, it specifies the maximum number of bytes to be written (including
374        shift sequences). If the given precision would require access to a wide
375        character one past the end of the array, the array shall contain a '\0'
376        wide character. In no case is a partial multibyte character written.
377        Redundant shift sequences may result if the multibyte characters have a
378        state-dependent encoding.
379        TODO: Clarify these statements regarding %ls.
380    p   The argument from the argument stack is assumed to be a void pointer,
381        and converted to a sequence of printing characters in an implementation-
382        defined manner.
383        This implementation casts the pointer to type intptr_t, and prints the
384        value as if a %#x conversion specifier was given.
385    n   The argument from the argument stack is assumed to be a pointer to a
386        signed integer, into which the number of characters written so far by
387        this call to fprintf is stored. The behaviour, should any flags, field
388        widths, or precisions be given is undefined.
389    %   A verbatim '%' character is written. No argument is taken from the
390        argument stack.
391
392    Returns the number of characters written if successful, a negative value
393    otherwise.
394 */
395 int fprintf( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... );
396
397 /* TODO: fscanf() documentation */
398 /*
399    Write output to the given stream, as defined by the given format string and
400    0..n subsequent arguments (the argument stack).
401
402    The format string is written to the given stream verbatim, except for any
403    conversion specifiers included, which start with the letter '%' and are
404    documented below. If the given conversion specifiers require more arguments
405    from the argument stack than provided, behaviour is undefined. Additional
406    arguments not required by conversion specifiers are evaluated but otherwise
407    ignored.
408
409    (The standard specifies the format string is allowed to contain multibyte
410    character sequences as long as it starts and ends in initial shift state,
411    but this is not yet supported by this implementation, which interprets the
412    format string as sequence of char.)
413    TODO: Add multibyte support to printf() functions.
414
415    Read input from the given stream, as defined by the given format string and
416    0..n subsequent arguments (the argument stack).
417
418    The format string contains a sequence of directives that are expected to
419    match the input. If such a directive fails to match, the function returns
420    (matching error). It also returns if an input error occurs (input error).
421
422    Directives can be:
423    - one or more whitespaces, matching any number of whitespaces in the input;
424    - printing characters, matching the input verbatim;
425    - conversion specifications, which convert an input sequence into a value as
426      defined by the individual specifier, and store that value in a memory
427      location pointed to by the next pointer on the argument stack. Details are
428      documented below. If there is an insufficient number of pointers on the
429      argument stack, behaviour is undefined. Additional arguments not required
430      by any conversion specifications are evaluated, but otherwise ignored.
431
432 The format shall be a multibyte character sequence, beginning and ending in its initial
433 shift state. The format is composed of zero or more directives: one or more white-space
434 characters, an ordinary multibyte character (neither % nor a white-space character), or a
435 conversion speci?cation. Each conversion speci?cation is introduced by the character %.
436 After the %, the following appear in sequence:
437 ? An optional assignment-suppressing character *.
438 ? An optional nonzero decimal integer that speci?es the maximum ?eld width (in
439     characters).
440 ? An optional length modi?er that speci?es the size of the receiving object.
441 ? A conversion speci?er character that speci?es the type of conversion to be applied.
442 The fscanf function executes each directive of the format in turn. If a directive fails, as
443 detailed below, the function returns. Failures are described as input failures (due to the
444 occurrence of an encoding error or the unavailability of input characters), or matching
445 failures (due to inappropriate input).
446 A directive composed of white-space character(s) is executed by reading input up to the
447 ?rst non-white-space character (which remains unread), or until no more characters can
448 be read.
449 A directive that is an ordinary multibyte character is executed by reading the next
450 characters of the stream. If any of those characters differ from the ones composing the
451 directive, the directive fails and the differing and subsequent characters remain unread.
452 Similarly, if end-of-?le, an encoding error, or a read error prevents a character from being
453 read, the directive fails.
454 A directive that is a conversion speci?cation de?nes a set of matching input sequences, as
455 described below for each speci?er. A conversion speci?cation is executed in the
456 following steps:
457 Input white-space characters (as speci?ed by the isspace function) are skipped, unless
458 the speci?cation includes a [, c, or n speci?er.241)
459 These white-space characters are not counted against a speci?ed ?eld width.
460 An input item is read from the stream, unless the speci?cation includes an n speci?er. An
461 input item is de?ned as the longest sequence of input characters which does not exceed
462 any speci?ed ?eld width and which is, or is a pre?x of, a matching input sequence.242)
463 fscanf pushes back at most one input character onto the input stream. Therefore, some sequences
464 that are acceptable to strtod, strtol, etc., are unacceptable to fscanf.
465 The ?rst character, if any, after the input item remains unread. If the length of the input
466 item is zero, the execution of the directive fails; this condition is a matching failure unless
467 end-of-?le, an encoding error, or a read error prevented input from the stream, in which
468 case it is an input failure.
469 Except in the case of a % speci?er, the input item (or, in the case of a %n directive, the
470 count of input characters) is converted to a type appropriate to the conversion speci?er. If
471 the input item is not a matching sequence, the execution of the directive fails: this
472 condition is a matching failure. Unless assignment suppression was indicated by a *, the
473 result of the conversion is placed in the object pointed to by the ?rst argument following
474 the format argument that has not already received a conversion result. If this object
475 does not have an appropriate type, or if the result of the conversion cannot be represented
476 in the object, the behavior is unde?ned.
477 The length modi?ers and their meanings are:
478    
479    LENGTH MODIFIERS
480    hh  For "diouxXn" conversions, the next pointer from the argument stack is
481        assumed to point to a variable of of char width.
482    h   For "diouxXn" conversions, the next pointer from the argument stack is
483        assumed to point to a variable of short int width.
484    l   For "diouxXn" conversions, the next pointer from the argument stack is
485        assumed to point to a variable of long int width.
486        For "aAeEfFgG" conversions, it is assumed to point to a variable of type
487        double.
488        For "cs[" conversions, it is assumed to point to a variable of type
489        wchar_t.
490    ll  For "diouxXn" conversions, the next pointer from the argument stack is
491        assumed to point to a variable of long long int width.
492    j   For "diouxXn" conversions, the next pointer from the argument stack is
493        assumed to point to a variable of intmax_t width.
494    z   For "diouxXn" conversions, the next pointer from the argument stack is
495        assumed to point to a variable of size_t width.
496    t   For "diouxXn" conversions, the next pointer from the argument stack is
497        assumed to point to a variable of ptrdiff_t width.
498    L   For "aAeEfFgG" conversions, the next pointer from the argument stack is
499        assumed to point to a variable of type long double.
500    Length modifiers appearing for any conversions not mentioned above will have
501    undefined behaviour.
502    If a length modifier appears with any conversion specifier other than as
503    specified above, the behavior is undefined.
504
505    CONVERSION SPECIFIERS
506    d    Matches an (optionally signed) decimal integer of the format expected
507         by strtol() with base 10. The next pointer from the argument stack is
508         assumed to point to a signed integer.
509    i    Matches an (optionally signed) integer of the format expected by
510         strtol() with base 0. The next pointer from the argument stack is
511         assumed to point to a signed integer.
512    o    Matches an (optionally signed) octal integer of the format expected by
513         strtoul() with base 8. The next pointer from the argument stack is
514         assumed to point to an unsigned integer.
515    u    Matches an (optionally signed) decimal integer of the format expected
516         by strtoul() with base 10. The next pointer from the argument stack is
517         assumed to point to an unsigned integer.
518    x    Matches an (optionally signed) hexadecimal integer of the format
519         expected by strtoul() with base 16. The next pointer from the argument
520         stack is assumed to point to an unsigned integer.
521    aefg Matches an (optionally signed) floating point number, infinity, or not-
522         a-number-value of the format expected by strtod(). The next pointer
523         from the argument stack is assumed to point to a float.
524    c    Matches a number of characters as specified by the field width (default
525         1). The next pointer from the argument stack is assumed to point to a
526         character array large enough to hold that many characters.
527         If the 'l' length modifier is given, the input is assumed to match a
528         sequence of multibyte characters (starting in the initial shift state),
529         which will be converted to a wide character sequence as by successive
530         calls to mbrtowc() with a mbstate_t object initialized to zero prior to
531         the first conversion. The next pointer from the argument stack is
532         assumed to point to a wchar_t array large enough to hold that many
533         characters.
534         In either case, note that no '\0' character is added to terminate the
535         sequence.
536    s    Matches a sequence of non-white-space characters. The next pointer from
537         the argument stack is assumed to point to a character array large
538         enough to hold the sequence including terminating '\0' character.
539         If the 'l' length modifier is given, the input is assumed to match a
540         sequence of multibyte characters (starting in the initial shift state),
541         which will be converted to a wide character sequence as by a call to
542         mbrtowc() with a mbstate_t object initialized to zero prior to the
543         first conversion. The next pointer from the argument stack is assumed
544         to point to a wchar_t array large enough to hold the sequence including
545         terminating '\0' character.
546    [    Matches a nonempty sequence consisting of any of those characters
547         specified between itself and a corresponding closing bracket (']').
548         If the first character in the list is a circumflex ('^'), this matches
549         a nonempty sequence consisting of any characters NOT specified. If the
550         closing bracket appears as the first character in the scanset ("[]" or
551         "[^]", it is assumed to belong to the scanset, which then ends with the
552         NEXT closing bracket.
553         If there is a '-' character in the scanset which is not the first after
554         the opening bracket (or the circumflex, see above) or the last in the
555         scanset, behaviour is implementation-defined. This implementation
556         handles this character like any other.
557
558         The extend of the input field is determined byte-by-byte for the above
559         conversions ('c', 's', '['), with no special provisions being made for
560         multibyte characters. The resulting field is nevertheless a multibyte
561         sequence begining in intial shift state.
562
563    p    Matches a sequence of characters as produced by the printf() "%p"
564         conversion. The next pointer from the argument stack is assumed to
565         point to a void pointer, which will be filled with the same location
566         as the pointer used in the printf() statement. Note that behaviour is
567         undefined if the input value is not the result of an earlier printf()
568         call.
569    n    Does not read input. The next pointer from the argument stack is
570         assumed to point to a signed integer, into which the number of
571         characters read from input so far by this call to fscanf() is stored.
572         This does not affect the return value of fscanf(). The behaviour,
573         should an assignment-supressing character of field width be given,
574         is undefined.
575         This can be used to test the success of literal matches and suppressed
576         assignments.
577    %    Matches a single, verbatim '%' character.
578
579    A, E, F, G and X are valid, and equivalent to their lowercase counterparts.
580
581    Returns the number of input items successfully assigned. This can be zero if
582    an early mismatch occurs. Returns EOF if an input failure occurs before the
583    first conversion.
584 */
585 int fscanf( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... );
586
587 /* Equivalent to fprintf( stdout, format, ... ). */
588 int printf( const char * _PDCLIB_restrict format, ... );
589
590 /* Equivalent to fscanf( stdin, format, ... ). */
591 int scanf( const char * _PDCLIB_restrict format, ... );
592
593 /* Equivalent to fprintf( stdout, format, ... ), except that the result is
594    written into the buffer pointed to by s, instead of stdout, and that any
595    characters beyond the (n-1)th are discarded. The (n)th character is
596    replaced by a '\0' character in this case.
597    Returns the number of characters that would have been written (not counting
598    the terminating '\0' character) if n had been sufficiently large, if
599    successful, and a negative number if an encoding error ocurred.
600 */
601 int snprintf( char * _PDCLIB_restrict s, size_t n, const char * _PDCLIB_restrict format, ... );
602
603 /* Equivalent to fprintf( stdout, format, ... ), except that the result is
604    written into the buffer pointed to by s, instead of stdout.
605 */
606 int sprintf( char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, ... );
607
608 /* Equivalent to fscanf( stdin, format, ... ), except that the input is read
609    from the buffer pointed to by s, instead of stdin.
610 */
611 int sscanf( const char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, ... );
612
613 /* Equivalent to fprintf( stream, format, ... ), except that the argument stack
614    is passed as va_list parameter. Note that va_list is not declared by
615    <stdio.h>.
616 */
617 int vfprintf( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg );
618
619 /* Equivalent to fscanf( stream, format, ... ), except that the argument stack
620    is passed as va_list parameter. Note that va_list is not declared by
621    <stdio.h>.
622 */
623 int vfscanf( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg );
624
625 /* Equivalent to fprintf( stdout, format, ... ), except that the argument stack
626    is passed as va_list parameter. Note that va_list is not declared by
627    <stdio.h>.
628 */
629 int vprintf( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg );
630
631 /* Equivalent to fscanf( stdin, format, ... ), except that the argument stack
632    is passed as va_list parameter. Note that va_list is not declared by
633    <stdio.h>.
634 */
635 int vscanf( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg );
636
637 /* Equivalent to snprintf( s, n, format, ... ), except that the argument stack
638    is passed as va_list parameter. Note that va_list is not declared by
639    <stdio.h>.
640    */
641 int vsnprintf( char * _PDCLIB_restrict s, size_t n, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg );
642
643 /* Equivalent to fprintf( stdout, format, ... ), except that the argument stack
644    is passed as va_list parameter, and the result is written to the buffer
645    pointed to by s, instead of stdout. Note that va_list is not declared by
646    <stdio.h>.
647 */
648 int vsprintf( char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg );
649
650 /* Equivalent to fscanf( stdin, format, ... ), except that the argument stack
651    is passed as va_list parameter, and the input is read from the buffer
652    pointed to by s, instead of stdin. Note that va_list is not declared by
653    <stdio.h>.
654 */
655 int vsscanf( const char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg );
656
657 /* Character input/output functions */
658
659 /* Retrieve the next character from given stream.
660    Returns the character, EOF otherwise.
661    If end-of-file is reached, the EOF indicator of the stream is set.
662    If a read error occurs, the error indicator of the stream is set.
663 */
664 int fgetc( FILE * stream );
665
666 /* Read at most n-1 characters from given stream into the array s, stopping at
667    \n or EOF. Terminate the read string with \n. If EOF is encountered before
668    any characters are read, leave the contents of s unchanged.
669    Returns s if successful, NULL otherwise.
670    If a read error occurs, the error indicator of the stream is set. In this
671    case, the contents of s are indeterminate.
672 */
673 char * fgets( char * _PDCLIB_restrict s, int n, FILE * _PDCLIB_restrict stream );
674
675 /* Write the value c (cast to unsigned char) to the given stream.
676    Returns c if successful, EOF otherwise.
677    If a write error occurs, sets the error indicator of the stream is set.
678 */
679 int fputc( int c, FILE * stream );
680
681 /* Write the string s (not including the terminating \0) to the given stream.
682    Returns a value >=0 if successful, EOF otherwise.
683    This implementation does set the error indicator of the stream if a write
684    error occurs.
685 */
686 int fputs( const char * _PDCLIB_restrict s, FILE * _PDCLIB_restrict stream );
687
688 /* Equivalent to fgetc( stream ), but may be implemented as a macro that
689    evaluates its parameter more than once.
690 */
691 #define getc( stream ) fgetc( stream )
692
693 /* Equivalent to fgetc( stdin ), but may be implemented as a macro. */
694 #define getchar() fgetc( stdin )
695
696 /* Read characters from given stream into the array s, stopping at \n or EOF.
697    The string read is terminated with \0. Returns s if successful. If EOF is
698    encountered before any characters are read, the contents of s are unchanged,
699    and NULL is returned. If a read error occurs, the contents of s are indeter-
700    minate, and NULL is returned.
701 */
702 char * gets( char * s );
703
704 /* Equivalent to fputc( c, stream ), but may be implemented as a macro that
705    evaluates its parameter more than once.
706 */
707 #define putc( c, stream ) fputc( c, stream )
708
709 /* Equivalent to fputc( c, stdout ), but may be implemented as a macro that
710    evaluates its parameter more than once.
711 */
712 int putchar( int c );
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 );
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 );
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 );
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 );
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 );
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 );
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 );
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 );
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 );
807
808 /* Error-handling functions */
809
810 /* Clear the end-of-file and error indicators for the given stream. */
811 void clearerr( FILE * stream );
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 );
817
818 /* Return zero if the error indicator for the given stream is not set, nonzero
819    otherwise.
820 */
821 int ferror( FILE * stream );
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 );
829
830 #endif