stdio.c 3.7 KB

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