vms.h
上传用户:andy_li
上传日期:2007-01-06
资源大小:1019k
文件大小:7k
源码类别:

压缩解压

开发平台:

MultiPlatform

  1. /*---------------------------------------------------------------------------
  2.   vms.h
  3.   Generic VMS header file for Info-ZIP's Zip and UnZip.
  4.   ---------------------------------------------------------------------------*/
  5. #ifndef __vms_h
  6. #define __vms_h 1
  7. #ifndef __DESCRIP_LOADED
  8. #include <descrip.h>
  9. #endif
  10. #ifndef __STARLET_LOADED
  11. #include <starlet.h>
  12. #endif
  13. #ifndef __SYIDEF_LOADED
  14. #include <syidef.h>
  15. #endif
  16. #ifndef __ATRDEF_LOADED
  17. #include <atrdef.h>
  18. #endif
  19. #ifndef __FIBDEF_LOADED
  20. #include <fibdef.h>
  21. #endif
  22. #ifndef __IODEF_LOADED
  23. #include <iodef.h>
  24. #endif
  25. #if !defined(_RMS_H) && !defined(__RMS_LOADED)
  26. #include <rms.h>
  27. #endif
  28. #define ERR(s) !((s) & 1)       /* VMS system error */
  29. #ifndef SYI$_VERSION
  30. #define SYI$_VERSION 4096       /* VMS 5.4 definition */
  31. #endif
  32. /*
  33.  *  Under Alpha (DEC C in VAXC mode) and under `good old' VAXC, the FIB unions
  34.  *  are declared as variant_unions.  DEC C (Alpha) in ANSI modes and third
  35.  *  party compilers which do not support `variant_union' define preprocessor
  36.  *  symbols to `hide' the "intermediate union/struct" names from the
  37.  *  programmer's API.
  38.  *  We check the presence of these defines and for DEC's FIBDEF.H defining
  39.  *  __union as variant_union to make sure we access the structure correctly.
  40.  */
  41. #define variant_union 1
  42. #if defined(fib$w_did) || (defined(__union) && (__union == variant_union))
  43. #  define FIB$W_DID     fib$w_did
  44. #  define FIB$W_FID     fib$w_fid
  45. #  define FIB$L_ACCTL   fib$l_acctl
  46. #  define FIB$W_EXCTL   fib$w_exctl
  47. #else
  48. #  define FIB$W_DID     fib$r_did_overlay.fib$w_did
  49. #  define FIB$W_FID     fib$r_fid_overlay.fib$w_fid
  50. #  define FIB$L_ACCTL   fib$r_acctl_overlay.fib$l_acctl
  51. #  define FIB$W_EXCTL   fib$r_exctl_overlay.fib$w_exctl
  52. #endif
  53. #undef variant_union
  54. struct EB_header    /* Common header of extra block */
  55. {   ush tag;
  56.     ush size;
  57.     uch data[1];
  58. };
  59. #ifndef EB_HEADSIZE
  60. #  define EB_HEADSIZE 4
  61. #endif
  62. /*------ Old style Info-ZIP extra field definitions -----*/
  63. #if (!defined(VAXC) && !defined(_RMS_H) && !defined(__RMS_LOADED))
  64. struct XAB {                    /* This definition may be skipped */
  65.     unsigned char xab$b_cod;
  66.     unsigned char xab$b_bln;
  67.     short int xabdef$$_fill_1;
  68.     char *xab$l_nxt;
  69. };
  70. #endif /* !VAXC && !_RMS_H && !__RMS_LOADED */
  71. #define BC_MASK    07   /* 3 bits for compression type */
  72. #define BC_STORED  0    /* Stored */
  73. #define BC_00      1    /* 0byte -> 0bit compression */
  74. #define BC_DEFL    2    /* Deflated */
  75. /*
  76.  *  Extra record format
  77.  *  ===================
  78.  *  signature       (2 bytes)   = 'I','M'
  79.  *  size            (2 bytes)
  80.  *  block signature (4 bytes)
  81.  *  flags           (2 bytes)
  82.  *  uncomprssed size(2 bytes)
  83.  *  reserved        (4 bytes)
  84.  *  data            ((size-12) bytes)
  85.  *  ....
  86.  */
  87. struct IZ_block                 /* Extra field block header structure */
  88. {
  89.     ush sig;
  90.     ush size;
  91.     ulg bid;
  92.     ush flags;
  93.     ush length;
  94.     ulg reserved;
  95.     uch body[1];                /* The actual size is unknown */
  96. };
  97. /*
  98.  *   Extra field signature and block signatures
  99.  */
  100. #define IZ_SIGNATURE "IM"
  101. #define FABSIG  "VFAB"
  102. #define XALLSIG "VALL"
  103. #define XFHCSIG "VFHC"
  104. #define XDATSIG "VDAT"
  105. #define XRDTSIG "VRDT"
  106. #define XPROSIG "VPRO"
  107. #define XKEYSIG "VKEY"
  108. #define XNAMSIG "VNAM"
  109. #define VERSIG  "VMSV"
  110. /*
  111.  *   Block sizes
  112.  */
  113. #define FABL    (cc$rms_fab.fab$b_bln)
  114. #define RABL    (cc$rms_rab.rab$b_bln)
  115. #define XALLL   (cc$rms_xaball.xab$b_bln)
  116. #define XDATL   (cc$rms_xabdat.xab$b_bln)
  117. #define XFHCL   (cc$rms_xabfhc.xab$b_bln)
  118. #define XKEYL   (cc$rms_xabkey.xab$b_bln)
  119. #define XPROL   (cc$rms_xabpro.xab$b_bln)
  120. #define XRDTL   (cc$rms_xabrdt.xab$b_bln)
  121. #define XSUML   (cc$rms_xabsum.xab$b_bln)
  122. #define EXTBSL  4               /* Block signature length */
  123. #define RESL    8               /* Reserved 8 bytes */
  124. #define EXTHL   (EB_HEADSIZE+EXTBSL+RESL)
  125. typedef unsigned char byte;
  126. struct iosb
  127. {
  128.     ush status;
  129.     ush count;
  130.     ulg spec;
  131. };
  132. /*------------ PKWARE extra block definitions ----------*/
  133. /* Structure of PKWARE extra header */
  134. #ifdef VMS_ZIP
  135. #if defined(__DECC) || defined(__DECCXX)
  136. #pragma __nostandard
  137. #endif /* __DECC || __DECCXX */
  138. #if defined(__DECC) || defined(__DECCXX)
  139. #pragma __member_alignment __save
  140. #pragma __nomember_alignment
  141. #endif /* __DECC || __DECCXX */
  142. #ifdef VMS_ORIGINAL_PK_LAYOUT
  143. /*  The original order of ATR fields in the PKZIP VMS-extra field leads
  144.  *  to unaligned fields in the PK_info structure representing the
  145.  *  extra field layout.  When compiled for Alpha AXP, this results in
  146.  *  some performance (and code size) penalty.  It is not allowed to
  147.  *  apply structure padding, since this is explicitely forbidden in
  148.  *  the specification (APPNOTE.TXT) for the PK VMS extra field.
  149.  */
  150. struct PK_info
  151. {
  152.     ush tag_ra; ush len_ra;     byte ra[ATR$S_RECATTR];
  153.     ush tag_uc; ush len_uc;     byte uc[ATR$S_UCHAR];
  154.     ush tag_jr; ush len_jr;     byte jr[ATR$S_JOURNAL];
  155.     ush tag_cd; ush len_cd;     byte cd[ATR$S_CREDATE];
  156.     ush tag_rd; ush len_rd;     byte rd[ATR$S_REVDATE];
  157.     ush tag_ed; ush len_ed;     byte ed[ATR$S_EXPDATE];
  158.     ush tag_bd; ush len_bd;     byte bd[ATR$S_BAKDATE];
  159.     ush tag_rn; ush len_rn;     ush  rn;
  160.     ush tag_ui; ush len_ui;     byte ui[ATR$S_UIC];
  161.     ush tag_fp; ush len_fp;     byte fp[ATR$S_FPRO];
  162.     ush tag_rp; ush len_rp;     byte rp[ATR$S_RPRO];
  163. };
  164. #else /* !VMS_ORIGINAL_PK_LAYOUT */
  165. /*  The Info-ZIP support for the PK VMS extra field uses a reordered
  166.  *  field layout to achieve ``natural alignment'' of the PK_info structure
  167.  *  members whenever possible.  This rearrangement does not violate the
  168.  *  PK's VMS extra field specification and should not break any ``well
  169.  *  behaving'' (PK)Unzip utility. (`Well behaving' means that (PK)Unzip
  170.  *  should use the field tag to identify the ATR$ field rather than
  171.  *  assuming a fixed order of ATR$ fields in the PK VMS extra field.)
  172.  */
  173. struct PK_info
  174. {
  175.     ush tag_ra; ush len_ra;     byte ra[ATR$S_RECATTR];
  176.     ush tag_uc; ush len_uc;     byte uc[ATR$S_UCHAR];
  177.     ush tag_cd; ush len_cd;     byte cd[ATR$S_CREDATE];
  178.     ush tag_rd; ush len_rd;     byte rd[ATR$S_REVDATE];
  179.     ush tag_ed; ush len_ed;     byte ed[ATR$S_EXPDATE];
  180.     ush tag_bd; ush len_bd;     byte bd[ATR$S_BAKDATE];
  181.     ush tag_rn; ush len_rn;     ush  rn;
  182.     ush tag_ui; ush len_ui;     byte ui[ATR$S_UIC];
  183.     ush tag_fp; ush len_fp;     byte fp[ATR$S_FPRO];
  184.     ush tag_rp; ush len_rp;     byte rp[ATR$S_RPRO];
  185.     ush tag_jr; ush len_jr;     byte jr[ATR$S_JOURNAL];
  186. };
  187. #endif /* ?VMS_ORIGINAL_PK_LAYOUT */
  188. #if defined(__DECC) || defined(__DECCXX)
  189. #pragma __member_alignment __restore
  190. #endif /* __DECC || __DECCXX */
  191. #if defined(__DECC) || defined(__DECCXX)
  192. #pragma __standard
  193. #endif /* __DECC || __DECCXX */
  194. #endif /* VMS_ZIP */
  195. /* PKWARE "VMS" tag */
  196. #define PK_SIGNATURE        0x000C
  197. /* Total number of attributes to be saved */
  198. #define VMS_ATTR_COUNT  11
  199. #define VMS_MAX_ATRCNT  20
  200. struct PK_field
  201. {
  202.     ush         tag;
  203.     ush         size;
  204.     byte        value[1];
  205. };
  206. #define PK_FLDHDR_SIZE  4
  207. struct PK_header
  208. {
  209.     ush tag;
  210.     ush size;
  211.     ulg crc32;
  212.     byte data[1];
  213. };
  214. #define PK_HEADER_SIZE  8
  215. #ifdef VMS_ZIP
  216. /* File description structure for Zip low level I/O */
  217. struct ioctx
  218. {
  219.     struct iosb         iosb;
  220.     long                vbn;
  221.     long                size;
  222.     long                rest;
  223.     int                 status;
  224.     ush                 chan;
  225.     ush                 chan_pad;       /* alignment member */
  226.     long                acllen;
  227.     uch                 aclbuf[ATR$S_READACL];
  228.     struct PK_info      PKi;
  229. };
  230. #endif /* VMS_ZIP */
  231. #endif /* !__vms_h */