| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include "datareader.h" |
| |
|
| | #include <string.h> |
| |
|
| | namespace ncnn { |
| |
|
| | DataReader::DataReader() |
| | { |
| | } |
| |
|
| | DataReader::~DataReader() |
| | { |
| | } |
| |
|
| | #if NCNN_STRING |
| | int DataReader::scan(const char* , void* ) const |
| | { |
| | return 0; |
| | } |
| | #endif |
| |
|
| | size_t DataReader::read(void* , size_t ) const |
| | { |
| | return 0; |
| | } |
| |
|
| | size_t DataReader::reference(size_t , const void** ) const |
| | { |
| | return 0; |
| | } |
| |
|
| | #if NCNN_STDIO |
| | class DataReaderFromStdioPrivate |
| | { |
| | public: |
| | DataReaderFromStdioPrivate(FILE* _fp) |
| | : fp(_fp) |
| | { |
| | } |
| | FILE* fp; |
| | }; |
| |
|
| | DataReaderFromStdio::DataReaderFromStdio(FILE* _fp) |
| | : DataReader(), d(new DataReaderFromStdioPrivate(_fp)) |
| | { |
| | } |
| |
|
| | DataReaderFromStdio::~DataReaderFromStdio() |
| | { |
| | delete d; |
| | } |
| |
|
| | DataReaderFromStdio::DataReaderFromStdio(const DataReaderFromStdio&) |
| | : d(0) |
| | { |
| | } |
| |
|
| | DataReaderFromStdio& DataReaderFromStdio::operator=(const DataReaderFromStdio&) |
| | { |
| | return *this; |
| | } |
| |
|
| | #if NCNN_STRING |
| | int DataReaderFromStdio::scan(const char* format, void* p) const |
| | { |
| | return fscanf(d->fp, format, p); |
| | } |
| | #endif |
| |
|
| | size_t DataReaderFromStdio::read(void* buf, size_t size) const |
| | { |
| | return fread(buf, 1, size, d->fp); |
| | } |
| | #endif |
| |
|
| | class DataReaderFromMemoryPrivate |
| | { |
| | public: |
| | DataReaderFromMemoryPrivate(const unsigned char*& _mem) |
| | : mem(_mem) |
| | { |
| | } |
| | const unsigned char*& mem; |
| | }; |
| |
|
| | DataReaderFromMemory::DataReaderFromMemory(const unsigned char*& _mem) |
| | : DataReader(), d(new DataReaderFromMemoryPrivate(_mem)) |
| | { |
| | } |
| |
|
| | DataReaderFromMemory::~DataReaderFromMemory() |
| | { |
| | delete d; |
| | } |
| |
|
| | DataReaderFromMemory::DataReaderFromMemory(const DataReaderFromMemory&) |
| | : d(0) |
| | { |
| | } |
| |
|
| | DataReaderFromMemory& DataReaderFromMemory::operator=(const DataReaderFromMemory&) |
| | { |
| | return *this; |
| | } |
| |
|
| | #if NCNN_STRING |
| | int DataReaderFromMemory::scan(const char* format, void* p) const |
| | { |
| | size_t fmtlen = strlen(format); |
| |
|
| | char* format_with_n = new char[fmtlen + 4]; |
| | sprintf(format_with_n, "%s%%n", format); |
| |
|
| | int nconsumed = 0; |
| | int nscan = sscanf((const char*)d->mem, format_with_n, p, &nconsumed); |
| | d->mem += nconsumed; |
| |
|
| | delete[] format_with_n; |
| |
|
| | return nconsumed > 0 ? nscan : 0; |
| | } |
| | #endif |
| |
|
| | size_t DataReaderFromMemory::read(void* buf, size_t size) const |
| | { |
| | memcpy(buf, d->mem, size); |
| | d->mem += size; |
| | return size; |
| | } |
| |
|
| | size_t DataReaderFromMemory::reference(size_t size, const void** buf) const |
| | { |
| | *buf = d->mem; |
| | d->mem += size; |
| | return size; |
| | } |
| |
|
| | #if NCNN_PLATFORM_API |
| | #if __ANDROID_API__ >= 9 |
| | class DataReaderFromAndroidAssetPrivate |
| | { |
| | public: |
| | DataReaderFromAndroidAssetPrivate(AAsset* _asset) |
| | : asset(_asset), mem(0) |
| | { |
| | } |
| | AAsset* asset; |
| | mutable const unsigned char* mem; |
| | }; |
| |
|
| | DataReaderFromAndroidAsset::DataReaderFromAndroidAsset(AAsset* _asset) |
| | : DataReader(), d(new DataReaderFromAndroidAssetPrivate(_asset)) |
| | { |
| | } |
| |
|
| | DataReaderFromAndroidAsset::~DataReaderFromAndroidAsset() |
| | { |
| | delete d; |
| | } |
| |
|
| | DataReaderFromAndroidAsset::DataReaderFromAndroidAsset(const DataReaderFromAndroidAsset&) |
| | : d(0) |
| | { |
| | } |
| |
|
| | DataReaderFromAndroidAsset& DataReaderFromAndroidAsset::operator=(const DataReaderFromAndroidAsset&) |
| | { |
| | return *this; |
| | } |
| |
|
| | #if NCNN_STRING |
| | int DataReaderFromAndroidAsset::scan(const char* format, void* p) const |
| | { |
| | if (!d->mem) |
| | { |
| | off_t pos = AAsset_seek(d->asset, 0, SEEK_CUR); |
| | d->mem = (const unsigned char*)AAsset_getBuffer(d->asset); |
| | d->mem += pos; |
| | } |
| |
|
| | int fmtlen = strlen(format); |
| |
|
| | char* format_with_n = new char[fmtlen + 3]; |
| | sprintf(format_with_n, "%s%%n", format); |
| |
|
| | int nconsumed = 0; |
| | int nscan = sscanf((const char*)d->mem, format_with_n, p, &nconsumed); |
| | d->mem += nconsumed; |
| |
|
| | delete[] format_with_n; |
| |
|
| | if (nconsumed == 0) |
| | return 0; |
| |
|
| | AAsset_seek(d->asset, nconsumed, SEEK_CUR); |
| |
|
| | return nscan; |
| | } |
| | #endif |
| |
|
| | size_t DataReaderFromAndroidAsset::read(void* buf, size_t size) const |
| | { |
| | int nread = AAsset_read(d->asset, buf, size); |
| | if (nread < 0) |
| | return 0; |
| |
|
| | if (d->mem) |
| | { |
| | d->mem += nread; |
| | } |
| |
|
| | return nread; |
| | } |
| | #endif |
| | #endif |
| |
|
| | } |
| |
|