tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

RegisterArc.h (2620B)


      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 
     24  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