4a3c66d1fafabdae4566cb2662147529a9549d71
[reactos.git] / reactos / 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: 1.12 $
26 * $Author: jean $
27 * $Date: 2001/01/25 18:51:26 $
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_ */