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