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