OSDN Git Service

(none)
[hos/hos-v4a.git] / aplfw / volume / fat / fatfile_read.c
1
2
3 #include <string.h>
4 #include "fatfile_local.h"
5
6
7 /* 読み出し */
8 FILE_SIZE FatFile_Read(
9                         HANDLE    hFile,
10                         void      *pBuf,
11                         FILE_SIZE Size)
12 {
13         C_FATFILE     *self;
14         void          *pClusterBuf;
15         FATVOL_UINT   ulBlock;
16         FILE_SIZE     ReadSize;
17         
18         /* ハンドル取得 */
19         self = (C_FATFILE *)hFile;
20         
21         /* サイズオーバーするなら */
22         if ( self->FilePos + Size > self->FileSize )
23         {
24                 /* サイズ更新されていないかディレクトリテーブルを参照 */
25                 if ( self->hDir != NULL )
26                 {
27                 }
28         }
29         
30         /* サイズクリップ */
31         if ( Size > self->FileSize - self->FilePos )
32         {
33                 Size = self->FileSize - self->FilePos;
34         }
35         
36         /* 要求読み出し量保存 */
37         ReadSize = Size;
38         
39         /* 読み出し */
40         while ( Size > 0 && self->FilePos < self->FileSize )
41         {
42                 FILE_POS      ReadStart;
43                 FILE_SIZE     ReadSize;
44                 unsigned char *pubClusterBuf;
45                 
46                 /* 転送位置計算 */
47                 ReadStart = self->FilePos % self->uiClusterSize;
48                 ReadSize  = self->uiClusterSize - ReadStart;
49                 if ( ReadSize > Size )
50                 {
51                         ReadSize = Size;
52                 }
53                 
54                 /* バッファ取得 */
55                 if ( FatVol_GetClusterBuf(self->pFatVol, self->uiCurrentCluster, &pClusterBuf, 1) != FATVOL_ERR_OK )
56                 {
57                         break;
58                 }
59                 
60                 /* 転送 */
61                 memcpy(pBuf, (char *)pClusterBuf + ReadStart, ReadSize);
62
63                 /* バッファ開放 */
64                 FatVol_RelClusterBuf(self->pFatVol, pClusterBuf, 0);
65                 
66                 /* サイズ更新 */
67                 self->FilePos += ReadSize;
68                 pBuf =  (char *)pBuf + ReadSize;
69                 Size -= ReadSize;
70                 
71                 /* 次のクラスタに進む */
72                 self->uiCurrentCluster = FatVol_GetNextCluster(self->pFatVol, self->uiCurrentCluster);
73         }
74         
75         return ReadSize - Size;
76 }
77
78
79 /* end of file */