1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     tpl_crc32.h
4 
5   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 19639 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_TPL_CTR_TPL_CRC32_H_
17 #define NN_TPL_CTR_TPL_CRC32_H_
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 namespace nn { namespace tpl { namespace CTR {
24 
25 // テクスチャパッケージ(.ctpk)のヘッダ情報からハッシュ(search_crc32_data())を
26 // 用いてテクスチャを検索するための実装。
27 struct TPK_SEARCH_DATA
28 {
29     const char *szFileName; // 検索するテクスチャファイル名
30     int fileNameLen;        // 比較する文字数(拡張子を比較するかでかわる)
31     const void *infoData;   // テクスチャパッケージのヘッダ情報
32 };
33 
34 /**
35 データブロックに対してCRC32コードを計算する。
36 */
37 unsigned int calculate_crc32(
38     const void *data,
39     unsigned int size);
40 
41 
42 /**
43 先頭にCRC32コードを持つ構造体を検索する。(バイナリサーチ)
44 \param base データ配列へのポインタ(ソート済み)
45 \param num データ数
46 \param width 1要素のサイズ
47 \param crc 検索キーとなるCRCコード
48 \return 一致する最初のデータのインデックス。
49 一致するデータがなければ-1を返す。
50 */
51 int search_crc32_index(
52     const void *base, unsigned int num, unsigned int width, unsigned int crc);
53 
54 
55 /**
56 先頭にCRC32コードを持つ構造体を検索する。(バイナリサーチ)
57 \param base データ配列へのポインタ(ソート済み)
58 \param num データ数
59 \param width 1要素のサイズ
60 \param crc 検索キーとなるCRCコード
61 \param cmpFunc 比較関数
62 \param value 比較関数に渡す比較値
63 \return 一致するデータのインデックス。
64 一致するデータがなければ-1を返す。
65 \par 解説:
66  crcでバイナリーサーチをした後、
67 cmpFuncに渡された比較関数と値valueを使って実際に一致するデータを検索する。
68 偶然複数のデータが同じCRC32コードを持った場合にも対応できる。
69 \par
70  cmpFuncの第一引数には base 上にある構造体データのポインタ、
71 第二引数には value 引数の値が渡される。
72 データが検索対象であれば true を返す。
73 */
74 int search_crc32_data(
75     const void *base, unsigned int num, unsigned int width, unsigned int crc,
76     const void *value);
77 
78 }}} // namespace
79 
80 #ifdef __cplusplus
81 }
82 #endif
83 
84 
85 #endif	// NN_TPL_CTR_TPL_CRC32_H_
86