stdio.c 3.7 KB

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