OSDN Git Service

(none)
[hos/hos-v4a.git] / aplfw / volume / fat / fatvol_getnextcluster.c
1
2 #include <string.h>
3 #include "fatvol_local.h"
4
5
6 FATVOL_UINT FatVol_GetNextCluster(C_FATVOL *self, FATVOL_UINT uiCluster)
7 {
8         FATVOL_UINT uiNextCluster = FATVOL_CLUSTER_ENDMARKER;
9         
10         switch ( self->iFatType )
11         {
12         case FATVOL_TYPE_FAT12:
13                 /* 0xffff0000 からルートディレクトリをマップ */
14                 if ( uiCluster >= 0xffff0000 )
15                 {
16                         return uiCluster + 1;
17                 }
18                 
19                 /* FAT検索 */
20                 if ( uiCluster % 2 == 0 )
21                 {
22                         uiNextCluster = self->pubFatBuf[(uiCluster / 2) * 3 + 0]
23                                                         + ((self->pubFatBuf[(uiCluster / 2) * 3 + 1] & 0x0f) << 8);
24                 }
25                 else
26                 {
27                         uiNextCluster = ((self->pubFatBuf[(uiCluster / 2) * 3 + 1] >> 4) & 0xf)
28                                                         + (self->pubFatBuf[(uiCluster / 2) * 3 + 2] << 4);
29                 }
30                 
31                 if ( uiNextCluster >= 0x0ff7 )
32                 {
33                         uiNextCluster = FATVOL_CLUSTER_ENDMARKER;
34                 }
35                 break;
36         
37         case FATVOL_TYPE_FAT16:
38                 /* 0xffff0000 からルートディレクトリをマップ */
39                 if ( uiCluster >= 0xffff0000 )
40                 {
41                         return uiCluster + 1;
42                 }
43                 
44                 /* FAT検索 */
45                 uiNextCluster = self->pubFatBuf[uiCluster * 2] + self->pubFatBuf[uiCluster * 2 + 1] * 256;
46                 if ( uiNextCluster >= 0xfff7 )
47                 {
48                         uiNextCluster = FATVOL_CLUSTER_ENDMARKER;
49                 }
50                 break;
51
52         case FATVOL_TYPE_FAT32:
53                 uiNextCluster = self->pubFatBuf[uiCluster * 4]
54                                 + self->pubFatBuf[uiCluster * 4 + 1] * 256
55                                 + self->pubFatBuf[uiCluster * 4 + 2] * 256 * 256
56                                 + self->pubFatBuf[uiCluster * 4 + 3] * 256 * 256 * 256;
57                 break;
58         }
59         
60         return uiNextCluster;
61 }
62
63
64 /* end of file */