• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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   UInt32 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   UInt32 TimeFlags;
21 
22   Func_CreateInArchive CreateInArchive;
23   Func_CreateOutArchive CreateOutArchive;
24   Func_IsArc IsArc;
25 
IsMultiSignatureCArcInfo26   bool IsMultiSignature() const { return (Flags & NArcInfoFlags::kMultiSignature) != 0; }
27 };
28 
29 void RegisterArc(const CArcInfo *arcInfo) throw();
30 
31 
32 #define IMP_CreateArcIn_2(c) \
33   static IInArchive *CreateArc() { return new c; }
34 
35 #define IMP_CreateArcIn IMP_CreateArcIn_2(CHandler())
36 
37 #ifdef EXTRACT_ONLY
38   #define IMP_CreateArcOut
39   #define CreateArcOut NULL
40 #else
41   #define IMP_CreateArcOut static IOutArchive *CreateArcOut() { return new CHandler(); }
42 #endif
43 
44 #define REGISTER_ARC_V(n, e, ae, id, sigSize, sig, offs, flags, tf, crIn, crOut, isArc) \
45   static const CArcInfo g_ArcInfo = { flags, id, sigSize, offs, sig, n, e, ae, tf, crIn, crOut, isArc } ; \
46 
47 #define REGISTER_ARC_R(n, e, ae, id, sigSize, sig, offs, flags, tf, crIn, crOut, isArc) \
48   REGISTER_ARC_V      (n, e, ae, id, sigSize, sig, offs, flags, tf, crIn, crOut, isArc) \
49   struct CRegisterArc { CRegisterArc() { RegisterArc(&g_ArcInfo); }}; \
50   static CRegisterArc g_RegisterArc;
51 
52 
53 #define REGISTER_ARC_I_CLS(cls, n, e, ae, id, sig, offs, flags, isArc) \
54   IMP_CreateArcIn_2(cls) \
55   REGISTER_ARC_R(n, e, ae, id, ARRAY_SIZE(sig), sig, offs, flags, 0, CreateArc, NULL, isArc)
56 
57 #define REGISTER_ARC_I_CLS_NO_SIG(cls, n, e, ae, id, offs, flags, isArc) \
58   IMP_CreateArcIn_2(cls) \
59   REGISTER_ARC_R(n, e, ae, id, 0, NULL, offs, flags, 0, CreateArc, NULL, isArc)
60 
61 #define REGISTER_ARC_I(n, e, ae, id, sig, offs, flags, isArc) \
62   REGISTER_ARC_I_CLS(CHandler(), n, e, ae, id, sig, offs, flags, isArc)
63 
64 #define REGISTER_ARC_I_NO_SIG(n, e, ae, id, offs, flags, isArc) \
65   REGISTER_ARC_I_CLS_NO_SIG(CHandler(), n, e, ae, id, offs, flags, isArc)
66 
67 
68 #define REGISTER_ARC_IO(n, e, ae, id, sig, offs, flags, tf, isArc) \
69   IMP_CreateArcIn \
70   IMP_CreateArcOut \
71   REGISTER_ARC_R(n, e, ae, id, ARRAY_SIZE(sig), sig, offs, flags, tf, CreateArc, CreateArcOut, isArc)
72 
73 #define REGISTER_ARC_IO_DECREMENT_SIG(n, e, ae, id, sig, offs, flags, tf, isArc) \
74   IMP_CreateArcIn \
75   IMP_CreateArcOut \
76   REGISTER_ARC_V(n, e, ae, id, ARRAY_SIZE(sig), sig, offs, flags, tf, CreateArc, CreateArcOut, isArc) \
77   struct CRegisterArcDecSig { CRegisterArcDecSig() { sig[0]--; RegisterArc(&g_ArcInfo); }}; \
78   static CRegisterArcDecSig g_RegisterArc;
79 
80 #endif
81