Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}