New test.
[mono.git] / support / stdio.c
1 /*
2  * <stdio.h> wrapper functions.
3  *
4  * Authors:
5  *   Jonathan Pryor (jonpryor@vt.edu)
6  *
7  * Copyright (C) 2004-2005 Jonathan Pryor
8  */
9
10 #include <stdarg.h>
11 #include <stdio.h>
12 #include <stdlib.h>
13
14 #include "mph.h"
15
16 G_BEGIN_DECLS
17
18 #ifndef PLATFORM_WIN32
19 gint32
20 Mono_Posix_Syscall_L_ctermid (void)
21 {
22         return L_ctermid;
23 }
24
25 gint32
26 Mono_Posix_Syscall_L_cuserid (void)
27 {
28         return L_cuserid;
29 }
30 #endif /* ndef PLATFORM_WIN32 */
31
32 mph_size_t
33 Mono_Posix_Stdlib_fread (void *ptr, mph_size_t size, mph_size_t nmemb, void *stream)
34 {
35         mph_return_if_size_t_overflow (size);
36         mph_return_if_size_t_overflow (nmemb);
37
38         return fread (ptr, (size_t) size, (size_t) nmemb, (FILE*) stream);
39 }
40
41 mph_size_t
42 Mono_Posix_Stdlib_fwrite (void *ptr, mph_size_t size, mph_size_t nmemb, void *stream)
43 {
44         mph_return_if_size_t_overflow (size);
45         mph_return_if_size_t_overflow (nmemb);
46
47         return fwrite (ptr, (size_t) size, (size_t) nmemb, (FILE*) stream);
48 }
49
50 #ifdef HAVE_VSNPRINTF
51 gint32
52 Mono_Posix_Stdlib_snprintf (char *s, mph_size_t n, char *format, ...);
53 gint32
54 Mono_Posix_Stdlib_snprintf (char *s, mph_size_t n, char *format, ...)
55 {
56         va_list ap;
57         gint32 r;
58         mph_return_if_size_t_overflow (n);
59
60         va_start (ap, format);
61         r = vsnprintf (s, (size_t) n, format, ap);
62         va_end (ap);
63
64         return r;
65 }
66 #endif /* def HAVE_VSNPRINTF */
67
68 gint32
69 Mono_Posix_Stdlib__IOFBF (void)
70 {
71         return _IOFBF;
72 }
73
74 gint32
75 Mono_Posix_Stdlib__IOLBF (void)
76 {
77         return _IOLBF;
78 }
79
80 gint32
81 Mono_Posix_Stdlib__IONBF (void)
82 {
83         return _IONBF;
84 }
85
86 gint32
87 Mono_Posix_Stdlib_BUFSIZ (void)
88 {
89         return BUFSIZ;
90 }
91
92 gint32
93 Mono_Posix_Stdlib_EOF (void)
94 {
95         return EOF;
96 }
97
98 gint32
99 Mono_Posix_Stdlib_FOPEN_MAX (void)
100 {
101         return FOPEN_MAX;
102 }
103
104 gint32
105 Mono_Posix_Stdlib_FILENAME_MAX (void)
106 {
107         return FILENAME_MAX;
108 }
109
110 gint32
111 Mono_Posix_Stdlib_L_tmpnam (void)
112 {
113         return L_tmpnam;
114 }
115
116 void*
117 Mono_Posix_Stdlib_stdin (void)
118 {
119         return stdin;
120 }
121
122 void*
123 Mono_Posix_Stdlib_stdout (void)
124 {
125         return stdout;
126 }
127
128 void*
129 Mono_Posix_Stdlib_stderr (void)
130 {
131         return stderr;
132 }
133
134 gint32
135 Mono_Posix_Stdlib_TMP_MAX (void)
136 {
137         return TMP_MAX;
138 }
139
140 gint32
141 Mono_Posix_Stdlib_setvbuf (void* stream, void *buf, int mode, mph_size_t size)
142 {
143         mph_return_if_size_t_overflow (size);
144         return setvbuf (stream, (char *) buf, mode, (size_t) size);
145 }
146
147 int 
148 Mono_Posix_Stdlib_setbuf (void* stream, void* buf)
149 {
150         errno = 0;
151         setbuf (stream, buf);
152         return errno == 0 ? 0 : -1;
153 }
154
155 gint32
156 Mono_Posix_Stdlib_fseek (void* stream, gint64 offset, int origin)
157 {
158         mph_return_if_long_overflow (offset);
159
160         return fseek (stream, offset, origin);
161 }
162
163 gint64
164 Mono_Posix_Stdlib_ftell (void* stream)
165 {
166         return ftell (stream);
167 }
168
169 void*
170 Mono_Posix_Stdlib_CreateFilePosition (void)
171 {
172         fpos_t* pos = malloc (sizeof(fpos_t));
173         return pos;
174 }
175
176 gint32
177 Mono_Posix_Stdlib_fgetpos (void* stream, void *pos)
178 {
179         return fgetpos (stream, (fpos_t*) pos);
180 }
181
182 gint32
183 Mono_Posix_Stdlib_fsetpos (void* stream, void *pos)
184 {
185         return fsetpos (stream, (fpos_t*) pos);
186 }
187
188 int
189 Mono_Posix_Stdlib_rewind (void* stream)
190 {
191         errno = 0;
192         rewind (stream);
193         return errno == 0 ? 0 : -1;
194 }
195
196 int
197 Mono_Posix_Stdlib_clearerr (void* stream)
198 {
199         errno = 0;
200         clearerr (stream);
201         return errno == 0 ? 0 : -1;
202 }
203
204 int
205 Mono_Posix_Stdlib_perror (const char* s)
206 {
207         errno = 0;
208         perror (s);
209         return errno == 0 ? 0 : -1;
210 }
211
212 #define MPH_FPOS_LENGTH (sizeof(fpos_t)*2)
213
214 int
215 Mono_Posix_Stdlib_DumpFilePosition (char *dest, void *pos, gint32 len)
216 {
217         char *destp;
218         unsigned char *posp, *pose;
219
220         if (dest == NULL)
221                 return MPH_FPOS_LENGTH;
222
223         if (pos == NULL || len <= 0) {
224                 errno = EINVAL;
225                 return -1;
226         }
227
228         posp = (unsigned char*) pos;
229         pose = posp + sizeof(fpos_t);
230         destp = dest;
231
232         for ( ; posp < pose && len > 1; destp += 2, ++posp, len -= 2) {
233                 sprintf (destp, "%02X", *posp);
234         }
235
236         if (len)
237                 dest[MPH_FPOS_LENGTH] = '\0';
238
239         return destp - dest;
240 }
241
242 G_END_DECLS
243
244 /*
245  * vim: noexpandtab
246  */