コード例 #1
0
ファイル: ds-fs.cpp プロジェクト: 86400/scummvm
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;
}
コード例 #2
0
ファイル: testcase.c プロジェクト: vn2019/epos
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;
}
コード例 #3
0
ファイル: testcase.c プロジェクト: vn2019/epos
uint TestFile2(void)
{
  tIORes res;
  uint result = 1;
  tFATFile file;
  tFATFSStatus FSStatus1, FSStatus2;
  char c;
  size_t s;
  uint disk;

  for (disk = 'a'; disk <= 'z'; disk++)
  {
    char DiskPath[]="a:\\";
    char FilePath[128];

    DiskPath[0] = disk;

    FAT_statvfs (&stdio_FATFS, &res, DiskPath, &FSStatus1);
    if (((res == ior_ERR_IO) && (disk < 'c')) || (res == ior_BAD_NAME))
      continue;
    CHK(res == ior_OK);

    strcpy (FilePath, "a:file1");
    FilePath[0] = disk;
    FAT_fopen (&stdio_FATFS, &res, &file, FilePath, "wb");
    CHK(res == ior_OK);

    s = FAT_fwrite (&stdio_FATFS, &res, "A", 1, 1, &file);
    CHK((res == ior_OK) && (s == 1));

    FAT_rewind (&stdio_FATFS, &res, &file);
    CHK(res == ior_OK);

    c = 'z';
    s = FAT_fread (&stdio_FATFS, &res, &c, 1, 1, &file);
    CHK((res == ior_OK) && (s == 1) && (c == 'A'));

    FAT_fclose (&stdio_FATFS, &res, &file);
    CHK(res == ior_OK);

    strcpy (FilePath, "a:\\.\\file1");
    FilePath[0] = disk;
    FAT_fopen (&stdio_FATFS, &res, &file, FilePath, "rb");
    CHK(res == ior_OK);

    c = 'z';
    s = FAT_fread (&stdio_FATFS, &res, &c, 1, 1, &file);
    CHK((res == ior_OK) && (s == 1) && (c == 'A'));

    FAT_fclose (&stdio_FATFS, &res, &file);
    CHK(res == ior_OK);

    strcpy (FilePath, "a:file1");
    FilePath[0] = disk;
    FAT_fopen (&stdio_FATFS, &res, &file, FilePath, "wb");
    CHK(res == ior_OK);

    c = 'z';
    s = FAT_fread (&stdio_FATFS, &res, &c, 1, 1, &file);
    CHK((res == ior_OK) && (s == 0) && (c == 'z'));

    FAT_fclose (&stdio_FATFS, &res, &file);
    CHK(res == ior_OK);

    strcpy (FilePath, "a:file1");
    FilePath[0] = disk;
    FAT_unlink (&stdio_FATFS, &res, FilePath);
    CHK(res == ior_OK);

    FAT_statvfs (&stdio_FATFS, &res, DiskPath, &FSStatus2);
    CHK(res == ior_OK);
    CHK(FSStatus2.TotalFreeClusterCount == FSStatus1.TotalFreeClusterCount);
  }

  result = 0;

lend:
  return result;
}