1 // RegisterArc.h 2 3 #ifndef __REGISTER_ARC_H 4 #define __REGISTER_ARC_H 5 6 #include "../Archive/IArchive.h" 7 8 struct CArcInfo 9 { 10 UInt16 Flags; 11 Byte Id; 12 Byte SignatureSize; 13 UInt16 SignatureOffset; 14 15 const Byte *Signature; 16 const char *Name; 17 const char *Ext; 18 const char *AddExt; 19 20 Func_CreateInArchive CreateInArchive; 21 Func_CreateOutArchive CreateOutArchive; 22 Func_IsArc IsArc; 23 IsMultiSignatureCArcInfo24 bool IsMultiSignature() const { return (Flags & NArcInfoFlags::kMultiSignature) != 0; } 25 }; 26 27 void RegisterArc(const CArcInfo *arcInfo) throw(); 28 29 30 #define IMP_CreateArcIn_2(c) \ 31 static IInArchive *CreateArc() { return new c; } 32 33 #define IMP_CreateArcIn IMP_CreateArcIn_2(CHandler()) 34 35 #ifdef EXTRACT_ONLY 36 #define IMP_CreateArcOut 37 #define CreateArcOut NULL 38 #else 39 #define IMP_CreateArcOut static IOutArchive *CreateArcOut() { return new CHandler(); } 40 #endif 41 42 #define REGISTER_ARC_V(n, e, ae, id, sigSize, sig, offs, flags, crIn, crOut, isArc) \ 43 static const CArcInfo g_ArcInfo = { flags, id, sigSize, offs, sig, n, e, ae, crIn, crOut, isArc } ; \ 44 45 #define REGISTER_ARC_R(n, e, ae, id, sigSize, sig, offs, flags, crIn, crOut, isArc) \ 46 REGISTER_ARC_V(n, e, ae, id, sigSize, sig, offs, flags, crIn, crOut, isArc) \ 47 struct CRegisterArc { CRegisterArc() { RegisterArc(&g_ArcInfo); }}; \ 48 static CRegisterArc g_RegisterArc; 49 50 51 #define REGISTER_ARC_I_CLS(cls, n, e, ae, id, sig, offs, flags, isArc) \ 52 IMP_CreateArcIn_2(cls) \ 53 REGISTER_ARC_R(n, e, ae, id, ARRAY_SIZE(sig), sig, offs, flags, CreateArc, NULL, isArc) 54 55 #define REGISTER_ARC_I_CLS_NO_SIG(cls, n, e, ae, id, offs, flags, isArc) \ 56 IMP_CreateArcIn_2(cls) \ 57 REGISTER_ARC_R(n, e, ae, id, 0, NULL, offs, flags, CreateArc, NULL, isArc) 58 59 #define REGISTER_ARC_I(n, e, ae, id, sig, offs, flags, isArc) \ 60 REGISTER_ARC_I_CLS(CHandler(), n, e, ae, id, sig, offs, flags, isArc) 61 62 #define REGISTER_ARC_I_NO_SIG(n, e, ae, id, offs, flags, isArc) \ 63 REGISTER_ARC_I_CLS_NO_SIG(CHandler(), n, e, ae, id, offs, flags, isArc) 64 65 66 #define REGISTER_ARC_IO(n, e, ae, id, sig, offs, flags, isArc) \ 67 IMP_CreateArcIn \ 68 IMP_CreateArcOut \ 69 REGISTER_ARC_R(n, e, ae, id, ARRAY_SIZE(sig), sig, offs, flags, CreateArc, CreateArcOut, isArc) 70 71 #define REGISTER_ARC_IO_DECREMENT_SIG(n, e, ae, id, sig, offs, flags, isArc) \ 72 IMP_CreateArcIn \ 73 IMP_CreateArcOut \ 74 REGISTER_ARC_V(n, e, ae, id, ARRAY_SIZE(sig), sig, offs, flags, CreateArc, CreateArcOut, isArc) \ 75 struct CRegisterArcDecSig { CRegisterArcDecSig() { sig[0]--; RegisterArc(&g_ArcInfo); }}; \ 76 static CRegisterArcDecSig g_RegisterArc; 77 78 #endif 79