file_stream_transforms.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /* Copyright (C) 2010-2018 The RetroArch team
  2. *
  3. * ---------------------------------------------------------------------------------------
  4. * The following license statement only applies to this file (file_stream_transforms.c).
  5. * ---------------------------------------------------------------------------------------
  6. *
  7. * Permission is hereby granted, free of charge,
  8. * to any person obtaining a copy of this software and associated documentation files (the "Software"),
  9. * to deal in the Software without restriction, including without limitation the rights to
  10. * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
  11. * and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  16. * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  18. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  19. * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  21. */
  22. #include <string.h>
  23. #include <stdarg.h>
  24. #include <libretro.h>
  25. #include <streams/file_stream.h>
  26. RFILE* rfopen(const char *path, const char *mode)
  27. {
  28. RFILE *output = NULL;
  29. unsigned int retro_mode = RETRO_VFS_FILE_ACCESS_READ;
  30. bool position_to_end = false;
  31. if (strstr(mode, "r"))
  32. {
  33. retro_mode = RETRO_VFS_FILE_ACCESS_READ;
  34. if (strstr(mode, "+"))
  35. {
  36. retro_mode = RETRO_VFS_FILE_ACCESS_READ_WRITE |
  37. RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING;
  38. }
  39. }
  40. else if (strstr(mode, "w"))
  41. {
  42. retro_mode = RETRO_VFS_FILE_ACCESS_WRITE;
  43. if (strstr(mode, "+"))
  44. retro_mode = RETRO_VFS_FILE_ACCESS_READ_WRITE;
  45. }
  46. else if (strstr(mode, "a"))
  47. {
  48. retro_mode = RETRO_VFS_FILE_ACCESS_WRITE |
  49. RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING;
  50. position_to_end = true;
  51. if (strstr(mode, "+"))
  52. {
  53. retro_mode = RETRO_VFS_FILE_ACCESS_READ_WRITE |
  54. RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING;
  55. }
  56. }
  57. output = filestream_open(path, retro_mode,
  58. RETRO_VFS_FILE_ACCESS_HINT_NONE);
  59. if (output && position_to_end)
  60. filestream_seek(output, 0, RETRO_VFS_SEEK_POSITION_END);
  61. return output;
  62. }
  63. int rfclose(RFILE* stream)
  64. {
  65. return filestream_close(stream);
  66. }
  67. int64_t rftell(RFILE* stream)
  68. {
  69. return filestream_tell(stream);
  70. }
  71. int64_t rfseek(RFILE* stream, int64_t offset, int origin)
  72. {
  73. int seek_position = -1;
  74. switch (origin)
  75. {
  76. case SEEK_SET:
  77. seek_position = RETRO_VFS_SEEK_POSITION_START;
  78. break;
  79. case SEEK_CUR:
  80. seek_position = RETRO_VFS_SEEK_POSITION_CURRENT;
  81. break;
  82. case SEEK_END:
  83. seek_position = RETRO_VFS_SEEK_POSITION_END;
  84. break;
  85. }
  86. return filestream_seek(stream, offset, seek_position);
  87. }
  88. int64_t rfread(void* buffer,
  89. size_t elem_size, size_t elem_count, RFILE* stream)
  90. {
  91. return (filestream_read(stream, buffer, elem_size * elem_count) / elem_size);
  92. }
  93. char *rfgets(char *buffer, int maxCount, RFILE* stream)
  94. {
  95. return filestream_gets(stream, buffer, maxCount);
  96. }
  97. int rfgetc(RFILE* stream)
  98. {
  99. return filestream_getc(stream);
  100. }
  101. int64_t rfwrite(void const* buffer,
  102. size_t elem_size, size_t elem_count, RFILE* stream)
  103. {
  104. return filestream_write(stream, buffer, elem_size * elem_count);
  105. }
  106. int rfputc(int character, RFILE * stream)
  107. {
  108. return filestream_putc(stream, character);
  109. }
  110. int64_t rfflush(RFILE * stream)
  111. {
  112. return filestream_flush(stream);
  113. }
  114. int rfprintf(RFILE * stream, const char * format, ...)
  115. {
  116. int result;
  117. va_list vl;
  118. va_start(vl, format);
  119. result = filestream_vprintf(stream, format, vl);
  120. va_end(vl);
  121. return result;
  122. }
  123. int rferror(RFILE* stream)
  124. {
  125. return filestream_error(stream);
  126. }
  127. int rfeof(RFILE* stream)
  128. {
  129. return filestream_eof(stream);
  130. }
  131. int rfscanf(RFILE * stream, const char * format, ...)
  132. {
  133. int result;
  134. va_list vl;
  135. va_start(vl, format);
  136. result = filestream_scanf(stream, format, vl);
  137. va_end(vl);
  138. return result;
  139. }