1 /*---------------------------------------------------------------------------*
2 Project: NintendoWare
3 File: lyt_Arc.h
4
5 Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain proprietary
8 information of Nintendo and/or its licensed developers and are protected by
9 national and international copyright laws. They may not be disclosed to third
10 parties or copied or duplicated in any form, in whole or in part, without the
11 prior written consent of Nintendo.
12
13 The content herein is highly confidential and should be handled accordingly.
14
15 $Revision: 31311 $
16 *---------------------------------------------------------------------------*/
17
18 #ifndef NW_LYT_ARC_H_
19 #define NW_LYT_ARC_H_
20
21 #if defined(_MSC_VER) && _MSC_VER >= 1500
22 #pragma once
23 #endif
24
25 #include <nn/types.h>
26
27 namespace nw
28 {
29 namespace lyt
30 {
31
32 //! :private
33 //!
34 //! @brief アーカイブヘッダ構造体
35 //!
36 typedef struct
37 {
38 u32 signature; //!< ファイルシグネチャ
39 u16 byteOrder; //!< バイトオーダーマーク
40 u16 headerSize; //!< ヘッダサイズ
41 u32 version; //!< ファイルバージョン
42 u32 fileSize; //!< ファイルサイズ
43 s32 fstStart; //!< エントリテーブル部の開始位置
44 s32 fstSize; //!< エントリテーブル部のサイズ
45 s32 fileStart; //!< ファイルデータ部の開始位置
46
47 } ARCHeader;
48
49 //! @details :private
50 const u32 DARCH_SIGNATURE = 0x63726164; // 'darc'
51
52 //! @details :private
53 const u16 DARCH_BYTE_ORDER_MARK = 0xFEFF;
54
55 //! @details :private
56 const u32 DARCH_VERSION = 0x01000000;
57
58 //! :category ARC
59 //!
60 //! @brief アーカイブハンドル構造体
61 //!
62 typedef struct
63 {
64 void* archiveStartAddr;
65 void* FSTStart;
66 void* fileStart;
67 u32 entryNum;
68 wchar_t* FSTStringStart;
69 u32 FSTLength;
70 u32 currDir;
71
72 } ARCHandle;
73
74 //! :category ARC
75 //!
76 //! @brief ファイル情報構造体
77 //!
78 typedef struct
79 {
80 ARCHandle* handle;
81 u32 startOffset;
82 u32 length;
83
84 } ARCFileInfo;
85
86 //! :category ARC
87 //!
88 //! @brief ディレクトリ構造体
89 //!
90 typedef struct
91 {
92 ARCHandle* handle;
93 u32 entryNum;
94 u32 location;
95 u32 next;
96 } ARCDir;
97
98 //! :category ARC
99 //!
100 //! @brief ディレクトリエントリ構造体
101 //!
102 typedef struct
103 {
104 ARCHandle* handle;
105 u32 entryNum;
106 bool isDir;
107 wchar_t* name;
108 } ARCDirEntry;
109
110 //! @name ARC
111 //@{
112
113 //! :category ARC
114 //!
115 //! @brief アーカイブをオープンします。
116 //!
117 //! @param[in] arcStart メモリ上のアーカイブファイルの先頭アドレスです。
118 //! @param[out] handle 初期化する ARCHandle 構造体です。
119 //!
120 //! @return アーカイブのオープンに成功すれば true を返します。
121 //!
122 //! @details
123 //! ARCInitHandle() は メモリ上にロードされたアーカイブファイルを
124 //! 参照できるように ARCHandle 構造体を初期化します。
125 //!
126 //! この関数を呼び出す前に、アーカイブファイルの少なくともヘッダ
127 //! および FST 領域をメモリ上にロードしておく必要があります。
128 //!
129 bool ARCInitHandle(void* arcStart, ARCHandle* handle);
130
131 //! :category ARC
132 //!
133 //! @brief アーカイブ内のファイルをオープンします。
134 //!
135 //! @param [in] handle ARCHandle 構造体です。
136 //! @param [in] fileName アーカイブ内のファイル名です。
137 //! @param [out] af 初期化する ARCFileInfo 構造体です。
138 //!
139 //! @return 成功すれば true を、そうでなければ false を返します。
140 //!
141 //! @details
142 //! アーカイブ内のファイルをオープンし、指定した ARCFileInfo
143 //! 構造体を初期化します。
144 //!
145 //! fileName に相対パスを指定した場合には、 ARCHandle 構造体の
146 //! カレントディレクトリからの相対パスとなります。
147 //!
148 //! あらかじめ ARCInitHandle() でアーカイブファイルの
149 //! ARCHandle 構造体を初期化しておく必要があります。
150 //!
151 //! @sa ARCInitHandle
152 //! @sa ARCFastOpen
153 //! @sa ARCChangeDir
154 //!
155 bool ARCOpen(ARCHandle* handle, const wchar_t* fileName, ARCFileInfo* af);
156
157 //! :category ARC
158 //!
159 //! @brief エントリ番号を指定してアーカイブ内のファイルをオープンします。
160 //!
161 //! @param[in] handle ARCHandle 構造体です。
162 //! @param[in] entrynum ファイルのエントリ番号です。
163 //! @param[out] af 初期化する ARCFileInfo 構造体です。
164 //!
165 //! @return 成功すれば true を、そうでなければ false を返します。
166 //!
167 //! @details
168 //! ARCFastOpen() は、アーカイブ内のファイルをオープンし、
169 //! 指定した ARCFileInfo 構造体を初期化します。
170 //!
171 //! ARCOpen() との違いは、ファイル名を指定する代わりにエントリ番号を
172 //! 指定することです。あらかじめ、ARCConvertPathToEntrynum() などで
173 //! ファイルの entrynum を取得する必要があります。
174 //!
175 //! あらかじめ ARCInitHandle() でアーカイブファイルの
176 //! ARCHandle 構造体を初期化しておく必要があります。
177 //!
178 //! @sa ARCOpen
179 //! @sa ARCInitHandle
180 //! @sa ARCConvertPathToEntrynum
181 //! @sa ARCGetDirEntryEntrynum
182 //!
183 bool ARCFastOpen(ARCHandle* handle, s32 entrynum, ARCFileInfo* af);
184
185 //! :category ARC
186 //!
187 //! @brief アーカイブ内のファイルをオープンします。
188 //!
189 //! @param [in] handle ARCHandle 構造体です。
190 //! @param [in] dirent アーカイブ内のファイルを示すディレクトリエントリ構造体です。
191 //! @param [out] af 初期化する ARCFileInfo 構造体です。
192 //!
193 //! @return 成功すれば true を、そうでなければ false を返します。
194 //!
195 //! @details
196 //! ディレクトリエントリ構造体で示されたアーカイブ内のファイルをオープンし、
197 //! 指定した ARCFileInfo 構造体を初期化します。
198 //!
199 //! ディレクトリエントリ構造体が示すエントリはファイルでなければなりません。
200 //!
201 //! あらかじめ ARCReadDir() でディレクトリエントリ構造体を初期化しておく
202 //! 必要があります。
203 //!
204 //! あらかじめ ARCInitHandle() でアーカイブファイルの
205 //! ARCHandle 構造体を初期化しておく必要があります。
206 //!
207 //! @sa ARCInitHandle
208 //! @sa ARCFastOpen
209 //! @sa ARCReadDir
210 //!
ARCOpen(ARCHandle * handle,ARCDirEntry * dirent,ARCFileInfo * af)211 NW_INLINE bool ARCOpen(ARCHandle* handle, ARCDirEntry* dirent, ARCFileInfo* af)
212 {
213 NW_NULL_ASSERT(dirent);
214 return ARCFastOpen(handle, static_cast<s32>(dirent->entryNum), af);
215 }
216
217 //! :category ARC
218 //!
219 //! @brief アーカイブ内のファイルのパスをエントリ番号に変換します。
220 //!
221 //! @param[in] handle ARCHandle 構造体です。
222 //! @param[in] pathPtr アーカイブ内のファイル名です。
223 //!
224 //! @return アーカイブ内にファイル名が見つからない場合は、-1 を返します。
225 //! 変換に成功すれば、エントリ番号(0 または正数)を返します。
226 //!
227 //! @details
228 //! ARCConvertPathToEntrynum() は、アーカイブ内のファイルのパスを
229 //! エントリ番号に変換します。
230 //!
231 //! pathPtr に相対パスを指定した場合には、 ARCHandle 構造体の
232 //! カレントディレクトリからの相対パスとなります。
233 //!
234 //! あらかじめ ARCInitHandle() で ARCHandle 構造体を初期化しておく
235 //! 必要があります。
236 //!
237 //! @sa ARCFastOpen
238 //! @sa ARCInitHandle
239 //! @sa ARCChangeDir
240 //!
241 s32 ARCConvertPathToEntrynum(ARCHandle* handle, const wchar_t* pathPtr);
242
243 //! :category ARC
244 //!
245 //! @brief エントリの種類がディレクトリかを取得します。
246 //!
247 //! @param[in] handle ARCHandle 構造体です。
248 //! @param[in] entrynum エントリ番号です。
249 //!
250 //! @return エントリの種類がディレクトリの場合は true を返します。
251 //! エントリの種類がファイルの場合は false を返します。
252 //!
253 //! あらかじめ ARCInitHandle() で ARCHandle 構造体を初期化しておく
254 //! 必要があります。
255 //!
256 //! @sa ARCInitHandle
257 //!
258 bool ARCEntrynumIsDir(const ARCHandle * handle, s32 entrynum);
259
260 //! :category ARC
261 //!
262 //! @brief メモリ上のファイルの先頭アドレスを取得します。
263 //!
264 //! @param[in] af ファイルの ARCFileInfo 構造体です。
265 //!
266 //! @return ファイルの先頭アドレスを返します。
267 //!
268 //! アーカイブファイル全体がメモリ上にあるとして、 ARCGetStartAddrInMem() は、
269 //! メモリ上のファイルの先頭アドレスを返します。
270 //!
271 //! アーカイブ全体をロードしていない場合にこの関数をコールしたときの動作は
272 //! 保証できません。
273 //!
274 //! @sa ARCFastOpen
275 //! @sa ARCOpen
276 //! @sa ARCGetLength
277 //!
278 void* ARCGetStartAddrInMem(ARCFileInfo* af);
279
280 //! :category ARC
281 //!
282 //! @brief アーカイブの先頭からのファイルの開始オフセットを取得します。
283 //!
284 //! @param[in] af ファイルの ARCFileInfo 構造体です。
285 //!
286 //! @return ファイルの開始オフセットを返します。
287 //!
288 //! @sa ARCFastOpen
289 //! @sa ARCOpen
290 //! @sa ARCGetLength
291 //!
292 u32 ARCGetStartOffset(ARCFileInfo* af);
293
294 //! :category ARC
295 //!
296 //! @brief ファイルのサイズを取得します。
297 //!
298 //! @param[in] af ファイルの ARCFileInfo 構造体です。
299 //!
300 //! @return ファイルのサイズを返します。
301 //!
302 //! @sa ARCFastOpen
303 //! @sa ARCOpen
304 //! @sa ARCGetStartAddrInMem
305 //! @sa ARCGetStartOffset
306 //!
307 u32 ARCGetLength(ARCFileInfo* af);
308
309 //! :category ARC
310 //!
311 //! @brief ファイルをクローズします。
312 //!
313 //! @param[in,out] af クローズするファイルの ARCFileInfo 構造体です。
314 //!
315 //! @return 現在の実装では、常に true を返します。
316 //!
317 //! @sa ARCFastOpen
318 //! @sa ARCOpen
319 //!
320 bool ARCClose(ARCFileInfo* af);
321
322 //! :category ARC
323 //!
324 //! @brief アーカイブのカレントディレクトリを変更します。
325 //!
326 //! @param[in,out] handle ARCHandle 構造体です。
327 //! @param[in] dirName 変更するディレクトリです。
328 //!
329 //! @return 成功すれば true を、そうでなければ false を返します。
330 //!
331 //! @details
332 //! ARCChangeDir() は、アーカイブのカレントディレクトリを変更します。
333 //!
334 //! あらかじめ ARCInitHandle() で ARCHandle 構造体を初期化しておく
335 //! 必要があります。
336 //!
337 //! @sa ARCInitHandle
338 //! @sa ARCOpen
339 //! @sa ARCConvertPathToEntrynum
340 //!
341 bool ARCChangeDir(ARCHandle* handle, const wchar_t* dirName);
342
343 //! :category ARC
344 //!
345 //! @brief アーカイブのカレントディレクトリを変更します。
346 //!
347 //! @param[in,out] handle ARCHandle 構造体です。
348 //! @param[in] entrynum 変更するディレクトリのエントリ番号です。
349 //!
350 //! @return 成功すれば true を、そうでなければ false を返します。
351 //!
352 //! @details
353 //! アーカイブのカレントディレクトリをエントリ番号で指定したディレクトリに
354 //! 変更します。
355 //!
356 //! エントリ番号で指定したエントリはディレクトリでなければなりません。
357 //!
358 //! あらかじめ ARCInitHandle() で ARCHandle 構造体を初期化しておく
359 //! 必要があります。
360 //!
361 //! @sa ARCInitHandle
362 //!
363 bool ARCChangeDir(ARCHandle* handle, s32 entrynum);
364
365 //! :category ARC
366 //!
367 //! @brief アーカイブのカレントディレクトリを変更します。
368 //!
369 //! @param[in,out] handle ARCHandle 構造体です。
370 //! @param[in] dir 変更するディレクトリのディレクトリ構造体です。
371 //!
372 //! @return 成功すれば true を、そうでなければ false を返します。
373 //!
374 //! @details
375 //! アーカイブのカレントディレクトリをディレクトリ構造体が示す
376 //! ディレクトリに変更します。
377 //!
378 //! あらかじめ ARCOpenDir() でディレクトリ構造体を初期化しておく
379 //! 必要があります。
380 //!
381 //! あらかじめ ARCInitHandle() で ARCHandle 構造体を初期化しておく
382 //! 必要があります。
383 //!
384 //! @sa ARCInitHandle
385 //! @sa ARCOpenDir
386 //!
ARCChangeDir(ARCHandle * handle,ARCDir * dir)387 NW_INLINE bool ARCChangeDir(ARCHandle* handle, ARCDir* dir)
388 {
389 NW_NULL_ASSERT(dir);
390 return ARCChangeDir(handle, static_cast<s32>(dir->entryNum));
391 }
392
393 //! :category ARC
394 //!
395 //! @brief アーカイブのカレントディレクトリを変更します。
396 //!
397 //! @param[in,out] handle ARCHandle 構造体です。
398 //! @param[in] dirent 変更するディレクトリのディレクトリエントリ構造体です。
399 //!
400 //! @return 成功すれば true を、そうでなければ false を返します。
401 //!
402 //! @details
403 //! アーカイブのカレントディレクトリをディレクトリエントリ構造体が示す
404 //! ディレクトリに変更します。
405 //!
406 //! ディレクトリエントリ構造体が示すエントリはディレクトリでなければなりません。
407 //!
408 //! あらかじめ ARCReadDir() でディレクトリエントリ構造体を初期化しておく
409 //! 必要があります。
410 //!
411 //! あらかじめ ARCInitHandle() で ARCHandle 構造体を初期化しておく
412 //! 必要があります。
413 //!
414 //! @sa ARCInitHandle
415 //! @sa ARCReadDir
416 //!
ARCChangeDir(ARCHandle * handle,ARCDirEntry * dirent)417 NW_INLINE bool ARCChangeDir(ARCHandle* handle, ARCDirEntry* dirent)
418 {
419 NW_NULL_ASSERT(dirent);
420 return ARCChangeDir(handle, static_cast<s32>(dirent->entryNum));
421 }
422
423 //! :category ARC
424 //!
425 //! @brief アーカイブのカレントディレクトリを取得します。
426 //!
427 //! @param[in] handle ARCHandle 構造体です。
428 //! @param[out] path パスを格納するためのバッファです。
429 //! @param[in] maxlen バッファのサイズです。
430 //!
431 //! @return パスがバッファ内に収まれば true を返します。
432 //! そうでなければ false を返します。
433 //!
434 //! @details
435 //! アーカイブのカレントディレクトリのパス文字列を指定されたバッファに
436 //! 書き込みます。
437 //!
438 //! @sa ARCInitHandle
439 //! @sa ARCChangeDir
440 //!
441 bool ARCGetCurrentDir(ARCHandle* handle, wchar_t* path, u32 maxlen);
442
443 //! :category ARC
444 //!
445 //! @brief ディレクトリをオープンします。
446 //!
447 //! @param[in] handle ARCHandle 構造体です。
448 //! @param[in] dirName オープンするディレクトリ名です。
449 //! @param[out] dir 初期化するディレクトリ構造体です。
450 //!
451 //! @return ディレクトリをオープンできた場合は true を返します。
452 //!
453 //! @details
454 //! dirName に相対パスを指定した場合には、 ARCHandle 構造体の
455 //! カレントディレクトリからの相対パスとなります。
456 //!
457 //! @sa ARCInitHandle
458 //! @sa ARCReadDir
459 //! @sa ARCCloseDir
460 //! @sa ARCChangeDir
461 //!
462 bool ARCOpenDir(ARCHandle* handle, const wchar_t* dirName, ARCDir* dir);
463
464 //! :category ARC
465 //!
466 //! @brief ディレクトリをオープンします。
467 //!
468 //! @param[in] handle ARCHandle 構造体です。
469 //! @param[in] entrynum オープンするディレクトリのエントリ番号です。
470 //! @param[out] dir 初期化するディレクトリ構造体です。
471 //!
472 //! @return ディレクトリをオープンできた場合は true を返します。
473 //!
474 //! @details
475 //! エントリ番号が示すディレクトリをオープンし、指定した ARCDir 構造体を
476 //! 初期化します。
477 //!
478 //! あらかじめ ARCInitHandle() で ARCHandle 構造体を初期化しておく
479 //! 必要があります。
480 //!
481 //! @sa ARCInitHandle
482 //! @sa ARCReadDir
483 //! @sa ARCCloseDir
484 //!
485 bool ARCOpenDir(ARCHandle* handle, s32 entrynum, ARCDir* dir);
486
487 //! :category ARC
488 //!
489 //! @brief ディレクトリをオープンします。
490 //!
491 //! @param[in] handle ARCHandle 構造体です。
492 //! @param[in] dirent オープンするディレクトリを示すディレクトリエントリ構造体です。
493 //! @param[out] dir 初期化するディレクトリ構造体です。
494 //!
495 //! @return ディレクトリをオープンできた場合は true を返します。
496 //!
497 //! @details
498 //! ディレクトリエントリ構造体が示すディレクトリをオープンし、
499 //! 指定した ARCDir 構造体を初期化します。
500 //!
501 //! ディレクトリエントリ構造体が示すエントリはディレクトリでなければなりません。
502 //!
503 //! あらかじめ ARCReadDir() でディレクトリエントリ構造体を初期化しておく
504 //! 必要があります。
505 //!
506 //! あらかじめ ARCInitHandle() で ARCHandle 構造体を初期化しておく
507 //! 必要があります。
508 //!
509 //! @sa ARCInitHandle
510 //! @sa ARCReadDir
511 //! @sa ARCCloseDir
512 //!
ARCOpenDir(ARCHandle * handle,ARCDirEntry * dirent,ARCDir * dir)513 NW_INLINE bool ARCOpenDir(ARCHandle* handle, ARCDirEntry* dirent, ARCDir* dir)
514 {
515 NW_NULL_ASSERT(dirent);
516 return ARCOpenDir(handle, static_cast<s32>(dirent->entryNum), dir);
517 }
518
519 //! :category ARC
520 //!
521 //! @brief ディレクトリエントリの情報を取得します。
522 //!
523 //! @param[in,out] dir 読み込むディレクトリのディレクトリ構造体です。
524 //! @param[out] dirent 初期化するディレクトリエントリ構造体です。
525 //!
526 //! @return ディレクトリエントリが存在すれば true を返します。
527 //! ディレクトリの最後に到達済みの場合は false を返します。
528 //!
529 //! @details
530 //! 次のディレクトリエントリの情報を取得します。
531 //!
532 //! ディレクトリエントリは、ディレクトリかまたはファイルです。
533 //! エントリの種類は ARCDirEntryIsDir() で取得できます。
534 //!
535 //! エントリの種類に応じて ARCOpen() または ARCOpenDir() で
536 //! エントリをオープンできます。
537 //!
538 //! @sa ARCOpenDir
539 //! @sa ARCCloseDir
540 //! @sa ARCSeekDir
541 //! @sa ARCRewindDir
542 //! @sa ARCDirEntryIsDir
543 //! @sa ARCOpen
544 //! @sa ARCOpenDir
545 //!
546 bool ARCReadDir(ARCDir* dir, ARCDirEntry* dirent);
547
548 //! :category ARC
549 //!
550 //! @brief ディレクトリをクローズします。
551 //!
552 //! @param[in,out] dir クローズするディレクトリのディレクトリ構造体です。
553 //!
554 //! @return 正常に実行できれば true が返ります。
555 //!
556 //! @sa ARCOpenDir
557 //! @sa ARCReadDir
558 //!
559 bool ARCCloseDir(ARCDir* dir);
560
561 //! :category ARC
562 //!
563 //! @brief ディレクトリの読み出し位置を取得します。
564 //!
565 //! @param[in] dir ディレクトリ構造体です。
566 //!
567 //! @return 現在の読み出し位置を返します。
568 //!
569 //! @details
570 //! ARCTellDir() は次の ARCReadDir() 時に
571 //! ディレクトリから読み出されるディレクトリエントリの位置を返します。
572 //!
573 //! この関数は、ARCSeekDir() と組み合わせて使用することが想定されています。
574 //! ARCTellDir() で現在の位置を「保存」し、後で ARCSeekDir() により
575 //! 「復元」できます。
576 //!
577 //! @sa ARCSeekDir
578 //! @sa ARCReadDir
579 //!
ARCTellDir(ARCDir * dir)580 NW_INLINE u32 ARCTellDir(ARCDir* dir)
581 {
582 return dir->location;
583 }
584
585 //! :category ARC
586 //!
587 //! @brief ディレクトリの読み出し位置を設定します。
588 //!
589 //! @param[in,out] dir ディレクトリ構造体です。
590 //! @param[in] loc 設定する読み出し位置です。
591 //!
592 //! @details
593 //! ARCSeekDir() は次の ARCReadDir() 時に読み出されるディレクトリエントリの
594 //! 位置を指定します。
595 //!
596 //! 引数 loc には、先に ARCTellDir() で取得した位置を指定します。
597 //!
598 //! この関数は、ARCTellDir() と組み合わせて使用することが想定されています。
599 //! ARCTellDir()で現在の場所を「保存」し、後で ARCSeekDir() により
600 //! 「復元」できます。
601 //!
602 //! 注意:loc はディレクトリ内におけるディレクトリエントリの番号ではありません。
603 //!
604 //! @sa ARCTellDir
605 //! @sa ARCReadDir
606 //!
ARCSeekDir(ARCDir * dir,u32 loc)607 NW_INLINE void ARCSeekDir(ARCDir* dir, u32 loc)
608 {
609 dir->location = loc;
610 }
611
612 //! :category ARC
613 //!
614 //! @brief ディレクトリの読み出し位置をディレクトリの最初へリセットします。
615 //!
616 //! @param[in,out] dir ディレクトリ構造体です。
617 //!
618 //! @sa ARCReadDir
619 //!
ARCRewindDir(ARCDir * dir)620 NW_INLINE void ARCRewindDir(ARCDir* dir)
621 {
622 dir->location = dir->entryNum + 1;
623 }
624
625 //! :category ARC
626 //!
627 //! @brief ディレクトリエントリの名前を取得します。
628 //!
629 //! @param[in] dirent ディレクトリエントリ構造体です。
630 //!
631 //! @return ディレクトリエントリの名前へのポインタ。
632 //!
633 //! @details
634 //! ディレクトリエントリの名前はパスを含みません。
635 //!
636 //! @sa ARCReadDir
637 //!
ARCGetDirEntryName(ARCDirEntry * dirent)638 NW_INLINE const wchar_t* ARCGetDirEntryName(ARCDirEntry* dirent)
639 {
640 return dirent->name;
641 }
642
643 //! :category ARC
644 //!
645 //! @brief ディレクトリエントリのエントリ番号を取得します。
646 //!
647 //! @param[in] dirent ディレクトリエントリ構造体です。
648 //!
649 //! @return ディレクトリエントリのエントリ番号を返します。
650 //!
651 //! @sa ARCReadDir
652 //!
ARCGetDirEntryEntrynum(ARCDirEntry * dirent)653 NW_INLINE s32 ARCGetDirEntryEntrynum(ARCDirEntry* dirent)
654 {
655 return static_cast<s32>(dirent->entryNum);
656 }
657
658 //! :category ARC
659 //!
660 //! @brief ディレクトリエントリがディレクトリであるかどうか調べます。
661 //!
662 //! @param[in] dirent ディレクトリエントリ構造体です。
663 //!
664 //! @return ディレクトリエントリがディレクトリであれば true を、
665 //! そうでなければ false を返します。
666 //!
667 //! @sa ARCReadDir
668 //!
ARCDirEntryIsDir(ARCDirEntry * dirent)669 NW_INLINE bool ARCDirEntryIsDir(ARCDirEntry* dirent)
670 {
671 return dirent->isDir;
672 }
673
674 // @}
675
676 } // namespace lyt
677 } // namespace nw
678
679 #endif // NW_LYT_ARC_H_
680