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