OSDN Git Service

(none)
[hos/hos-v4a.git] / aplfw / volume / fat / fatvol_open.c
1
2 #include <string.h>
3 #include "fatvol_local.h"
4
5
6 HANDLE FatVol_Open(C_FATVOL *self, const char *pszPath, int iMode)
7 {
8         unsigned char ubBuf[32];
9         FATVOL_UINT   uiCluster;
10         HANDLE hDir;
11         HANDLE hFile;
12         char   szEntryName[8+3+1];
13         int    iEntryNameLen;
14         char   szName[8+3+1];
15         int    iNameLen;
16         int    iDirEntry;
17         int    i, j;
18         
19         /* ルートを基点にする */
20         if ( *pszPath == '/' )
21         {
22                 pszPath++;
23         }
24         
25         /* ルートディレクトリを開く */
26         hDir = FatVol_CreateFile(self, self->uiRootDirCluster, 0, 0, FILE_MODE_READ | FILE_MODE_WRITE);
27         
28         for ( ; ; )
29         {
30                 /* 名前の部分を検索 */
31                 for ( iNameLen = 0; pszPath[iNameLen] != '\0'; iNameLen++ )
32                 {
33                         if ( pszPath[iNameLen] == '/' )
34                         {
35                                 szName[iNameLen] = '\0';
36                                 break;
37                         }
38                         
39                         /* 大文字に変換 */
40                         if ( pszPath[iNameLen] >= 'a' && pszPath[iNameLen] <= 'z' )
41                         {
42                                 szName[iNameLen] = pszPath[iNameLen] - ('a' - 'A');
43                         }
44                         else
45                         {
46                                 szName[iNameLen] = pszPath[iNameLen];
47                         }
48                 }
49                 
50                 /* ディレクトリエントリを検索 */
51                 iDirEntry = -1;
52                 for ( i = 0; File_Read(hDir, ubBuf, 32, 0) == 32; i++ )
53                 {
54                         /* 0なら打ち切り */
55                         if ( ubBuf[0] == 0x00 )
56                         {
57                                 break;
58                         }
59                         
60                         /* 名前部分取り出し */
61                         iEntryNameLen = 0;
62                         for ( j = 0; j < 8; j++ )
63                         {
64                                 if ( ubBuf[0+j] == ' ' || ubBuf[0+j] == '\0' )
65                                 {
66                                         break;
67                                 }
68                                 szEntryName[iEntryNameLen++] = (char)ubBuf[0+j];
69                         }
70                         szEntryName[iEntryNameLen++] = '.';
71                         for ( j = 0; j < 3; j++ )
72                         {
73                                 if ( ubBuf[8+j] == ' ' || ubBuf[8+j] == '\0' )
74                                 {
75                                         break;
76                                 }
77                                 szEntryName[iEntryNameLen++] = (char)ubBuf[8+j];
78                         }
79                         szEntryName[iEntryNameLen++] = '\0';
80                         if ( iEntryNameLen > 2 && szEntryName[iEntryNameLen-1] == '.' )
81                         {
82                                 szEntryName[--iEntryNameLen] = '\0';
83                         }
84                         
85                         if ( strcmp(szEntryName, szName) == 0 )
86                         {
87                                 iDirEntry = i;
88                                 break;
89                         }
90                 }
91                 
92                 /* 開始クラスタ取得 */
93                 uiCluster = ubBuf[0x1a] + ubBuf[0x1b]*256;
94                 if ( self->iFatType == FATVOL_TYPE_FAT32 )
95                 {
96                         uiCluster += ubBuf[0x14]*256*256 + ubBuf[0x15]*256*256*256;
97                 }
98
99                 /* パス部分の解析が終わっていればここで抜ける */
100                 if ( pszPath[iNameLen] == '\0' )
101                 {
102                         break;
103                 }
104                 
105                 File_Close(hDir);
106                 
107                 /* サブディレクトリがなければエラー */
108                 if ( iDirEntry < 0 || !(ubBuf[0x0b] & 0x10) )
109                 {
110                         return HANDLE_NULL;
111                 }
112                 
113                 /* サブディレクトリを開く */
114                 hDir = FatVol_CreateFile(self, uiCluster, 0, 0, FILE_MODE_READ | FILE_MODE_WRITE);
115                 
116                 pszPath += iNameLen;
117         }
118         
119         /* 既存ファイルがあれば */
120         if ( iDirEntry >= 0 )
121         {
122                 hFile = FatVol_CreateFile(self, uiCluster, hDir, iDirEntry, iMode);
123                 if ( hFile == HANDLE_NULL )
124                 {
125                         File_Close(hDir);
126                 }
127                 return hFile;
128         }
129         
130         File_Close(hDir);
131         return HANDLE_NULL;
132 }
133
134