This commit was manufactured by cvs2svn to create branch 'captive'.
[reactos.git] / include / crtdll / stdio.h
1 /*
2  * stdio.h
3  *
4  * Definitions of types and prototypes of functions for standard input and
5  * output.
6  *
7  * NOTE: The file manipulation functions provided by Microsoft seem to
8  * work with either slash (/) or backslash (\) as the path separator.
9  *
10  * This file is part of the Mingw32 package.
11  *
12  * Contributors:
13  *  Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
14  *
15  *  THIS SOFTWARE IS NOT COPYRIGHTED
16  *
17  *  This source code is offered for use in the public domain. You may
18  *  use, modify or distribute it freely.
19  *
20  *  This code is distributed in the hope that it will be useful but
21  *  WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
22  *  DISCLAMED. This includes but is not limited to warranties of
23  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
24  *
25  * $Revision$
26  * $Author$
27  * $Date$
28  *
29  */
30 /* Appropriated for Reactos Crtdll by Ariadne */
31 /* implemented clearerr feof ferror perror as macros */
32 /* added _IOCOMMIT */
33 /* added filbuf and flsbuf and fwalk   */
34
35 #ifndef _STDIO_H_
36 #define _STDIO_H_
37
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41
42 #define __need_size_t
43 #define __need_NULL
44 #define __need_wchar_t
45 #define __need_wint_t
46 #include <crtdll/stddef.h>
47
48
49 /* Some flags for the iobuf structure provided by djgpp stdio.h */
50 #define _IOREAD   0x000010
51 #define _IOWRT    0x000020
52 #define _IOMYBUF  0x000040
53 #define _IOEOF    0x000100
54 #define _IOERR    0x000200
55 #define _IOSTRG   0x000400
56
57 #define _IOAPPEND 0x002000
58 #define _IORMONCL 0x004000  /* remove on close, for temp files */
59 /* if _flag & _IORMONCL, ._name_to_remove needs freeing */
60 #define _IOUNGETC 0x010000  /* there is an ungetc'ed character in the buffer */
61 #define _IOCOMMIT 0x008000
62
63 #define _IODIRTY  0x000080
64 #define _IOAHEAD  0x000008
65 #define _IORW (_IOREAD | _IOWRITE )
66
67
68 /*
69  * I used to include stdarg.h at this point, in order to allow for the
70  * functions later on in the file which use va_list. That conflicts with
71  * using stdio.h and varargs.h in the same file, so I do the typedef myself.
72  */
73 //#ifndef _VA_LIST
74 //#define _VA_LIST
75 //typedef       char* va_list;
76 //#endif
77 #include <stdarg.h>
78
79 /*
80  * FILE should be used as a pointer to an opaque data type. Do not rely on
81  * anything else, especially the size or contents of this structure!
82  */
83 #ifndef _FILE_DEFINED
84 typedef struct {
85   char *_ptr;
86   int   _cnt;
87   char *_base;
88   int   _flag;
89   int   _file;
90   int   _ungotchar;
91   int   _bufsiz;
92   char *_name_to_remove;
93 } FILE;
94 #define _FILE_DEFINED
95 #endif
96
97 //#define _fillsize _bufsiz
98
99 /*
100  * The three standard file pointers provided by the run time library.
101  * NOTE: These will go to the bit-bucket silently in GUI applications!
102  */
103 extern FILE _iob[];     /* an array of FILE */
104 #define stdin   (&_iob[0])
105 #define stdout  (&_iob[1])
106 #define stderr  (&_iob[2])
107 #define stdaux  (&_iob[3])
108 #define stdprn  (&_iob[4])
109
110 /* Returned by various functions on end of file condition or error. */
111 #define EOF     (-1)
112
113
114 /*
115  * The maximum length of a file name. You should use GetVolumeInformation
116  * instead of this constant. But hey, this works.
117  *
118  * NOTE: This is used in the structure _finddata_t (see dir.h) so changing it
119  *       is probably not a good idea.
120  */
121 #define FILENAME_MAX    (260)
122
123 /*
124  * The maximum number of files that may be open at once. I have set this to
125  * a conservative number. The actual value may be higher.
126  */
127 #define FOPEN_MAX       (20)
128
129
130 /*
131  * File Operations
132  */
133
134 FILE*   fopen (const char* szFileName, const char* szMode);
135 FILE*   freopen (const char* szNewFileName, const char* szNewMode,
136                  FILE* fileChangeAssociation);
137 int     fflush (FILE* fileFlush);
138 int     fclose (FILE* fileClose);
139 #define fcloseall       _fcloseall
140 int     remove (const char* szFileName);
141 int     rename (const char* szOldFileName, const char* szNewFileName);
142 FILE*   tmpfile (void);
143
144 int     _filbuf(FILE *f);
145 int     _flsbuf(int c, FILE *f); 
146 void    _fwalk(void (*func)(FILE *)); // not exported
147 int     _fcloseall( void );
148
149
150 /*
151  * The maximum size of name (including NUL) that will be put in the user
152  * supplied buffer caName.
153  * NOTE: This has not been determined by experiment, but based on the
154  * maximum file name length above it is probably reasonable. I could be
155  * wrong...
156  */
157 #define L_tmpnam        (260)
158
159 char*   tmpnam (char caName[]);
160 char*   _tempnam (const char *szDir, const char *szPfx);
161
162 #ifndef _NO_OLDNAMES
163 #define tempnam _tempnam
164 #endif  /* Not _NO_OLDNAMES */
165
166 /*
167  * The three possible buffering mode (nMode) values for setvbuf.
168  * NOTE: _IOFBF works, but _IOLBF seems to work like unbuffered...
169  * maybe I'm testing it wrong?
170  */
171 #define _IOFBF  0       /* fully buffered */
172 #define _IOLBF  1       /* line buffered */
173 #define _IONBF  2       /* unbuffered */
174
175 int     setvbuf (FILE* fileSetBuffer, char* caBuffer, int nMode,
176                  size_t sizeBuffer);
177
178
179 /*
180  * The buffer size as used by setbuf such that it is equivalent to
181  * (void) setvbuf(fileSetBuffer, caBuffer, _IOFBF, BUFSIZ).
182  */
183 #define BUFSIZ  512
184
185 void    setbuf (FILE* fileSetBuffer, char* caBuffer);
186
187 /*
188  * Pipe Operations
189  */
190   
191 int     _pclose (FILE* pipeClose);
192 FILE*   _popen (const char* szPipeName, const char* szMode);
193
194 #define popen _popen
195 #define pclose _pclose
196
197 /* Wide character version */
198 FILE*   _wpopen (const wchar_t* szPipeName, const wchar_t* szMode);
199
200 /*
201  * Formatted Output
202  */
203
204 int     fprintf (FILE* filePrintTo, const char* szFormat, ...);
205 int     printf (const char* szFormat, ...);
206 int     sprintf (char* caBuffer, const char* szFormat, ...);
207 int     vfprintf (FILE* filePrintTo, const char* szFormat, va_list varg);
208 int     vprintf (const char* szFormat, va_list varg);
209 int     vsprintf (char* caBuffer, const char* szFormat, va_list varg);
210
211 /* Wide character versions */
212 int     fwprintf (FILE* filePrintTo, const wchar_t* wsFormat, ...);
213 int     wprintf (const wchar_t* wsFormat, ...);
214 int     swprintf (wchar_t* wcaBuffer, const wchar_t* wsFormat, ...);
215 int     vfwprintf (FILE* filePrintTo, const wchar_t* wsFormat, va_list varg);
216 int     vwprintf (const wchar_t* wsFormat, va_list varg);
217 int     vswprintf (wchar_t* wcaBuffer, const wchar_t* wsFormat, va_list varg);
218
219 /*
220  * Formatted Input
221  */
222
223 int     fscanf (FILE* fileReadFrom, const char* szFormat, ...);
224 int     scanf (const char* szFormat, ...);
225 int     sscanf (const char* szReadFrom, const char* szFormat, ...);
226
227 /* Wide character versions */
228 int     fwscanf (FILE* fileReadFrom, const wchar_t* wsFormat, ...);
229 int     wscanf (const wchar_t* wsFormat, ...);
230 int     swscanf (const wchar_t* wsReadFrom, const wchar_t* wsFormat, ...);
231
232 /*
233  * Character Input and Output Functions
234  */
235
236 int     fgetc (FILE* fileRead);
237 char*   fgets (char* caBuffer, int nBufferSize, FILE* fileRead);
238 int     fputc (int c, FILE* fileWrite);
239 int     fputs (const char* szOutput, FILE* fileWrite);
240 int     getc (FILE* fileRead);
241 int     getchar (void);
242 char*   gets (char* caBuffer);  /* Unsafe: how does gets know how long the
243                                  * buffer is? */
244 int     putc (int c, FILE* fileWrite);
245 int     putchar (int c);
246 int     puts (const char* szOutput);
247 int     ungetc (int c, FILE* fileWasRead);
248
249 /* Wide character versions */
250 wint_t  fgetwc (FILE* fileRead);
251 wint_t  fputwc (wchar_t wc, FILE* fileWrite);
252 wint_t  getwc(FILE *fileRead); // not exported
253 wint_t  ungetwc (wchar_t wc, FILE* fileWasRead);
254
255 wint_t  _filwbuf(FILE *f);
256 wint_t  _flswbuf(wchar_t c, FILE *f); 
257
258 /*
259  * Not exported by CRTDLL.DLL included for reference purposes.
260  */
261 #if 0
262 wchar_t*        fgetws (wchar_t* wcaBuffer, int nBufferSize, FILE* fileRead);
263 int             fputws (const wchar_t* wsOutput, FILE* fileWrite);
264 int             getwc (FILE* fileRead);
265 int             getwchar ();
266 wchar_t*        getws (wchar_t* wcaBuffer);
267 int             putwc (wchar_t wc, FILE* fileWrite);
268 int             putws (const wchar_t* wsOutput);
269 #endif  /* 0 */
270
271 /* NOTE: putchar has no wide char equivalent even in tchar.h */
272
273
274 /*
275  * Direct Input and Output Functions
276  */
277
278 size_t  fread (void* pBuffer, size_t sizeObject, size_t sizeObjCount,
279                 FILE* fileRead);
280 size_t  fwrite (const void* pObjArray, size_t sizeObject, size_t sizeObjCount,
281                 FILE* fileWrite);
282
283
284 /*
285  * File Positioning Functions
286  */
287
288 /* Constants for nOrigin indicating the position relative to which fseek
289  * sets the file position. Enclosed in ifdefs because io.h could also
290  * define them. (Though not anymore since io.h includes this file now.) */
291 #ifndef SEEK_SET
292 #define SEEK_SET        (0)
293 #endif
294
295 #ifndef SEEK_CUR
296 #define SEEK_CUR        (1)
297 #endif
298
299 #ifndef SEEK_END
300 #define SEEK_END        (2)
301 #endif
302
303 int     fseek   (FILE* fileSetPosition, long lnOffset, int nOrigin);
304 long    ftell   (FILE* fileGetPosition);
305 void    rewind  (FILE* fileRewind);
306
307 /*
308  * An opaque data type used for storing file positions... The contents of
309  * this type are unknown, but we (the compiler) need to know the size
310  * because the programmer using fgetpos and fsetpos will be setting aside
311  * storage for fpos_t structres. Actually I tested using a byte array and
312  * it is fairly evident that the fpos_t type is a long (in CRTDLL.DLL).
313  * Perhaps an unsigned long? TODO?
314  */
315 typedef long    fpos_t;
316
317 int     fgetpos (FILE* fileGetPosition, fpos_t* pfpos);
318 int     fsetpos (FILE* fileSetPosition, const fpos_t* pfpos);
319
320
321 /*
322  * Error Functions
323  */
324 #if 0
325 void    clearerr (FILE* fileClearErrors);
326 int     feof (FILE* fileIsAtEnd);
327 int     ferror (FILE* fileIsError);
328 void    perror (const char* szErrorMessage);
329
330 #endif
331
332 #define  clearerr(f)     (((f)->_flag) &= ~(_IOERR|_IOEOF))
333 #define feof(f)         (((f)->_flag&_IOEOF)!=0)
334 #define ferror(f)       (((f)->_flag&_IOERR)!=0)
335 #define  perror(s)      (fprintf(stderr, "%s: %s\n", (s), _strerror(NULL)))
336 /*
337  * Non ANSI functions
338  */
339
340 #ifndef __STRICT_ANSI__
341 int     _fgetchar (void);
342 int     _fputchar (int c);
343 FILE*   _fdopen (int nHandle, char* szMode);
344
345 #ifndef _NO_OLDNAMES
346 #define fgetchar        _fgetchar
347 #define fputchar        _fputchar
348 #define fdopen          _fdopen
349 #endif  /* Not _NO_OLDNAMES */
350
351 #endif  /* Not __STRICT_ANSI__ */
352
353 #ifdef __cplusplus
354 }
355 #endif
356
357 #endif /* _STDIO_H_ */