// RegisterArc.h | |
#ifndef __REGISTER_ARC_H | |
#define __REGISTER_ARC_H | |
#include "../Archive/IArchive.h" | |
struct CArcInfo | |
{ | |
const char *Name; | |
const char *Ext; | |
const char *AddExt; | |
Byte ClassId; | |
Byte SignatureSize; | |
Byte Signature[20]; | |
UInt16 SignatureOffset; | |
UInt16 Flags; | |
Func_CreateInArchive CreateInArchive; | |
Func_CreateOutArchive CreateOutArchive; | |
Func_IsArc IsArc; | |
bool IsMultiSignature() const { return (Flags & NArcInfoFlags::kMultiSignature) != 0; } | |
}; | |
void RegisterArc(const CArcInfo *arcInfo) throw(); | |
#define REGISTER_ARC_NAME(x) CRegister ## x | |
#define REGISTER_ARC(x) struct REGISTER_ARC_NAME(x) { \ | |
REGISTER_ARC_NAME(x)() { RegisterArc(&g_ArcInfo); }}; \ | |
static REGISTER_ARC_NAME(x) g_RegisterArc; | |
#define REGISTER_ARC_DEC_SIG(x) struct REGISTER_ARC_NAME(x) { \ | |
REGISTER_ARC_NAME(x)() { g_ArcInfo.Signature[0]--; RegisterArc(&g_ArcInfo); }}; \ | |
static REGISTER_ARC_NAME(x) g_RegisterArc; | |
#define IMP_CreateArcIn_2(c) \ | |
static IInArchive *CreateArc() { return new c; } | |
#define IMP_CreateArcIn IMP_CreateArcIn_2(CHandler) | |
#ifdef EXTRACT_ONLY | |
#define IMP_CreateArcOut | |
#define REF_CreateArc_Pair CreateArc, NULL | |
#else | |
#define IMP_CreateArcOut static IOutArchive *CreateArcOut() { return new CHandler; } | |
#define REF_CreateArc_Pair CreateArc, CreateArcOut | |
#endif | |
#endif |