You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

datareader.cpp 4.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. // Copyright 2019 Tencent
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. #include "datareader.h"
  4. #include <string.h>
  5. namespace ncnn {
  6. DataReader::DataReader()
  7. {
  8. }
  9. DataReader::~DataReader()
  10. {
  11. }
  12. #if NCNN_STRING
  13. int DataReader::scan(const char* /*format*/, void* /*p*/) const
  14. {
  15. return 0;
  16. }
  17. #endif // NCNN_STRING
  18. size_t DataReader::read(void* /*buf*/, size_t /*size*/) const
  19. {
  20. return 0;
  21. }
  22. size_t DataReader::reference(size_t /*size*/, const void** /*buf*/) const
  23. {
  24. return 0;
  25. }
  26. #if NCNN_STDIO
  27. class DataReaderFromStdioPrivate
  28. {
  29. public:
  30. DataReaderFromStdioPrivate(FILE* _fp)
  31. : fp(_fp)
  32. {
  33. }
  34. FILE* fp;
  35. };
  36. DataReaderFromStdio::DataReaderFromStdio(FILE* _fp)
  37. : DataReader(), d(new DataReaderFromStdioPrivate(_fp))
  38. {
  39. }
  40. DataReaderFromStdio::~DataReaderFromStdio()
  41. {
  42. delete d;
  43. }
  44. DataReaderFromStdio::DataReaderFromStdio(const DataReaderFromStdio&)
  45. : d(0)
  46. {
  47. }
  48. DataReaderFromStdio& DataReaderFromStdio::operator=(const DataReaderFromStdio&)
  49. {
  50. return *this;
  51. }
  52. #if NCNN_STRING
  53. int DataReaderFromStdio::scan(const char* format, void* p) const
  54. {
  55. return fscanf(d->fp, format, p);
  56. }
  57. #endif // NCNN_STRING
  58. size_t DataReaderFromStdio::read(void* buf, size_t size) const
  59. {
  60. return fread(buf, 1, size, d->fp);
  61. }
  62. #endif // NCNN_STDIO
  63. class DataReaderFromMemoryPrivate
  64. {
  65. public:
  66. DataReaderFromMemoryPrivate(const unsigned char*& _mem)
  67. : mem(_mem)
  68. {
  69. }
  70. const unsigned char*& mem;
  71. };
  72. DataReaderFromMemory::DataReaderFromMemory(const unsigned char*& _mem)
  73. : DataReader(), d(new DataReaderFromMemoryPrivate(_mem))
  74. {
  75. }
  76. DataReaderFromMemory::~DataReaderFromMemory()
  77. {
  78. delete d;
  79. }
  80. DataReaderFromMemory::DataReaderFromMemory(const DataReaderFromMemory&)
  81. : d(0)
  82. {
  83. }
  84. DataReaderFromMemory& DataReaderFromMemory::operator=(const DataReaderFromMemory&)
  85. {
  86. return *this;
  87. }
  88. #if NCNN_STRING
  89. int DataReaderFromMemory::scan(const char* format, void* p) const
  90. {
  91. size_t fmtlen = strlen(format);
  92. char* format_with_n = new char[fmtlen + 4];
  93. sprintf(format_with_n, "%s%%n", format);
  94. int nconsumed = 0;
  95. int nscan = sscanf((const char*)d->mem, format_with_n, p, &nconsumed);
  96. d->mem += nconsumed;
  97. delete[] format_with_n;
  98. return nconsumed > 0 ? nscan : 0;
  99. }
  100. #endif // NCNN_STRING
  101. size_t DataReaderFromMemory::read(void* buf, size_t size) const
  102. {
  103. memcpy(buf, d->mem, size);
  104. d->mem += size;
  105. return size;
  106. }
  107. size_t DataReaderFromMemory::reference(size_t size, const void** buf) const
  108. {
  109. *buf = d->mem;
  110. d->mem += size;
  111. return size;
  112. }
  113. #if NCNN_PLATFORM_API
  114. #if __ANDROID_API__ >= 9
  115. class DataReaderFromAndroidAssetPrivate
  116. {
  117. public:
  118. DataReaderFromAndroidAssetPrivate(AAsset* _asset)
  119. : asset(_asset), mem(0)
  120. {
  121. }
  122. AAsset* asset;
  123. mutable const unsigned char* mem;
  124. };
  125. DataReaderFromAndroidAsset::DataReaderFromAndroidAsset(AAsset* _asset)
  126. : DataReader(), d(new DataReaderFromAndroidAssetPrivate(_asset))
  127. {
  128. }
  129. DataReaderFromAndroidAsset::~DataReaderFromAndroidAsset()
  130. {
  131. delete d;
  132. }
  133. DataReaderFromAndroidAsset::DataReaderFromAndroidAsset(const DataReaderFromAndroidAsset&)
  134. : d(0)
  135. {
  136. }
  137. DataReaderFromAndroidAsset& DataReaderFromAndroidAsset::operator=(const DataReaderFromAndroidAsset&)
  138. {
  139. return *this;
  140. }
  141. #if NCNN_STRING
  142. int DataReaderFromAndroidAsset::scan(const char* format, void* p) const
  143. {
  144. if (!d->mem)
  145. {
  146. off_t pos = AAsset_seek(d->asset, 0, SEEK_CUR);
  147. d->mem = (const unsigned char*)AAsset_getBuffer(d->asset);
  148. d->mem += pos;
  149. }
  150. int fmtlen = strlen(format);
  151. char* format_with_n = new char[fmtlen + 3];
  152. sprintf(format_with_n, "%s%%n", format);
  153. int nconsumed = 0;
  154. int nscan = sscanf((const char*)d->mem, format_with_n, p, &nconsumed);
  155. d->mem += nconsumed;
  156. delete[] format_with_n;
  157. if (nconsumed == 0)
  158. return 0;
  159. AAsset_seek(d->asset, nconsumed, SEEK_CUR);
  160. return nscan;
  161. }
  162. #endif // NCNN_STRING
  163. size_t DataReaderFromAndroidAsset::read(void* buf, size_t size) const
  164. {
  165. int nread = AAsset_read(d->asset, buf, size);
  166. if (nread < 0)
  167. return 0;
  168. if (d->mem)
  169. {
  170. d->mem += nread;
  171. }
  172. return nread;
  173. }
  174. #endif // __ANDROID_API__ >= 9
  175. #endif // NCNN_PLATFORM_API
  176. } // namespace ncnn