size_t std_fread(void *ptr, size_t size, size_t numItems, FILE *handle) { // consolePrintf("fread %d,%d %d ", size, numItems, ptr); if (DS::isGBAMPAvailable()) { readPastEndOfFile = false; int bytes = FAT_fread(ptr, size, numItems, (FAT_FILE *) handle); if (!FAT_feof((FAT_FILE *) handle)) { return numItems; } else { // consolePrintf("Read past end of file: %d read out of %d\n", bytes / size, numItems); if ((size_t)bytes != size * numItems) readPastEndOfFile = true; return bytes / size; } return numItems; } if (handle->pos > handle->size) numItems = 0; else if ((int)(handle->pos + size * numItems) > handle->size) numItems = (handle->size - handle->pos) / size; // consolePrintf("read %d ", size * numItems); memcpy(ptr, handle->data + handle->pos, size * numItems); handle->pos += size * numItems; return numItems; }
bool std_feof(FILE *handle) { // consolePrintf("feof "); if (DS::isGBAMPAvailable()) { return readPastEndOfFile && FAT_feof((FAT_FILE *) handle); } // consolePrintf("feof %s", handle->pos >= handle->size? "true": "false"); return handle->pos >= handle->size; }
uint TestFile3(void) { tIORes res; uint result = 1; tFATFile file; tFATFSStatus FSStatus1, FSStatus2; uchar buf[4UL*MAX_CLUSTER_SIZE+1]; uint32 aFileSize[]= {0, 1, // ~= 0 FAT_SECTOR_SIZE-1, FAT_SECTOR_SIZE, FAT_SECTOR_SIZE+1, // ~= sector -1, 0, 1, // ~= cluster -1, 0, 1, // ~= 2 clusters -1, 0, 1}; // ~= 4 clusters int FileSizeCount = 5; int FileSizeIndex = 0; int CloseIndex; int ReadSizeIndex = 0; FAT_statvfs (&stdio_FATFS, &res, "\\", &FSStatus1); CHK(res == ior_OK); if (FSStatus1.ClusterSize != FAT_SECTOR_SIZE) { aFileSize[FileSizeCount++] = FSStatus1.ClusterSize - 1; aFileSize[FileSizeCount++] = FSStatus1.ClusterSize; aFileSize[FileSizeCount++] = FSStatus1.ClusterSize + 1; } aFileSize[FileSizeCount++] = 2 * FSStatus1.ClusterSize - 1; aFileSize[FileSizeCount++] = 2 * FSStatus1.ClusterSize; aFileSize[FileSizeCount++] = 2 * FSStatus1.ClusterSize + 1; aFileSize[FileSizeCount++] = 4 * FSStatus1.ClusterSize - 1; aFileSize[FileSizeCount++] = 4 * FSStatus1.ClusterSize; aFileSize[FileSizeCount++] = 4 * FSStatus1.ClusterSize + 1; for (CloseIndex = 0; CloseIndex <= 1; CloseIndex++) { for (FileSizeIndex = 0; FileSizeIndex < FileSizeCount; FileSizeIndex++) { for (ReadSizeIndex = 0; ReadSizeIndex < FileSizeCount; ReadSizeIndex++) { uint32 size, pos=0, ReadPos; size_t ReadSize, s; int IsEof; size = (size_t)aFileSize[FileSizeIndex]; ReadSize = aFileSize[ReadSizeIndex]; CreateTestFile (&res, &file, "file1", size, CloseIndex); CHK(res == ior_OK); if (!CloseIndex) { FAT_rewind (&stdio_FATFS, &res, &file); CHK(res == ior_OK); } else { FAT_fopen (&stdio_FATFS, &res, &file, "file1", "rb"); CHK(res == ior_OK); } FAT_fsize (&stdio_FATFS, &res, &file, &ReadPos); CHK(res == ior_OK); CHK(size == ReadPos); FAT_feof (&stdio_FATFS, &res, &file, &IsEof); CHK(res == ior_OK); CHK(size ? !IsEof : IsEof); FAT_ftell (&stdio_FATFS, &res, &file, &ReadPos); CHK(res == ior_OK); CHK(pos == ReadPos); while (pos < size) { uint32 i; s = FAT_fread (&stdio_FATFS, &res, buf, 1, ReadSize, &file); CHK(res == ior_OK); CHK(s == MIN(size - pos, ReadSize)); if (!ReadSize) break; for (i = 0; i < s; i++) { CHK(buf[i] == (pos + i) % 251); } pos += s; FAT_ftell (&stdio_FATFS, &res, &file, &ReadPos); CHK(res == ior_OK); CHK(pos == ReadPos); } if (ReadSize) { s = FAT_fread (&stdio_FATFS, &res, buf, 1, ReadSize, &file); CHK(res == ior_OK); CHK(s == 0); CHK(pos == size); FAT_feof (&stdio_FATFS, &res, &file, &IsEof); CHK(res == ior_OK); CHK(IsEof); } FAT_fclose (&stdio_FATFS, &res, &file); CHK(res == ior_OK); FAT_unlink (&stdio_FATFS, &res, "file1"); CHK(res == ior_OK); } } } FAT_statvfs (&stdio_FATFS, &res, "\\", &FSStatus2); CHK(res == ior_OK); CHK(FSStatus2.TotalFreeClusterCount == FSStatus1.TotalFreeClusterCount); result = 0; lend: return result; }